Merge tag 'io_uring-5.8-2020-07-01' of git://git.kernel.dk/linux-block
Pull io_uring fixes from Jens Axboe: "One fix in here, for a regression in 5.7 where a task is waiting in the kernel for a condition, but that condition won't become true until task_work is run. And the task_work can't be run exactly because the task is waiting in the kernel, so we'll never make any progress. One example of that is registering an eventfd and queueing io_uring work, and then the task goes and waits in eventfd read with the expectation that it'll get woken (and read an event) when the io_uring request completes. The io_uring request is finished through task_work, which won't get run while the task is looping in eventfd read" * tag 'io_uring-5.8-2020-07-01' of git://git.kernel.dk/linux-block: io_uring: use signal based task_work running task_work: teach task_work_add() to do signal_wake_up()
This commit is contained in:
@@ -19,6 +19,7 @@ struct task_struct;
|
||||
#define JOBCTL_TRAPPING_BIT 21 /* switching to TRACED */
|
||||
#define JOBCTL_LISTENING_BIT 22 /* ptracer is listening for events */
|
||||
#define JOBCTL_TRAP_FREEZE_BIT 23 /* trap for cgroup freezer */
|
||||
#define JOBCTL_TASK_WORK_BIT 24 /* set by TWA_SIGNAL */
|
||||
|
||||
#define JOBCTL_STOP_DEQUEUED (1UL << JOBCTL_STOP_DEQUEUED_BIT)
|
||||
#define JOBCTL_STOP_PENDING (1UL << JOBCTL_STOP_PENDING_BIT)
|
||||
@@ -28,9 +29,10 @@ struct task_struct;
|
||||
#define JOBCTL_TRAPPING (1UL << JOBCTL_TRAPPING_BIT)
|
||||
#define JOBCTL_LISTENING (1UL << JOBCTL_LISTENING_BIT)
|
||||
#define JOBCTL_TRAP_FREEZE (1UL << JOBCTL_TRAP_FREEZE_BIT)
|
||||
#define JOBCTL_TASK_WORK (1UL << JOBCTL_TASK_WORK_BIT)
|
||||
|
||||
#define JOBCTL_TRAP_MASK (JOBCTL_TRAP_STOP | JOBCTL_TRAP_NOTIFY)
|
||||
#define JOBCTL_PENDING_MASK (JOBCTL_STOP_PENDING | JOBCTL_TRAP_MASK)
|
||||
#define JOBCTL_PENDING_MASK (JOBCTL_STOP_PENDING | JOBCTL_TRAP_MASK | JOBCTL_TASK_WORK)
|
||||
|
||||
extern bool task_set_jobctl_pending(struct task_struct *task, unsigned long mask);
|
||||
extern void task_clear_jobctl_trapping(struct task_struct *task);
|
||||
|
@@ -13,7 +13,10 @@ init_task_work(struct callback_head *twork, task_work_func_t func)
|
||||
twork->func = func;
|
||||
}
|
||||
|
||||
int task_work_add(struct task_struct *task, struct callback_head *twork, bool);
|
||||
#define TWA_RESUME 1
|
||||
#define TWA_SIGNAL 2
|
||||
int task_work_add(struct task_struct *task, struct callback_head *twork, int);
|
||||
|
||||
struct callback_head *task_work_cancel(struct task_struct *, task_work_func_t);
|
||||
void task_work_run(void);
|
||||
|
||||
|
Reference in New Issue
Block a user