xref: /linux-6.15/include/linux/task_work.h (revision 73ab05aa)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
2e73f8959SOleg Nesterov #ifndef _LINUX_TASK_WORK_H
3e73f8959SOleg Nesterov #define _LINUX_TASK_WORK_H
4e73f8959SOleg Nesterov 
5e73f8959SOleg Nesterov #include <linux/list.h>
6e73f8959SOleg Nesterov #include <linux/sched.h>
7e73f8959SOleg Nesterov 
867d12145SAl Viro typedef void (*task_work_func_t)(struct callback_head *);
9e73f8959SOleg Nesterov 
10e73f8959SOleg Nesterov static inline void
1167d12145SAl Viro init_task_work(struct callback_head *twork, task_work_func_t func)
12e73f8959SOleg Nesterov {
13e73f8959SOleg Nesterov 	twork->func = func;
14e73f8959SOleg Nesterov }
15e73f8959SOleg Nesterov 
1691989c70SJens Axboe enum task_work_notify_mode {
17*73ab05aaSWaiman Long 	TWA_NONE = 0,
1891989c70SJens Axboe 	TWA_RESUME,
1991989c70SJens Axboe 	TWA_SIGNAL,
20e788be95SJens Axboe 	TWA_SIGNAL_NO_IPI,
21466e4d80SSebastian Andrzej Siewior 	TWA_NMI_CURRENT,
22*73ab05aaSWaiman Long 
23*73ab05aaSWaiman Long 	TWA_FLAGS = 0xff00,
24*73ab05aaSWaiman Long 	TWAF_NO_ALLOC = 0x0100,
2591989c70SJens Axboe };
2691989c70SJens Axboe 
277f62d40dSEric W. Biederman static inline bool task_work_pending(struct task_struct *task)
287f62d40dSEric W. Biederman {
297f62d40dSEric W. Biederman 	return READ_ONCE(task->task_works);
307f62d40dSEric W. Biederman }
317f62d40dSEric W. Biederman 
3291989c70SJens Axboe int task_work_add(struct task_struct *task, struct callback_head *twork,
3391989c70SJens Axboe 			enum task_work_notify_mode mode);
34e91b4816SOleg Nesterov 
35c7aab1a7SJens Axboe struct callback_head *task_work_cancel_match(struct task_struct *task,
36c7aab1a7SJens Axboe 	bool (*match)(struct callback_head *, void *data), void *data);
3768cbd415SFrederic Weisbecker struct callback_head *task_work_cancel_func(struct task_struct *, task_work_func_t);
38f409530eSFrederic Weisbecker bool task_work_cancel(struct task_struct *task, struct callback_head *cb);
39e73f8959SOleg Nesterov void task_work_run(void);
40e73f8959SOleg Nesterov 
41e73f8959SOleg Nesterov static inline void exit_task_work(struct task_struct *task)
42e73f8959SOleg Nesterov {
43e73f8959SOleg Nesterov 	task_work_run();
44e73f8959SOleg Nesterov }
45e73f8959SOleg Nesterov 
46e73f8959SOleg Nesterov #endif	/* _LINUX_TASK_WORK_H */
47