1*e73f8959SOleg Nesterov #ifndef _LINUX_TASK_WORK_H 2*e73f8959SOleg Nesterov #define _LINUX_TASK_WORK_H 3*e73f8959SOleg Nesterov 4*e73f8959SOleg Nesterov #include <linux/list.h> 5*e73f8959SOleg Nesterov #include <linux/sched.h> 6*e73f8959SOleg Nesterov 7*e73f8959SOleg Nesterov struct task_work; 8*e73f8959SOleg Nesterov typedef void (*task_work_func_t)(struct task_work *); 9*e73f8959SOleg Nesterov 10*e73f8959SOleg Nesterov struct task_work { 11*e73f8959SOleg Nesterov struct hlist_node hlist; 12*e73f8959SOleg Nesterov task_work_func_t func; 13*e73f8959SOleg Nesterov void *data; 14*e73f8959SOleg Nesterov }; 15*e73f8959SOleg Nesterov 16*e73f8959SOleg Nesterov static inline void 17*e73f8959SOleg Nesterov init_task_work(struct task_work *twork, task_work_func_t func, void *data) 18*e73f8959SOleg Nesterov { 19*e73f8959SOleg Nesterov twork->func = func; 20*e73f8959SOleg Nesterov twork->data = data; 21*e73f8959SOleg Nesterov } 22*e73f8959SOleg Nesterov 23*e73f8959SOleg Nesterov int task_work_add(struct task_struct *task, struct task_work *twork, bool); 24*e73f8959SOleg Nesterov struct task_work *task_work_cancel(struct task_struct *, task_work_func_t); 25*e73f8959SOleg Nesterov void task_work_run(void); 26*e73f8959SOleg Nesterov 27*e73f8959SOleg Nesterov static inline void exit_task_work(struct task_struct *task) 28*e73f8959SOleg Nesterov { 29*e73f8959SOleg Nesterov if (unlikely(!hlist_empty(&task->task_works))) 30*e73f8959SOleg Nesterov task_work_run(); 31*e73f8959SOleg Nesterov } 32*e73f8959SOleg Nesterov 33*e73f8959SOleg Nesterov #endif /* _LINUX_TASK_WORK_H */ 34