Skip to content

Commit b898b8c

Browse files
committed
io_uring/sqpoll: wait on sqd->wait for thread parking
io_sqd_handle_event() just does a mutex unlock/lock dance when it's supposed to park, somewhat relying on full ordering with the thread trying to park it which does a similar unlock/lock dance on sqd->lock. However, with adaptive spinning on mutexes, this can waste an awful lot of time. Normally this isn't very noticeable, as parking and unparking the thread isn't a common (or fast path) occurence. However, in testing ring resizing, it's testing exactly that, as each resize will require the SQPOLL to safely park and unpark. Have io_sq_thread_park() explicitly wait on sqd->park_pending being zero before attempting to grab the sqd->lock again. In a resize test, this brings the runtime of SQPOLL down from about 60 seconds to a few seconds, just like the !SQPOLL tests. And saves a ton of spinning time on the mutex, on both sides. Signed-off-by: Jens Axboe <[email protected]>
1 parent 79cfe9e commit b898b8c

File tree

1 file changed

+2
-1
lines changed

1 file changed

+2
-1
lines changed

io_uring/sqpoll.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ void io_sq_thread_unpark(struct io_sq_data *sqd)
4040
if (atomic_dec_return(&sqd->park_pending))
4141
set_bit(IO_SQ_THREAD_SHOULD_PARK, &sqd->state);
4242
mutex_unlock(&sqd->lock);
43+
wake_up(&sqd->wait);
4344
}
4445

4546
void io_sq_thread_park(struct io_sq_data *sqd)
@@ -215,7 +216,7 @@ static bool io_sqd_handle_event(struct io_sq_data *sqd)
215216
mutex_unlock(&sqd->lock);
216217
if (signal_pending(current))
217218
did_sig = get_signal(&ksig);
218-
cond_resched();
219+
wait_event(sqd->wait, !atomic_read(&sqd->park_pending));
219220
mutex_lock(&sqd->lock);
220221
sqd->sq_cpu = raw_smp_processor_id();
221222
}

0 commit comments

Comments
 (0)