Patch "block: be a bit more careful in checking for NULL bdev while polling" has been added to the 6.1-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    block: be a bit more careful in checking for NULL bdev while polling

to the 6.1-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     block-be-a-bit-more-careful-in-checking-for-null-bdev-while-polling.patch
and it can be found in the queue-6.1 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.


>From 310726c33ad76cebdee312dbfafc12c1b44bf977 Mon Sep 17 00:00:00 2001
From: Jens Axboe <axboe@xxxxxxxxx>
Date: Fri, 24 Feb 2023 10:01:19 -0700
Subject: block: be a bit more careful in checking for NULL bdev while polling

From: Jens Axboe <axboe@xxxxxxxxx>

commit 310726c33ad76cebdee312dbfafc12c1b44bf977 upstream.

Wei reports a crash with an application using polled IO:

PGD 14265e067 P4D 14265e067 PUD 47ec50067 PMD 0
Oops: 0000 [#1] SMP
CPU: 0 PID: 21915 Comm: iocore_0 Kdump: loaded Tainted: G S                5.12.0-0_fbk12_clang_7346_g1bb6f2e7058f #1
Hardware name: Wiwynn Delta Lake MP T8/Delta Lake-Class2, BIOS Y3DLM08 04/10/2022
RIP: 0010:bio_poll+0x25/0x200
Code: 0f 1f 44 00 00 0f 1f 44 00 00 55 41 57 41 56 41 55 41 54 53 48 83 ec 28 65 48 8b 04 25 28 00 00 00 48 89 44 24 20 48 8b 47 08 <48> 8b 80 70 02 00 00 4c 8b 70 50 8b 6f 34 31 db 83 fd ff 75 25 65
RSP: 0018:ffffc90005fafdf8 EFLAGS: 00010292
RAX: 0000000000000000 RBX: 0000000000000000 RCX: 74b43cd65dd66600
RDX: 0000000000000003 RSI: ffffc90005fafe78 RDI: ffff8884b614e140
RBP: ffff88849964df78 R08: 0000000000000000 R09: 0000000000000008
R10: 0000000000000000 R11: 0000000000000000 R12: ffff88849964df00
R13: ffffc90005fafe78 R14: ffff888137d3c378 R15: 0000000000000001
FS:  00007fd195000640(0000) GS:ffff88903f400000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 0000000000000270 CR3: 0000000466121001 CR4: 00000000007706f0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
PKRU: 55555554
Call Trace:
 iocb_bio_iopoll+0x1d/0x30
 io_do_iopoll+0xac/0x250
 __se_sys_io_uring_enter+0x3c5/0x5a0
 ? __x64_sys_write+0x89/0xd0
 do_syscall_64+0x2d/0x40
 entry_SYSCALL_64_after_hwframe+0x44/0xae
RIP: 0033:0x94f225d
Code: 24 cc 00 00 00 41 8b 84 24 d0 00 00 00 c1 e0 04 83 e0 10 41 09 c2 8b 33 8b 53 04 4c 8b 43 18 4c 63 4b 0c b8 aa 01 00 00 0f 05 <85> c0 0f 88 85 00 00 00 29 03 45 84 f6 0f 84 88 00 00 00 41 f6 c7
RSP: 002b:00007fd194ffcd88 EFLAGS: 00000202 ORIG_RAX: 00000000000001aa
RAX: ffffffffffffffda RBX: 00007fd194ffcdc0 RCX: 00000000094f225d
RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000007
RBP: 00007fd194ffcdb0 R08: 0000000000000000 R09: 0000000000000008
R10: 0000000000000001 R11: 0000000000000202 R12: 00007fd269d68030
R13: 0000000000000000 R14: 0000000000000001 R15: 0000000000000000

which is due to bio->bi_bdev being NULL. This can happen if we have two
tasks doing polled IO, and task B ends up completing IO from task A if
they are sharing a poll queue. If task B completes the IO and puts the
bio into our cache, then it can allocate that bio again before task A
is done polling for it. As that would necessitate a preempt between the
two tasks, it's enough to just be a bit more careful in checking for
whether or not bio->bi_bdev is NULL.

Reported-and-tested-by: Wei Zhang <wzhang@xxxxxxxx>
Cc: stable@xxxxxxxxxxxxxxx
Fixes: be4d234d7aeb ("bio: add allocation cache abstraction")
Reviewed-by: Keith Busch <kbusch@xxxxxxxxxx>
Signed-off-by: Jens Axboe <axboe@xxxxxxxxx>
Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
---
 block/blk-core.c |   10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -842,10 +842,16 @@ EXPORT_SYMBOL(submit_bio);
  */
 int bio_poll(struct bio *bio, struct io_comp_batch *iob, unsigned int flags)
 {
-	struct request_queue *q = bdev_get_queue(bio->bi_bdev);
 	blk_qc_t cookie = READ_ONCE(bio->bi_cookie);
+	struct block_device *bdev;
+	struct request_queue *q;
 	int ret = 0;
 
+	bdev = READ_ONCE(bio->bi_bdev);
+	if (!bdev)
+		return 0;
+
+	q = bdev_get_queue(bdev);
 	if (cookie == BLK_QC_T_NONE ||
 	    !test_bit(QUEUE_FLAG_POLL, &q->queue_flags))
 		return 0;
@@ -905,7 +911,7 @@ int iocb_bio_iopoll(struct kiocb *kiocb,
 	 */
 	rcu_read_lock();
 	bio = READ_ONCE(kiocb->private);
-	if (bio && bio->bi_bdev)
+	if (bio)
 		ret = bio_poll(bio, iob, flags);
 	rcu_read_unlock();
 


Patches currently in stable-queue which might be from axboe@xxxxxxxxx are

queue-6.1/sbitmap-use-single-per-bitmap-counting-to-wake-up-qu.patch
queue-6.1/block-don-t-allow-multiple-bios-for-iocb_nowait-issue.patch
queue-6.1/sbitmap-correct-wake_batch-recalculation-to-avoid-po.patch
queue-6.1/blk-mq-avoid-sleep-in-blk_mq_alloc_request_hctx.patch
queue-6.1/ublk_drv-remove-nr_aborted_queues-from-ublk_device.patch
queue-6.1/blk-mq-fix-potential-io-hung-for-shared-sbitmap-per-.patch
queue-6.1/blk-mq-wait-on-correct-sbitmap_queue-in-blk_mq_mark_.patch
queue-6.1/block-clear-bio-bi_bdev-when-putting-a-bio-back-in-the-cache.patch
queue-6.1/ublk_drv-don-t-probe-partitions-if-the-ubq-daemon-is.patch
queue-6.1/trace-blktrace-fix-memory-leak-with-using-debugfs_lo.patch
queue-6.1/x86-fpu-don-t-set-tif_need_fpu_load-for-pf_io_worker.patch
queue-6.1/blk-cgroup-dropping-parent-refcount-after-pd_free_fn.patch
queue-6.1/block-be-a-bit-more-careful-in-checking-for-null-bdev-while-polling.patch
queue-6.1/block-use-proper-return-value-from-bio_failfast.patch
queue-6.1/block-fix-io-statistics-for-cgroup-in-throttle-path.patch
queue-6.1/block-ublk-check-io-buffer-based-on-flag-need_get_da.patch
queue-6.1/blk-cgroup-synchronize-pd_free_fn-from-blkg_free_wor.patch
queue-6.1/sbitmap-remove-redundant-check-in-__sbitmap_queue_ge.patch
queue-6.1/block-sync-mixed-merged-request-s-failfast-with-1st-.patch
queue-6.1/blk-mq-remove-stale-comment-for-blk_mq_sched_mark_re.patch
queue-6.1/blk-iocost-fix-divide-by-0-error-in-calc_lcoefs.patch
queue-6.1/s390-dasd-fix-potential-memleak-in-dasd_eckd_init.patch
queue-6.1/blk-mq-correct-stale-comment-of-.get_budget.patch
queue-6.1/block-bio-integrity-copy-flags-when-bio_integrity_pa.patch



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux