• Jens Axboe's avatar
    io_uring: fix race condition in task_work add and clear · 1d5f360d
    Jens Axboe authored
    We clear the bit marking the ctx task_work as active after having run
    the queued work, but we really should be clearing it before. Otherwise
    we can hit a tiny race ala:
    
    CPU0					CPU1
    io_task_work_add()			tctx_task_work()
    					run_work
    	add_to_list
    	test_and_set_bit
    					clear_bit
    		already set
    
    and CPU0 will return thinking the task_work is queued, while in reality
    it's already being run. If we hit the condition after __tctx_task_work()
    found no more work, but before we've cleared the bit, then we'll end up
    thinking it's queued and will be run. In reality it is queued, but we
    didn't queue the ctx task_work to ensure that it gets run.
    
    Fixes: 7cbf1722 ("io_uring: provide FIFO ordering for task_work")
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    1d5f360d
io_uring.c 241 KB