diff options
author | Sebastian Andrzej Siewior <bigeasy@linutronix.de> | 2020-09-01 11:41:46 +0300 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2020-10-01 05:32:33 +0300 |
commit | 95da84659226d75698a1ab958be0af21d9cc2a9c (patch) | |
tree | 5208f538f3da430c7423adf20405e6f69de9eec4 /crypto | |
parent | 7e84e1c7566a1df470a9e1f49d3db2ce311261a4 (diff) | |
download | linux-95da84659226d75698a1ab958be0af21d9cc2a9c.tar.xz |
io_wq: Make io_wqe::lock a raw_spinlock_t
During a context switch the scheduler invokes wq_worker_sleeping() with
disabled preemption. Disabling preemption is needed because it protects
access to `worker->sleeping'. As an optimisation it avoids invoking
schedule() within the schedule path as part of possible wake up (thus
preempt_enable_no_resched() afterwards).
The io-wq has been added to the mix in the same section with disabled
preemption. This breaks on PREEMPT_RT because io_wq_worker_sleeping()
acquires a spinlock_t. Also within the schedule() the spinlock_t must be
acquired after tsk_is_pi_blocked() otherwise it will block on the
sleeping lock again while scheduling out.
While playing with `io_uring-bench' I didn't notice a significant
latency spike after converting io_wqe::lock to a raw_spinlock_t. The
latency was more or less the same.
In order to keep the spinlock_t it would have to be moved after the
tsk_is_pi_blocked() check which would introduce a branch instruction
into the hot path.
The lock is used to maintain the `work_list' and wakes one task up at
most.
Should io_wqe_cancel_pending_work() cause latency spikes, while
searching for a specific item, then it would need to drop the lock
during iterations.
revert_creds() is also invoked under the lock. According to debug
cred::non_rcu is 0. Otherwise it should be moved outside of the locked
section because put_cred_rcu()->free_uid() acquires a sleeping lock.
Convert io_wqe::lock to a raw_spinlock_t.c
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'crypto')
0 files changed, 0 insertions, 0 deletions