Commit 9f83e45eb54fc7198dc59fc63255341851ba4c48

Authored by Oleg Nesterov
Committed by Jens Axboe
1 parent 78bd4d484f

[PATCH] Fix current_io_context() vs set_task_ioprio() race

I know nothing about io scheduler, but I suspect set_task_ioprio() is not safe.

current_io_context() initializes "struct io_context", then sets ->io_context.
set_task_ioprio() running on another cpu may see the changes out of order, so
->set_ioprio(ioc) may use io_context which was not initialized properly.

Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru>
Signed-off-by: Jens Axboe <axboe@suse.de>

Showing 2 changed files with 5 additions and 0 deletions Side-by-side Diff

... ... @@ -3628,6 +3628,8 @@
3628 3628 ret->nr_batch_requests = 0; /* because this is 0 */
3629 3629 ret->aic = NULL;
3630 3630 ret->cic_root.rb_node = NULL;
  3631 + /* make sure set_task_ioprio() sees the settings above */
  3632 + smp_wmb();
3631 3633 tsk->io_context = ret;
3632 3634 }
3633 3635  
... ... @@ -44,6 +44,9 @@
44 44 task->ioprio = ioprio;
45 45  
46 46 ioc = task->io_context;
  47 + /* see wmb() in current_io_context() */
  48 + smp_read_barrier_depends();
  49 +
47 50 if (ioc && ioc->set_ioprio)
48 51 ioc->set_ioprio(ioc, ioprio);
49 52