Sebastian Andrzej Siewior 95da846592 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>
2020-09-30 20:32:33 -06:00
..
2020-09-23 14:32:23 -07:00
\n
2020-08-28 10:57:14 -07:00
2020-08-25 18:01:36 -07:00
\n
2020-08-06 19:28:26 -07:00
2020-06-05 14:05:57 -07:00
2020-09-05 10:04:53 -07:00
2020-08-11 17:42:24 +09:00
2020-08-23 17:36:59 -05:00
2020-07-27 14:29:23 -04:00
2020-08-03 13:01:22 -07:00
2020-08-23 17:36:59 -05:00
2020-08-04 21:02:38 -04:00
2020-06-05 16:26:36 -07:00
2020-07-31 08:16:01 +02:00
2020-08-07 11:33:24 -07:00
2020-07-31 08:17:51 +02:00
2020-05-14 16:44:24 +02:00
2020-08-12 10:58:01 -07:00
2020-07-31 08:16:00 +02:00
2020-06-02 19:45:12 -07:00
2020-06-09 15:40:50 -07:00
2020-07-31 08:16:01 +02:00