diff options
Diffstat (limited to 'include/linux/kthread.h')
| -rw-r--r-- | include/linux/kthread.h | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/include/linux/kthread.h b/include/linux/kthread.h index aabc8a13ba71..f93cb6979edc 100644 --- a/include/linux/kthread.h +++ b/include/linux/kthread.h | |||
| @@ -34,4 +34,68 @@ int kthread_should_stop(void); | |||
| 34 | int kthreadd(void *unused); | 34 | int kthreadd(void *unused); |
| 35 | extern struct task_struct *kthreadd_task; | 35 | extern struct task_struct *kthreadd_task; |
| 36 | 36 | ||
| 37 | /* | ||
| 38 | * Simple work processor based on kthread. | ||
| 39 | * | ||
| 40 | * This provides easier way to make use of kthreads. A kthread_work | ||
| 41 | * can be queued and flushed using queue/flush_kthread_work() | ||
| 42 | * respectively. Queued kthread_works are processed by a kthread | ||
| 43 | * running kthread_worker_fn(). | ||
| 44 | * | ||
| 45 | * A kthread_work can't be freed while it is executing. | ||
| 46 | */ | ||
| 47 | struct kthread_work; | ||
| 48 | typedef void (*kthread_work_func_t)(struct kthread_work *work); | ||
| 49 | |||
| 50 | struct kthread_worker { | ||
| 51 | spinlock_t lock; | ||
| 52 | struct list_head work_list; | ||
| 53 | struct task_struct *task; | ||
| 54 | }; | ||
| 55 | |||
| 56 | struct kthread_work { | ||
| 57 | struct list_head node; | ||
| 58 | kthread_work_func_t func; | ||
| 59 | wait_queue_head_t done; | ||
| 60 | atomic_t flushing; | ||
| 61 | int queue_seq; | ||
| 62 | int done_seq; | ||
| 63 | }; | ||
| 64 | |||
| 65 | #define KTHREAD_WORKER_INIT(worker) { \ | ||
| 66 | .lock = SPIN_LOCK_UNLOCKED, \ | ||
| 67 | .work_list = LIST_HEAD_INIT((worker).work_list), \ | ||
| 68 | } | ||
| 69 | |||
| 70 | #define KTHREAD_WORK_INIT(work, fn) { \ | ||
| 71 | .node = LIST_HEAD_INIT((work).node), \ | ||
| 72 | .func = (fn), \ | ||
| 73 | .done = __WAIT_QUEUE_HEAD_INITIALIZER((work).done), \ | ||
| 74 | .flushing = ATOMIC_INIT(0), \ | ||
| 75 | } | ||
| 76 | |||
| 77 | #define DEFINE_KTHREAD_WORKER(worker) \ | ||
| 78 | struct kthread_worker worker = KTHREAD_WORKER_INIT(worker) | ||
| 79 | |||
| 80 | #define DEFINE_KTHREAD_WORK(work, fn) \ | ||
| 81 | struct kthread_work work = KTHREAD_WORK_INIT(work, fn) | ||
| 82 | |||
| 83 | static inline void init_kthread_worker(struct kthread_worker *worker) | ||
| 84 | { | ||
| 85 | *worker = (struct kthread_worker)KTHREAD_WORKER_INIT(*worker); | ||
| 86 | } | ||
| 87 | |||
| 88 | static inline void init_kthread_work(struct kthread_work *work, | ||
| 89 | kthread_work_func_t fn) | ||
| 90 | { | ||
| 91 | *work = (struct kthread_work)KTHREAD_WORK_INIT(*work, fn); | ||
| 92 | } | ||
| 93 | |||
| 94 | int kthread_worker_fn(void *worker_ptr); | ||
| 95 | |||
| 96 | bool queue_kthread_work(struct kthread_worker *worker, | ||
| 97 | struct kthread_work *work); | ||
| 98 | void flush_kthread_work(struct kthread_work *work); | ||
| 99 | void flush_kthread_worker(struct kthread_worker *worker); | ||
| 100 | |||
| 37 | #endif /* _LINUX_KTHREAD_H */ | 101 | #endif /* _LINUX_KTHREAD_H */ |
