kernel_samsung_a53x/block
Muchun Song e9ab785723 block: fix ordering between checking BLK_MQ_S_STOPPED request adding
commit 96a9fe64bfd486ebeeacf1e6011801ffe89dae18 upstream.

Supposing first scenario with a virtio_blk driver.

CPU0                        CPU1

blk_mq_try_issue_directly()
  __blk_mq_issue_directly()
    q->mq_ops->queue_rq()
      virtio_queue_rq()
        blk_mq_stop_hw_queue()
                            virtblk_done()
  blk_mq_request_bypass_insert()  1) store
                              blk_mq_start_stopped_hw_queue()
                                clear_bit(BLK_MQ_S_STOPPED)       3) store
                                blk_mq_run_hw_queue()
                                  if (!blk_mq_hctx_has_pending()) 4) load
                                    return
                                  blk_mq_sched_dispatch_requests()
  blk_mq_run_hw_queue()
    if (!blk_mq_hctx_has_pending())
      return
    blk_mq_sched_dispatch_requests()
      if (blk_mq_hctx_stopped())  2) load
        return
      __blk_mq_sched_dispatch_requests()

Supposing another scenario.

CPU0                        CPU1

blk_mq_requeue_work()
  blk_mq_insert_request() 1) store
                            virtblk_done()
                              blk_mq_start_stopped_hw_queue()
  blk_mq_run_hw_queues()        clear_bit(BLK_MQ_S_STOPPED)       3) store
                                blk_mq_run_hw_queue()
                                  if (!blk_mq_hctx_has_pending()) 4) load
                                    return
                                  blk_mq_sched_dispatch_requests()
    if (blk_mq_hctx_stopped())  2) load
      continue
    blk_mq_run_hw_queue()

Both scenarios are similar, the full memory barrier should be inserted
between 1) and 2), as well as between 3) and 4) to make sure that either
CPU0 sees BLK_MQ_S_STOPPED is cleared or CPU1 sees dispatch list.
Otherwise, either CPU will not rerun the hardware queue causing
starvation of the request.

The easy way to fix it is to add the essential full memory barrier into
helper of blk_mq_hctx_stopped(). In order to not affect the fast path
(hardware queue is not stopped most of the time), we only insert the
barrier into the slow path. Actually, only slow path needs to care about
missing of dispatching the request to the low-level device driver.

Fixes: 320ae51feed5 ("blk-mq: new multi-queue block IO queueing mechanism")
Cc: stable@vger.kernel.org
Cc: Muchun Song <muchun.song@linux.dev>
Signed-off-by: Muchun Song <songmuchun@bytedance.com>
Reviewed-by: Ming Lei <ming.lei@redhat.com>
Link: https://lore.kernel.org/r/20241014092934.53630-4-songmuchun@bytedance.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2024-12-17 13:24:19 +01:00
..
partitions Revert "block: print symbolic error name instead of error code" 2024-11-24 00:23:28 +01:00
badblocks.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
bfq-cgroup.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
bfq-iosched.c Revert "block, bfq: fix possible UAF for bfqq->bic with merge chain" 2024-11-24 00:23:28 +01:00
bfq-iosched.h block, bfq: save also injection state on queue merging 2024-11-19 17:43:15 +01:00
bfq-wf2q.c block, bfq: always inject I/O of queues blocked by wakers 2024-11-19 17:41:42 +01:00
bio-integrity.c Revert "block: initialize integrity buffer to zero before writing it to media" 2024-11-24 00:23:47 +01:00
bio.c block: prevent an integer overflow in bvec_try_merge_hw_page 2024-11-18 12:13:14 +01:00
blk-cgroup-rwstat.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
blk-cgroup-rwstat.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
blk-cgroup.c cgroup: rstat: punt root-level optimization to individual controllers 2024-11-19 17:40:21 +01:00
blk-core.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
blk-crypto-fallback.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
blk-crypto-internal.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
blk-crypto.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
blk-exec.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
blk-flush.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
blk-integrity.c Revert "block: remove the blk_flush_integrity call in blk_integrity_unregister" 2024-11-24 00:23:47 +01:00
blk-ioc.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
blk-iocost.c Revert "blk_iocost: fix more out of bound shifts" 2024-11-24 00:23:10 +01:00
blk-iolatency.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
blk-ioprio.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
blk-ioprio.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
blk-lib.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
blk-map.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
blk-merge.c blk: Fix lock inversion between ioc lock and bfqd lock 2024-11-19 17:40:26 +01:00
blk-mq-cpumap.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
blk-mq-debugfs-zoned.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
blk-mq-debugfs.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
blk-mq-debugfs.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
blk-mq-pci.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
blk-mq-rdma.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
blk-mq-sched.c blk: Fix lock inversion between ioc lock and bfqd lock 2024-11-19 17:40:26 +01:00
blk-mq-sched.h blk: Fix lock inversion between ioc lock and bfqd lock 2024-11-19 17:40:26 +01:00
blk-mq-sysfs.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
blk-mq-tag.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
blk-mq-tag.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
blk-mq-virtio.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
blk-mq.c block: fix ordering between checking BLK_MQ_S_STOPPED request adding 2024-12-17 13:24:19 +01:00
blk-mq.h block: fix ordering between checking BLK_MQ_S_STOPPED request adding 2024-12-17 13:24:19 +01:00
blk-pm.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
blk-pm.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
blk-rq-qos.c Revert "blk-rq-qos: fix crash on rq_qos_wait vs. rq_qos_wake_function race" 2024-11-24 00:22:52 +01:00
blk-rq-qos.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
blk-sec-stats.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
blk-settings.c block: Clear zone limits for a non-zoned stacked queue 2024-11-19 09:22:16 +01:00
blk-stat.c block: prevent division by zero in blk_rq_stat_sum() 2024-11-19 09:23:14 +01:00
blk-stat.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
blk-sysfs.c Revert "mm: apply init protection" 2024-11-19 18:15:13 +01:00
blk-throttle.c blk-throttle: fix lockdep warning of "cgroup_mutex or RCU read lock required!" 2024-11-18 12:11:56 +01:00
blk-timeout.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
blk-wbt.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
blk-wbt.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
blk-zoned.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
blk.h blk: Fix lock inversion between ioc lock and bfqd lock 2024-11-19 17:40:26 +01:00
bounce.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
bsg-lib.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
bsg.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
cmdline-parser.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
elevator.c block: Add default I/O scheduler option 2024-11-19 17:43:55 +01:00
genhd.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
ioctl.c block/ioctl: prefer different overflow check 2024-11-19 14:19:06 +01:00
ioprio.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
Kconfig Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
Kconfig.iosched block: Add default I/O scheduler option 2024-11-19 17:43:55 +01:00
keyslot-manager.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
kyber-iosched.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
Makefile Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
mq-deadline-cgroup.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
mq-deadline-cgroup.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
mq-deadline-main.c blk: Fix lock inversion between ioc lock and bfqd lock 2024-11-19 17:40:26 +01:00
opal_proto.h block: sed-opal: handle empty atoms when parsing response 2024-11-19 08:44:36 +01:00
scsi_ioctl.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sed-opal.c block: sed-opal: handle empty atoms when parsing response 2024-11-19 08:44:36 +01:00
ssg-cgroup.c ssg: Set max available ratio to 25 2024-11-17 17:41:50 +01:00
ssg-cgroup.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
ssg-iosched.c block: ssg-iosched: adapt to new patches 2024-11-19 17:40:09 +01:00
t10-pi.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00