mirror of
https://github.com/torvalds/linux
synced 2024-09-06 18:01:05 +00:00
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_domain(async_cookie_t cookie,
|
||||
struct async_domain *domain);
|
||||
extern bool current_is_async(void);
|
||||
#endif
|
||||
|
|
|
@ -57,6 +57,8 @@ asynchronous and synchronous parts of the kernel.
|
|||
#include <linux/slab.h>
|
||||
#include <linux/workqueue.h>
|
||||
|
||||
#include "workqueue_internal.h"
|
||||
|
||||
static async_cookie_t next_cookie = 1;
|
||||
|
||||
#define MAX_WORK 32768
|
||||
|
@ -337,3 +339,15 @@ void async_synchronize_cookie(async_cookie_t cookie)
|
|||
async_synchronize_cookie_domain(cookie, &async_running);
|
||||
}
|
||||
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
|
||||
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/kthread.h>
|
||||
|
||||
struct global_cwq;
|
||||
struct worker_pool;
|
||||
|
@ -44,6 +45,16 @@ struct worker {
|
|||
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
|
||||
* sched.c and workqueue.c.
|
||||
|
|
Loading…
Reference in a new issue