Re: io_uring vs CPU hotplug, was Re: [PATCH 5/9] blk-mq: don't set data->ctx and data->hctx in blk_mq_alloc_request_hctx
From: Thomas Gleixner <hidden>
Date: 2020-05-21 18:39:37
Also in:
io-uring, lkml
Ming, Ming Lei [off-list ref] writes:
On Thu, May 21, 2020 at 10:13:59AM +0200, Thomas Gleixner wrote:quoted
Ming Lei [off-list ref] writes:quoted
On Thu, May 21, 2020 at 12:14:18AM +0200, Thomas Gleixner wrote: - otherwise, the kthread just retries and retries to allocate & release, and sooner or later, its time slice is consumed, and migrated out, and the cpu hotplug handler will get chance to run and move on, then the cpu is shutdown.1) This is based on the assumption that the kthread is in the SCHED_OTHER scheduling class. Is that really a valid assumption?Given it is unlikely path, we can add msleep() before retrying when INACTIVE bit is observed by current thread, and this way can avoid spinning and should work for other schedulers.
That should work, but pretty is something else
quoted
2) What happens in the following scenario: unplug mq_offline set_ctx_inactive() drain_io() io_kthread() try_queue() wait_on_ctx() Can this happen and if so what will wake up that thread?drain_io() releases all tag of this hctx, then wait_on_ctx() will be waken up after any tag is released.
drain_io() is already done ...
So looking at that thread function:
static int io_sq_thread(void *data)
{
struct io_ring_ctx *ctx = data;
while (...) {
....
to_submit = io_sqring_entries(ctx);
--> preemption
hotplug runs
mq_offline()
set_ctx_inactive();
drain_io();
finished();
--> thread runs again
mutex_lock(&ctx->uring_lock);
ret = io_submit_sqes(ctx, to_submit, NULL, -1, true);
mutex_unlock(&ctx->uring_lock);
....
if (!to_submit || ret == -EBUSY)
...
wait_on_ctx();
Can this happen or did drain_io() already take care of the 'to_submit'
items and the call to io_submit_sqes() turns into a zero action ?
If the above happens then nothing will wake it up because the context
draining is done and finished.
Thanks,
tglx