blob: 9faaccae570ee987f33fd2ce1a5438e5b7ef596a [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
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;
David Howells52bad642006-11-22 14:54:01 +000020};
21
22struct delayed_work {
23 struct work_struct work;
Linus Torvalds1da177e2005-04-16 15:20:36 -070024 struct timer_list timer;
25};
26
James Bottomley1fa44ec2006-02-23 12:43:43 -060027struct execute_work {
28 struct work_struct work;
29};
30
Linus Torvalds1da177e2005-04-16 15:20:36 -070031#define __WORK_INITIALIZER(n, f, d) { \
32 .entry = { &(n).entry, &(n).entry }, \
33 .func = (f), \
34 .data = (d), \
David Howells52bad642006-11-22 14:54:01 +000035 }
36
37#define __DELAYED_WORK_INITIALIZER(n, f, d) { \
38 .work = __WORK_INITIALIZER((n).work, (f), (d)), \
Linus Torvalds1da177e2005-04-16 15:20:36 -070039 .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
David Howells52bad642006-11-22 14:54:01 +000045#define DECLARE_DELAYED_WORK(n, f, d) \
46 struct delayed_work n = __DELAYED_WORK_INITIALIZER(n, f, d)
47
Linus Torvalds1da177e2005-04-16 15:20:36 -070048/*
David Howells52bad642006-11-22 14:54:01 +000049 * initialize a work item's function and data pointers
Linus Torvalds1da177e2005-04-16 15:20:36 -070050 */
51#define PREPARE_WORK(_work, _func, _data) \
52 do { \
David Howells52bad642006-11-22 14:54:01 +000053 (_work)->func = (_func); \
54 (_work)->data = (_data); \
Linus Torvalds1da177e2005-04-16 15:20:36 -070055 } while (0)
56
David Howells52bad642006-11-22 14:54:01 +000057#define PREPARE_DELAYED_WORK(_work, _func, _data) \
58 PREPARE_WORK(&(_work)->work, (_func), (_data))
59
Linus Torvalds1da177e2005-04-16 15:20:36 -070060/*
David Howells52bad642006-11-22 14:54:01 +000061 * initialize all of a work item in one go
Linus Torvalds1da177e2005-04-16 15:20:36 -070062 */
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)); \
David Howells52bad642006-11-22 14:54:01 +000068 } while (0)
69
70#define INIT_DELAYED_WORK(_work, _func, _data) \
71 do { \
72 INIT_WORK(&(_work)->work, (_func), (_data)); \
Linus Torvalds1da177e2005-04-16 15:20:36 -070073 init_timer(&(_work)->timer); \
74 } while (0)
75
David Howells52bad642006-11-22 14:54:01 +000076
Linus Torvalds1da177e2005-04-16 15:20:36 -070077extern 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));
David Howells52bad642006-11-22 14:54:01 +000085extern int FASTCALL(queue_delayed_work(struct workqueue_struct *wq, struct delayed_work *work, unsigned long delay));
Venkatesh Pallipadi7a6bc1c2006-06-28 13:50:33 -070086extern int queue_delayed_work_on(int cpu, struct workqueue_struct *wq,
David Howells52bad642006-11-22 14:54:01 +000087 struct delayed_work *work, unsigned long delay);
Linus Torvalds1da177e2005-04-16 15:20:36 -070088extern void FASTCALL(flush_workqueue(struct workqueue_struct *wq));
89
90extern int FASTCALL(schedule_work(struct work_struct *work));
David Howells52bad642006-11-22 14:54:01 +000091extern int FASTCALL(schedule_delayed_work(struct delayed_work *work, unsigned long delay));
Linus Torvalds1da177e2005-04-16 15:20:36 -070092
David Howells52bad642006-11-22 14:54:01 +000093extern int schedule_delayed_work_on(int cpu, struct delayed_work *work, unsigned long delay);
Christoph Lameter15316ba2006-01-08 01:00:43 -080094extern int schedule_on_each_cpu(void (*func)(void *info), void *info);
Linus Torvalds1da177e2005-04-16 15:20:36 -070095extern void flush_scheduled_work(void);
96extern int current_is_keventd(void);
97extern int keventd_up(void);
98
99extern void init_workqueues(void);
David Howells52bad642006-11-22 14:54:01 +0000100void cancel_rearming_delayed_work(struct delayed_work *work);
James Bottomley81ddef72005-04-16 15:23:59 -0700101void cancel_rearming_delayed_workqueue(struct workqueue_struct *,
David Howells52bad642006-11-22 14:54:01 +0000102 struct delayed_work *);
James Bottomley1fa44ec2006-02-23 12:43:43 -0600103int execute_in_process_context(void (*fn)(void *), void *,
104 struct execute_work *);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700105
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 */
David Howells52bad642006-11-22 14:54:01 +0000111static inline int cancel_delayed_work(struct delayed_work *work)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700112{
113 int ret;
114
115 ret = del_timer_sync(&work->timer);
116 if (ret)
David Howells52bad642006-11-22 14:54:01 +0000117 clear_bit(0, &work->work.pending);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700118 return ret;
119}
120
121#endif