Jan Kara
4d4f11c356
rq-qos: fix missed wake-ups in rq_qos_throttle try two
...
commit 11c7aa0ddea8611007768d3e6b58d45dc60a19e1 upstream.
Commit 545fbd0775 ("rq-qos: fix missed wake-ups in rq_qos_throttle")
tried to fix a problem that a process could be sleeping in rq_qos_wait()
without anyone to wake it up. However the fix is not complete and the
following can still happen:
CPU1 (waiter1) CPU2 (waiter2) CPU3 (waker)
rq_qos_wait() rq_qos_wait()
acquire_inflight_cb() -> fails
acquire_inflight_cb() -> fails
completes IOs, inflight
decreased
prepare_to_wait_exclusive()
prepare_to_wait_exclusive()
has_sleeper = !wq_has_single_sleeper() -> true as there are two sleepers
has_sleeper = !wq_has_single_sleeper() -> true
io_schedule() io_schedule()
Deadlock as now there's nobody to wakeup the two waiters. The logic
automatically blocking when there are already sleepers is really subtle
and the only way to make it work reliably is that we check whether there
are some waiters in the queue when adding ourselves there. That way, we
are guaranteed that at least the first process to enter the wait queue
will recheck the waiting condition before going to sleep and thus
guarantee forward progress.
Fixes: 545fbd0775 ("rq-qos: fix missed wake-ups in rq_qos_throttle")
CC: stable@vger.kernel.org
Signed-off-by: Jan Kara <jack@suse.cz>
Link: https://lore.kernel.org/r/20210607112613.25344-1-jack@suse.cz
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2021-07-19 08:53:16 +02:00
..
partitions
docs: admin-guide: add a series of orphaned documents
2019-07-15 11:03:02 -03:00
badblocks.c
block: switch all files cleared marked as GPLv2 to SPDX tags
2019-04-30 16:11:57 -06:00
bfq-cgroup.c
bfq: fix blkio cgroup leakage v4
2020-09-03 11:26:54 +02:00
bfq-iosched.c
kyber: fix out of bounds access when preempted
2021-05-19 10:08:30 +02:00
bfq-iosched.h
bfq: fix blkio cgroup leakage v4
2020-09-03 11:26:54 +02:00
bfq-wf2q.c
bfq: fix blkio cgroup leakage v4
2020-09-03 11:26:54 +02:00
bio-integrity.c
block: release bip in a right way in error path
2020-07-16 08:16:36 +02:00
bio.c
block: only update parent bi_status when bio fail
2021-04-16 11:46:38 +02:00
blk-cgroup.c
blk-cgroup: Use cond_resched() when destroy blkgs
2021-02-13 13:52:56 +01:00
blk-core.c
Revert "Revert "block: end bio with BLK_STS_AGAIN in case of non-mq devs and REQ_NOWAIT""
2021-02-07 15:35:47 +01:00
blk-exec.c
block: add SPDX tags to block layer files missing licensing information
2019-04-30 16:12:03 -06:00
blk-flush.c
blk-mq: insert passthrough request into hctx->dispatch directly
2020-03-21 08:11:52 +01:00
blk-integrity.c
block: centralize PI remapping logic to the block layer
2019-09-17 20:03:49 -06:00
blk-ioc.c
block: Fix use-after-free issue accessing struct io_cq
2020-04-17 10:50:04 +02:00
blk-iocost.c
blk-iocost: ioc_pd_free() shouldn't assume irq disabled
2020-09-09 19:12:35 +02:00
blk-iolatency.c
blkcg: s/RQ_QOS_CGROUP/RQ_QOS_LATENCY/
2019-08-28 21:17:08 -06:00
blk-lib.c
blk-map.c
block: fix memleak when __blk_rq_map_user_iov() is failed
2020-01-12 12:21:43 +01:00
blk-merge.c
block: fix discard request merge
2021-07-14 16:53:19 +02:00
blk-mq-cpumap.c
blk-mq: balance mapping between present CPUs and queues
2019-08-04 21:43:12 -06:00
blk-mq-debugfs-zoned.c
block: Cleanup license notice
2019-01-17 21:21:40 -07:00
blk-mq-debugfs.c
blk-mq-debugfs: update blk_queue_flag_name[] accordingly for new flags
2020-07-22 09:32:52 +02:00
blk-mq-debugfs.h
blk-mq: no need to check return value of debugfs_create functions
2019-06-13 03:00:30 -06:00
blk-mq-pci.c
block: Fix blk_mq_*_map_queues() kernel-doc headers
2019-05-31 15:12:34 -06:00
blk-mq-rdma.c
block: Fix blk_mq_*_map_queues() kernel-doc headers
2019-05-31 15:12:34 -06:00
blk-mq-sched.c
kyber: fix out of bounds access when preempted
2021-05-19 10:08:30 +02:00
blk-mq-sched.h
block: only call sched requeue_request() for scheduled requests
2020-09-23 12:40:37 +02:00
blk-mq-sysfs.c
blk-mq: move cancel of hctx->run_work to the front of blk_exit_queue
2020-10-29 09:57:34 +01:00
blk-mq-tag.c
blk-mq: introduce blk_mq_tagset_wait_completed_request()
2019-08-04 21:41:29 -06:00
blk-mq-tag.h
blk-mq-virtio.c
block: Fix blk_mq_*_map_queues() kernel-doc headers
2019-05-31 15:12:34 -06:00
blk-mq.c
blk-mq: Swap two calls in blk_mq_exit_queue()
2021-05-19 10:08:30 +02:00
blk-mq.h
blk-mq: insert passthrough request into hctx->dispatch directly
2020-03-21 08:11:52 +01:00
blk-pm.c
scsi: block: Fix a race in the runtime power management code
2021-01-06 14:48:37 +01:00
blk-pm.h
blk-rq-qos.c
rq-qos: fix missed wake-ups in rq_qos_throttle try two
2021-07-19 08:53:16 +02:00
blk-rq-qos.h
block: fix race between adding/removing rq qos and normal IO
2021-07-14 16:53:18 +02:00
blk-settings.c
blk-settings: align max_sectors on "logical_block_size" boundary
2021-03-04 10:26:40 +01:00
blk-softirq.c
blk-stat.c
block: add SPDX tags to block layer files missing licensing information
2019-04-30 16:12:03 -06:00
blk-stat.h
blk-sysfs.c
blk-mq: move cancel of hctx->run_work to the front of blk_exit_queue
2020-10-29 09:57:34 +01:00
blk-throttle.c
block: make rq sector size accessible for block stats
2019-09-15 16:02:08 -06:00
blk-timeout.c
block: add SPDX tags to block layer files missing licensing information
2019-04-30 16:12:03 -06:00
blk-wbt.c
blk-wbt: make sure throttle is enabled properly
2021-07-14 16:53:25 +02:00
blk-wbt.h
blk-wbt: introduce a new disable state to prevent false positive by rwb_enabled()
2021-07-14 16:53:25 +02:00
blk-zoned.c
block: Simplify REQ_OP_ZONE_RESET_ALL handling
2020-12-30 11:50:54 +01:00
blk.h
block: fix memleak of bio integrity data
2020-01-26 10:01:09 +01:00
bounce.c
block: remove the i argument to bio_for_each_segment_all
2019-04-30 09:26:13 -06:00
bsg-lib.c
block: Fix the type of 'sts' in bsg_queue_rq()
2020-01-23 08:22:44 +01:00
bsg.c
bsg: free the request before return error code
2021-03-04 10:26:22 +01:00
cmdline-parser.c
compat_ioctl.c
compat_ioctl: block: handle BLKGETZONESZ/BLKGETNRZONES
2020-01-09 10:19:58 +01:00
elevator.c
block: Fix elv_support_iosched()
2019-10-14 13:54:09 -06:00
genhd.c
block: Suppress uevent for hidden device when removed
2021-03-30 14:35:23 +02:00
ioctl.c
block: add SPDX tags to block layer files missing licensing information
2019-04-30 16:12:03 -06:00
ioprio.c
docs: block: convert to ReST
2019-07-15 09:20:27 -03:00
Kconfig
blkcg: implement blk-iocost
2019-08-28 21:17:12 -06:00
Kconfig.iosched
docs: block: convert to ReST
2019-07-15 09:20:27 -03:00
kyber-iosched.c
kyber: fix out of bounds access when preempted
2021-05-19 10:08:30 +02:00
Makefile
blkcg: implement blk-iocost
2019-08-28 21:17:12 -06:00
mq-deadline.c
kyber: fix out of bounds access when preempted
2021-05-19 10:08:30 +02:00
opal_proto.h
block: sed-opal: Removed duplicate OPAL_METHOD_LENGTH definition
2019-08-20 09:34:49 -06:00
partition-generic.c
block: fix use-after-free on gendisk
2019-04-22 09:48:12 -06:00
scsi_ioctl.c
block: switch all files cleared marked as GPLv2 to SPDX tags
2019-04-30 16:11:57 -06:00
sed-opal.c
block: sed-opal: fix sparse warning: convert __be64 data
2019-10-03 14:21:32 -06:00
t10-pi.c
block: t10-pi: fix -Wswitch warning
2019-09-23 08:05:19 -06:00