1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | #ifndef _LINUX_TASK_WORK_H |
3 | #define _LINUX_TASK_WORK_H |
4 | |
5 | #include <linux/list.h> |
6 | #include <linux/sched.h> |
7 | |
8 | typedef void (*task_work_func_t)(struct callback_head *); |
9 | |
10 | static inline void |
11 | init_task_work(struct callback_head *twork, task_work_func_t func) |
12 | { |
13 | twork->func = func; |
14 | } |
15 | |
16 | enum task_work_notify_mode { |
17 | TWA_NONE, |
18 | TWA_RESUME, |
19 | TWA_SIGNAL, |
20 | TWA_SIGNAL_NO_IPI, |
21 | }; |
22 | |
23 | static inline bool task_work_pending(struct task_struct *task) |
24 | { |
25 | return READ_ONCE(task->task_works); |
26 | } |
27 | |
28 | int task_work_add(struct task_struct *task, struct callback_head *twork, |
29 | enum task_work_notify_mode mode); |
30 | |
31 | struct callback_head *task_work_cancel_match(struct task_struct *task, |
32 | bool (*match)(struct callback_head *, void *data), void *data); |
33 | struct callback_head *task_work_cancel(struct task_struct *, task_work_func_t); |
34 | void task_work_run(void); |
35 | |
36 | static inline void exit_task_work(struct task_struct *task) |
37 | { |
38 | task_work_run(); |
39 | } |
40 | |
41 | #endif /* _LINUX_TASK_WORK_H */ |
42 | |