2 * Simple work processor based on kthread.
4 * This provides easier way to make use of kthreads. A kthread_work
5 * can be queued and flushed using queue/flush_kthread_work()
6 * respectively. Queued kthread_works are processed by a kthread
7 * running kthread_worker_fn().
9 * A kthread_work can't be freed while it is executing.
11 #ifndef BACKPORT_LINUX_KTHREAD_H
12 #define BACKPORT_LINUX_KTHREAD_H
14 #include <linux/version.h>
16 #include_next <linux/kthread.h>
18 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35))
21 typedef void (*kthread_work_func_t)(struct kthread_work *work);
23 struct kthread_worker {
25 struct list_head work_list;
26 struct task_struct *task;
30 struct list_head node;
31 kthread_work_func_t func;
32 wait_queue_head_t done;
38 #define KTHREAD_WORKER_INIT(worker) { \
39 .lock = __SPIN_LOCK_UNLOCKED((worker).lock), \
40 .work_list = LIST_HEAD_INIT((worker).work_list), \
43 #define KTHREAD_WORK_INIT(work, fn) { \
44 .node = LIST_HEAD_INIT((work).node), \
46 .done = __WAIT_QUEUE_HEAD_INITIALIZER((work).done), \
47 .flushing = ATOMIC_INIT(0), \
50 #define DEFINE_KTHREAD_WORKER(worker) \
51 struct kthread_worker worker = KTHREAD_WORKER_INIT(worker)
53 #define DEFINE_KTHREAD_WORK(work, fn) \
54 struct kthread_work work = KTHREAD_WORK_INIT(work, fn)
57 * kthread_worker.lock and kthread_work.done need their own lockdep class
58 * keys if they are defined on stack with lockdep enabled. Use the
59 * following macros when defining them on stack.
62 # define KTHREAD_WORKER_INIT_ONSTACK(worker) \
63 ({ init_kthread_worker(&worker); worker; })
64 # define DEFINE_KTHREAD_WORKER_ONSTACK(worker) \
65 struct kthread_worker worker = KTHREAD_WORKER_INIT_ONSTACK(worker)
66 # define KTHREAD_WORK_INIT_ONSTACK(work, fn) \
67 ({ init_kthread_work((&work), fn); work; })
68 # define DEFINE_KTHREAD_WORK_ONSTACK(work, fn) \
69 struct kthread_work work = KTHREAD_WORK_INIT_ONSTACK(work, fn)
71 # define DEFINE_KTHREAD_WORKER_ONSTACK(worker) DEFINE_KTHREAD_WORKER(worker)
72 # define DEFINE_KTHREAD_WORK_ONSTACK(work, fn) DEFINE_KTHREAD_WORK(work, fn)
75 extern void __init_kthread_worker(struct kthread_worker *worker,
76 const char *name, struct lock_class_key *key);
78 #define init_kthread_worker(worker) \
80 static struct lock_class_key __key; \
81 __init_kthread_worker((worker), "("#worker")->lock", &__key); \
84 #define init_kthread_work(work, fn) \
86 memset((work), 0, sizeof(struct kthread_work)); \
87 INIT_LIST_HEAD(&(work)->node); \
88 (work)->func = (fn); \
89 init_waitqueue_head(&(work)->done); \
92 int kthread_worker_fn(void *worker_ptr);
94 bool queue_kthread_work(struct kthread_worker *worker,
95 struct kthread_work *work);
96 void flush_kthread_work(struct kthread_work *work);
97 void flush_kthread_worker(struct kthread_worker *worker);
99 #endif /* LINUX_VERSION_CODE < 2.6.35 */
101 #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,38))
103 * Kernels between 2.6.36 and 2.6.38 have the above functions but still lack the
106 #define kthread_create_on_node(threadfn, data, node, namefmt, arg...) \
107 kthread_create(threadfn, data, namefmt, ##arg)
109 #endif /* LINUX_VERSION_CODE < 2.6.38 */
111 #endif /* _LINUX_KTHREAD_H */