xref: /openbmc/linux/include/linux/workqueue.h (revision 52bad64d)
11da177e4SLinus Torvalds /*
21da177e4SLinus Torvalds  * workqueue.h --- work queue handling for Linux.
31da177e4SLinus Torvalds  */
41da177e4SLinus Torvalds 
51da177e4SLinus Torvalds #ifndef _LINUX_WORKQUEUE_H
61da177e4SLinus Torvalds #define _LINUX_WORKQUEUE_H
71da177e4SLinus Torvalds 
81da177e4SLinus Torvalds #include <linux/timer.h>
91da177e4SLinus Torvalds #include <linux/linkage.h>
101da177e4SLinus Torvalds #include <linux/bitops.h>
111da177e4SLinus Torvalds 
121da177e4SLinus Torvalds struct workqueue_struct;
131da177e4SLinus Torvalds 
141da177e4SLinus Torvalds struct work_struct {
151da177e4SLinus Torvalds 	unsigned long pending;
161da177e4SLinus Torvalds 	struct list_head entry;
171da177e4SLinus Torvalds 	void (*func)(void *);
181da177e4SLinus Torvalds 	void *data;
191da177e4SLinus Torvalds 	void *wq_data;
2052bad64dSDavid Howells };
2152bad64dSDavid Howells 
2252bad64dSDavid Howells struct delayed_work {
2352bad64dSDavid Howells 	struct work_struct work;
241da177e4SLinus Torvalds 	struct timer_list timer;
251da177e4SLinus Torvalds };
261da177e4SLinus Torvalds 
271fa44ecaSJames Bottomley struct execute_work {
281fa44ecaSJames Bottomley 	struct work_struct work;
291fa44ecaSJames Bottomley };
301fa44ecaSJames Bottomley 
311da177e4SLinus Torvalds #define __WORK_INITIALIZER(n, f, d) {				\
321da177e4SLinus Torvalds         .entry	= { &(n).entry, &(n).entry },			\
331da177e4SLinus Torvalds 	.func = (f),						\
341da177e4SLinus Torvalds 	.data = (d),						\
3552bad64dSDavid Howells 	}
3652bad64dSDavid Howells 
3752bad64dSDavid Howells #define __DELAYED_WORK_INITIALIZER(n, f, d) {			\
3852bad64dSDavid Howells 	.work = __WORK_INITIALIZER((n).work, (f), (d)),		\
391da177e4SLinus Torvalds 	.timer = TIMER_INITIALIZER(NULL, 0, 0),			\
401da177e4SLinus Torvalds 	}
411da177e4SLinus Torvalds 
421da177e4SLinus Torvalds #define DECLARE_WORK(n, f, d)					\
431da177e4SLinus Torvalds 	struct work_struct n = __WORK_INITIALIZER(n, f, d)
441da177e4SLinus Torvalds 
4552bad64dSDavid Howells #define DECLARE_DELAYED_WORK(n, f, d)				\
4652bad64dSDavid Howells 	struct delayed_work n = __DELAYED_WORK_INITIALIZER(n, f, d)
4752bad64dSDavid Howells 
481da177e4SLinus Torvalds /*
4952bad64dSDavid Howells  * initialize a work item's function and data pointers
501da177e4SLinus Torvalds  */
511da177e4SLinus Torvalds #define PREPARE_WORK(_work, _func, _data)			\
521da177e4SLinus Torvalds 	do {							\
5352bad64dSDavid Howells 		(_work)->func = (_func);			\
5452bad64dSDavid Howells 		(_work)->data = (_data);			\
551da177e4SLinus Torvalds 	} while (0)
561da177e4SLinus Torvalds 
5752bad64dSDavid Howells #define PREPARE_DELAYED_WORK(_work, _func, _data)		\
5852bad64dSDavid Howells 	PREPARE_WORK(&(_work)->work, (_func), (_data))
5952bad64dSDavid Howells 
601da177e4SLinus Torvalds /*
6152bad64dSDavid Howells  * initialize all of a work item in one go
621da177e4SLinus Torvalds  */
631da177e4SLinus Torvalds #define INIT_WORK(_work, _func, _data)				\
641da177e4SLinus Torvalds 	do {							\
651da177e4SLinus Torvalds 		INIT_LIST_HEAD(&(_work)->entry);		\
661da177e4SLinus Torvalds 		(_work)->pending = 0;				\
671da177e4SLinus Torvalds 		PREPARE_WORK((_work), (_func), (_data));	\
6852bad64dSDavid Howells 	} while (0)
6952bad64dSDavid Howells 
7052bad64dSDavid Howells #define INIT_DELAYED_WORK(_work, _func, _data)		\
7152bad64dSDavid Howells 	do {							\
7252bad64dSDavid Howells 		INIT_WORK(&(_work)->work, (_func), (_data));	\
731da177e4SLinus Torvalds 		init_timer(&(_work)->timer);			\
741da177e4SLinus Torvalds 	} while (0)
751da177e4SLinus Torvalds 
7652bad64dSDavid Howells 
771da177e4SLinus Torvalds extern struct workqueue_struct *__create_workqueue(const char *name,
781da177e4SLinus Torvalds 						    int singlethread);
791da177e4SLinus Torvalds #define create_workqueue(name) __create_workqueue((name), 0)
801da177e4SLinus Torvalds #define create_singlethread_workqueue(name) __create_workqueue((name), 1)
811da177e4SLinus Torvalds 
821da177e4SLinus Torvalds extern void destroy_workqueue(struct workqueue_struct *wq);
831da177e4SLinus Torvalds 
841da177e4SLinus Torvalds extern int FASTCALL(queue_work(struct workqueue_struct *wq, struct work_struct *work));
8552bad64dSDavid Howells extern int FASTCALL(queue_delayed_work(struct workqueue_struct *wq, struct delayed_work *work, unsigned long delay));
867a6bc1cdSVenkatesh Pallipadi extern int queue_delayed_work_on(int cpu, struct workqueue_struct *wq,
8752bad64dSDavid Howells 	struct delayed_work *work, unsigned long delay);
881da177e4SLinus Torvalds extern void FASTCALL(flush_workqueue(struct workqueue_struct *wq));
891da177e4SLinus Torvalds 
901da177e4SLinus Torvalds extern int FASTCALL(schedule_work(struct work_struct *work));
9152bad64dSDavid Howells extern int FASTCALL(schedule_delayed_work(struct delayed_work *work, unsigned long delay));
921da177e4SLinus Torvalds 
9352bad64dSDavid Howells extern int schedule_delayed_work_on(int cpu, struct delayed_work *work, unsigned long delay);
9415316ba8SChristoph Lameter extern int schedule_on_each_cpu(void (*func)(void *info), void *info);
951da177e4SLinus Torvalds extern void flush_scheduled_work(void);
961da177e4SLinus Torvalds extern int current_is_keventd(void);
971da177e4SLinus Torvalds extern int keventd_up(void);
981da177e4SLinus Torvalds 
991da177e4SLinus Torvalds extern void init_workqueues(void);
10052bad64dSDavid Howells void cancel_rearming_delayed_work(struct delayed_work *work);
10181ddef77SJames Bottomley void cancel_rearming_delayed_workqueue(struct workqueue_struct *,
10252bad64dSDavid Howells 				       struct delayed_work *);
1031fa44ecaSJames Bottomley int execute_in_process_context(void (*fn)(void *), void *,
1041fa44ecaSJames Bottomley 			       struct execute_work *);
1051da177e4SLinus Torvalds 
1061da177e4SLinus Torvalds /*
1071da177e4SLinus Torvalds  * Kill off a pending schedule_delayed_work().  Note that the work callback
1081da177e4SLinus Torvalds  * function may still be running on return from cancel_delayed_work().  Run
1091da177e4SLinus Torvalds  * flush_scheduled_work() to wait on it.
1101da177e4SLinus Torvalds  */
11152bad64dSDavid Howells static inline int cancel_delayed_work(struct delayed_work *work)
1121da177e4SLinus Torvalds {
1131da177e4SLinus Torvalds 	int ret;
1141da177e4SLinus Torvalds 
1151da177e4SLinus Torvalds 	ret = del_timer_sync(&work->timer);
1161da177e4SLinus Torvalds 	if (ret)
11752bad64dSDavid Howells 		clear_bit(0, &work->work.pending);
1181da177e4SLinus Torvalds 	return ret;
1191da177e4SLinus Torvalds }
1201da177e4SLinus Torvalds 
1211da177e4SLinus Torvalds #endif
122