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