xref: /openbmc/linux/include/linux/workqueue.h (revision 6bb49e59)
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 
146bb49e59SDavid Howells typedef void (*work_func_t)(void *data);
156bb49e59SDavid Howells 
161da177e4SLinus Torvalds struct work_struct {
171da177e4SLinus Torvalds 	unsigned long pending;
181da177e4SLinus Torvalds 	struct list_head entry;
196bb49e59SDavid Howells 	work_func_t func;
201da177e4SLinus Torvalds 	void *data;
211da177e4SLinus Torvalds 	void *wq_data;
2252bad64dSDavid Howells };
2352bad64dSDavid Howells 
2452bad64dSDavid Howells struct delayed_work {
2552bad64dSDavid Howells 	struct work_struct work;
261da177e4SLinus Torvalds 	struct timer_list timer;
271da177e4SLinus Torvalds };
281da177e4SLinus Torvalds 
291fa44ecaSJames Bottomley struct execute_work {
301fa44ecaSJames Bottomley 	struct work_struct work;
311fa44ecaSJames Bottomley };
321fa44ecaSJames Bottomley 
331da177e4SLinus Torvalds #define __WORK_INITIALIZER(n, f, d) {				\
341da177e4SLinus Torvalds         .entry	= { &(n).entry, &(n).entry },			\
351da177e4SLinus Torvalds 	.func = (f),						\
361da177e4SLinus Torvalds 	.data = (d),						\
3752bad64dSDavid Howells 	}
3852bad64dSDavid Howells 
3952bad64dSDavid Howells #define __DELAYED_WORK_INITIALIZER(n, f, d) {			\
4052bad64dSDavid Howells 	.work = __WORK_INITIALIZER((n).work, (f), (d)),		\
411da177e4SLinus Torvalds 	.timer = TIMER_INITIALIZER(NULL, 0, 0),			\
421da177e4SLinus Torvalds 	}
431da177e4SLinus Torvalds 
441da177e4SLinus Torvalds #define DECLARE_WORK(n, f, d)					\
451da177e4SLinus Torvalds 	struct work_struct n = __WORK_INITIALIZER(n, f, d)
461da177e4SLinus Torvalds 
4752bad64dSDavid Howells #define DECLARE_DELAYED_WORK(n, f, d)				\
4852bad64dSDavid Howells 	struct delayed_work n = __DELAYED_WORK_INITIALIZER(n, f, d)
4952bad64dSDavid Howells 
501da177e4SLinus Torvalds /*
5152bad64dSDavid Howells  * initialize a work item's function and data pointers
521da177e4SLinus Torvalds  */
531da177e4SLinus Torvalds #define PREPARE_WORK(_work, _func, _data)			\
541da177e4SLinus Torvalds 	do {							\
5552bad64dSDavid Howells 		(_work)->func = (_func);			\
5652bad64dSDavid Howells 		(_work)->data = (_data);			\
571da177e4SLinus Torvalds 	} while (0)
581da177e4SLinus Torvalds 
5952bad64dSDavid Howells #define PREPARE_DELAYED_WORK(_work, _func, _data)		\
6052bad64dSDavid Howells 	PREPARE_WORK(&(_work)->work, (_func), (_data))
6152bad64dSDavid Howells 
621da177e4SLinus Torvalds /*
6352bad64dSDavid Howells  * initialize all of a work item in one go
641da177e4SLinus Torvalds  */
651da177e4SLinus Torvalds #define INIT_WORK(_work, _func, _data)				\
661da177e4SLinus Torvalds 	do {							\
671da177e4SLinus Torvalds 		INIT_LIST_HEAD(&(_work)->entry);		\
681da177e4SLinus Torvalds 		(_work)->pending = 0;				\
691da177e4SLinus Torvalds 		PREPARE_WORK((_work), (_func), (_data));	\
7052bad64dSDavid Howells 	} while (0)
7152bad64dSDavid Howells 
7252bad64dSDavid Howells #define INIT_DELAYED_WORK(_work, _func, _data)		\
7352bad64dSDavid Howells 	do {							\
7452bad64dSDavid Howells 		INIT_WORK(&(_work)->work, (_func), (_data));	\
751da177e4SLinus Torvalds 		init_timer(&(_work)->timer);			\
761da177e4SLinus Torvalds 	} while (0)
771da177e4SLinus Torvalds 
7852bad64dSDavid Howells 
791da177e4SLinus Torvalds extern struct workqueue_struct *__create_workqueue(const char *name,
801da177e4SLinus Torvalds 						    int singlethread);
811da177e4SLinus Torvalds #define create_workqueue(name) __create_workqueue((name), 0)
821da177e4SLinus Torvalds #define create_singlethread_workqueue(name) __create_workqueue((name), 1)
831da177e4SLinus Torvalds 
841da177e4SLinus Torvalds extern void destroy_workqueue(struct workqueue_struct *wq);
851da177e4SLinus Torvalds 
861da177e4SLinus Torvalds extern int FASTCALL(queue_work(struct workqueue_struct *wq, struct work_struct *work));
8752bad64dSDavid Howells extern int FASTCALL(queue_delayed_work(struct workqueue_struct *wq, struct delayed_work *work, unsigned long delay));
887a6bc1cdSVenkatesh Pallipadi extern int queue_delayed_work_on(int cpu, struct workqueue_struct *wq,
8952bad64dSDavid Howells 	struct delayed_work *work, unsigned long delay);
901da177e4SLinus Torvalds extern void FASTCALL(flush_workqueue(struct workqueue_struct *wq));
911da177e4SLinus Torvalds 
921da177e4SLinus Torvalds extern int FASTCALL(schedule_work(struct work_struct *work));
9352bad64dSDavid Howells extern int FASTCALL(schedule_delayed_work(struct delayed_work *work, unsigned long delay));
941da177e4SLinus Torvalds 
9552bad64dSDavid Howells extern int schedule_delayed_work_on(int cpu, struct delayed_work *work, unsigned long delay);
966bb49e59SDavid Howells extern int schedule_on_each_cpu(work_func_t func, void *info);
971da177e4SLinus Torvalds extern void flush_scheduled_work(void);
981da177e4SLinus Torvalds extern int current_is_keventd(void);
991da177e4SLinus Torvalds extern int keventd_up(void);
1001da177e4SLinus Torvalds 
1011da177e4SLinus Torvalds extern void init_workqueues(void);
10252bad64dSDavid Howells void cancel_rearming_delayed_work(struct delayed_work *work);
10381ddef77SJames Bottomley void cancel_rearming_delayed_workqueue(struct workqueue_struct *,
10452bad64dSDavid Howells 				       struct delayed_work *);
1056bb49e59SDavid Howells int execute_in_process_context(work_func_t fn, void *, struct execute_work *);
1061da177e4SLinus Torvalds 
1071da177e4SLinus Torvalds /*
1081da177e4SLinus Torvalds  * Kill off a pending schedule_delayed_work().  Note that the work callback
1091da177e4SLinus Torvalds  * function may still be running on return from cancel_delayed_work().  Run
1101da177e4SLinus Torvalds  * flush_scheduled_work() to wait on it.
1111da177e4SLinus Torvalds  */
11252bad64dSDavid Howells static inline int cancel_delayed_work(struct delayed_work *work)
1131da177e4SLinus Torvalds {
1141da177e4SLinus Torvalds 	int ret;
1151da177e4SLinus Torvalds 
1161da177e4SLinus Torvalds 	ret = del_timer_sync(&work->timer);
1171da177e4SLinus Torvalds 	if (ret)
11852bad64dSDavid Howells 		clear_bit(0, &work->work.pending);
1191da177e4SLinus Torvalds 	return ret;
1201da177e4SLinus Torvalds }
1211da177e4SLinus Torvalds 
1221da177e4SLinus Torvalds #endif
123