workqueue: implement current_is_async()
This function queries whether %current is an async worker executing an async item. This will be used to implement warning on synchronous request_module() from async workers. Signed-off-by: Tejun Heo <tj@kernel.org>
This commit is contained in:
parent
2eaebdb33e
commit
84b233adcc
|
@ -52,4 +52,5 @@ extern void async_synchronize_full_domain(struct async_domain *domain);
|
||||||
extern void async_synchronize_cookie(async_cookie_t cookie);
|
extern void async_synchronize_cookie(async_cookie_t cookie);
|
||||||
extern void async_synchronize_cookie_domain(async_cookie_t cookie,
|
extern void async_synchronize_cookie_domain(async_cookie_t cookie,
|
||||||
struct async_domain *domain);
|
struct async_domain *domain);
|
||||||
|
extern bool current_is_async(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -57,6 +57,8 @@ asynchronous and synchronous parts of the kernel.
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/workqueue.h>
|
#include <linux/workqueue.h>
|
||||||
|
|
||||||
|
#include "workqueue_internal.h"
|
||||||
|
|
||||||
static async_cookie_t next_cookie = 1;
|
static async_cookie_t next_cookie = 1;
|
||||||
|
|
||||||
#define MAX_WORK 32768
|
#define MAX_WORK 32768
|
||||||
|
@ -337,3 +339,15 @@ void async_synchronize_cookie(async_cookie_t cookie)
|
||||||
async_synchronize_cookie_domain(cookie, &async_running);
|
async_synchronize_cookie_domain(cookie, &async_running);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(async_synchronize_cookie);
|
EXPORT_SYMBOL_GPL(async_synchronize_cookie);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* current_is_async - is %current an async worker task?
|
||||||
|
*
|
||||||
|
* Returns %true if %current is an async worker task.
|
||||||
|
*/
|
||||||
|
bool current_is_async(void)
|
||||||
|
{
|
||||||
|
struct worker *worker = current_wq_worker();
|
||||||
|
|
||||||
|
return worker && worker->current_func == async_run_entry_fn;
|
||||||
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#define _KERNEL_WORKQUEUE_INTERNAL_H
|
#define _KERNEL_WORKQUEUE_INTERNAL_H
|
||||||
|
|
||||||
#include <linux/workqueue.h>
|
#include <linux/workqueue.h>
|
||||||
|
#include <linux/kthread.h>
|
||||||
|
|
||||||
struct global_cwq;
|
struct global_cwq;
|
||||||
struct worker_pool;
|
struct worker_pool;
|
||||||
|
@ -44,6 +45,16 @@ struct worker {
|
||||||
struct workqueue_struct *rescue_wq; /* I: the workqueue to rescue */
|
struct workqueue_struct *rescue_wq; /* I: the workqueue to rescue */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* current_wq_worker - return struct worker if %current is a workqueue worker
|
||||||
|
*/
|
||||||
|
static inline struct worker *current_wq_worker(void)
|
||||||
|
{
|
||||||
|
if (current->flags & PF_WQ_WORKER)
|
||||||
|
return kthread_data(current);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Scheduler hooks for concurrency managed workqueue. Only to be used from
|
* Scheduler hooks for concurrency managed workqueue. Only to be used from
|
||||||
* sched.c and workqueue.c.
|
* sched.c and workqueue.c.
|
||||||
|
|
Loading…
Reference in New Issue