• X
    io_uring: refactor io_sq_thread() handling · 08369246
    Xiaoguang Wang 提交于
    There are some issues about current io_sq_thread() implementation:
      1. The prepare_to_wait() usage in __io_sq_thread() is weird. If
    multiple ctxs share one same poll thread, one ctx will put poll thread
    in TASK_INTERRUPTIBLE, but if other ctxs have work to do, we don't
    need to change task's stat at all. I think only if all ctxs don't have
    work to do, we can do it.
      2. We use round-robin strategy to make multiple ctxs share one same
    poll thread, but there are various condition in __io_sq_thread(), which
    seems complicated and may affect round-robin strategy.
    
    To improve above issues, I take below actions:
      1. If multiple ctxs share one same poll thread, only if all all ctxs
    don't have work to do, we can call prepare_to_wait() and schedule() to
    make poll thread enter sleep state.
      2. To make round-robin strategy more straight, I simplify
    __io_sq_thread() a bit, it just does io poll and sqes submit work once,
    does not check various condition.
      3. For multiple ctxs share one same poll thread, we choose the biggest
    sq_thread_idle among these ctxs as timeout condition, and will update
    it when ctx is in or out.
      4. Not need to check EBUSY especially, if io_submit_sqes() returns
    EBUSY, IORING_SQ_CQ_OVERFLOW should be set, helper in liburing should
    be aware of cq overflow and enters kernel to flush work.
    Signed-off-by: NXiaoguang Wang <xiaoguang.wang@linux.alibaba.com>
    Signed-off-by: NJens Axboe <axboe@kernel.dk>
    08369246
io_uring.c 237.7 KB