]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - include/linux/workqueue.h
WorkStruct: Separate delayable and non-delayable events.
[mirror_ubuntu-bionic-kernel.git] / include / linux / workqueue.h
CommitLineData
1da177e4
LT
1/*
2 * workqueue.h --- work queue handling for Linux.
3 */
4
5#ifndef _LINUX_WORKQUEUE_H
6#define _LINUX_WORKQUEUE_H
7
8#include <linux/timer.h>
9#include <linux/linkage.h>
10#include <linux/bitops.h>
11
12struct workqueue_struct;
13
14struct work_struct {
15 unsigned long pending;
16 struct list_head entry;
17 void (*func)(void *);
18 void *data;
19 void *wq_data;
52bad64d
DH
20};
21
22struct delayed_work {
23 struct work_struct work;
1da177e4
LT
24 struct timer_list timer;
25};
26
1fa44eca
JB
27struct execute_work {
28 struct work_struct work;
29};
30
1da177e4
LT
31#define __WORK_INITIALIZER(n, f, d) { \
32 .entry = { &(n).entry, &(n).entry }, \
33 .func = (f), \
34 .data = (d), \
52bad64d
DH
35 }
36
37#define __DELAYED_WORK_INITIALIZER(n, f, d) { \
38 .work = __WORK_INITIALIZER((n).work, (f), (d)), \
1da177e4
LT
39 .timer = TIMER_INITIALIZER(NULL, 0, 0), \
40 }
41
42#define DECLARE_WORK(n, f, d) \
43 struct work_struct n = __WORK_INITIALIZER(n, f, d)
44
52bad64d
DH
45#define DECLARE_DELAYED_WORK(n, f, d) \
46 struct delayed_work n = __DELAYED_WORK_INITIALIZER(n, f, d)
47
1da177e4 48/*
52bad64d 49 * initialize a work item's function and data pointers
1da177e4
LT
50 */
51#define PREPARE_WORK(_work, _func, _data) \
52 do { \
52bad64d
DH
53 (_work)->func = (_func); \
54 (_work)->data = (_data); \
1da177e4
LT
55 } while (0)
56
52bad64d
DH
57#define PREPARE_DELAYED_WORK(_work, _func, _data) \
58 PREPARE_WORK(&(_work)->work, (_func), (_data))
59
1da177e4 60/*
52bad64d 61 * initialize all of a work item in one go
1da177e4
LT
62 */
63#define INIT_WORK(_work, _func, _data) \
64 do { \
65 INIT_LIST_HEAD(&(_work)->entry); \
66 (_work)->pending = 0; \
67 PREPARE_WORK((_work), (_func), (_data)); \
52bad64d
DH
68 } while (0)
69
70#define INIT_DELAYED_WORK(_work, _func, _data) \
71 do { \
72 INIT_WORK(&(_work)->work, (_func), (_data)); \
1da177e4
LT
73 init_timer(&(_work)->timer); \
74 } while (0)
75
52bad64d 76
1da177e4
LT
77extern struct workqueue_struct *__create_workqueue(const char *name,
78 int singlethread);
79#define create_workqueue(name) __create_workqueue((name), 0)
80#define create_singlethread_workqueue(name) __create_workqueue((name), 1)
81
82extern void destroy_workqueue(struct workqueue_struct *wq);
83
84extern int FASTCALL(queue_work(struct workqueue_struct *wq, struct work_struct *work));
52bad64d 85extern int FASTCALL(queue_delayed_work(struct workqueue_struct *wq, struct delayed_work *work, unsigned long delay));
7a6bc1cd 86extern int queue_delayed_work_on(int cpu, struct workqueue_struct *wq,
52bad64d 87 struct delayed_work *work, unsigned long delay);
1da177e4
LT
88extern void FASTCALL(flush_workqueue(struct workqueue_struct *wq));
89
90extern int FASTCALL(schedule_work(struct work_struct *work));
52bad64d 91extern int FASTCALL(schedule_delayed_work(struct delayed_work *work, unsigned long delay));
1da177e4 92
52bad64d 93extern int schedule_delayed_work_on(int cpu, struct delayed_work *work, unsigned long delay);
15316ba8 94extern int schedule_on_each_cpu(void (*func)(void *info), void *info);
1da177e4
LT
95extern void flush_scheduled_work(void);
96extern int current_is_keventd(void);
97extern int keventd_up(void);
98
99extern void init_workqueues(void);
52bad64d 100void cancel_rearming_delayed_work(struct delayed_work *work);
81ddef77 101void cancel_rearming_delayed_workqueue(struct workqueue_struct *,
52bad64d 102 struct delayed_work *);
1fa44eca
JB
103int execute_in_process_context(void (*fn)(void *), void *,
104 struct execute_work *);
1da177e4
LT
105
106/*
107 * Kill off a pending schedule_delayed_work(). Note that the work callback
108 * function may still be running on return from cancel_delayed_work(). Run
109 * flush_scheduled_work() to wait on it.
110 */
52bad64d 111static inline int cancel_delayed_work(struct delayed_work *work)
1da177e4
LT
112{
113 int ret;
114
115 ret = del_timer_sync(&work->timer);
116 if (ret)
52bad64d 117 clear_bit(0, &work->work.pending);
1da177e4
LT
118 return ret;
119}
120
121#endif