* [PATCH 1/2] block: clear bio->bi_bdev when putting a bio back in the cache
[not found] <20230224170845.175485-1-axboe@kernel.dk>
@ 2023-02-24 17:08 ` Jens Axboe
2023-02-24 20:18 ` Keith Busch
2023-02-24 17:08 ` [PATCH 2/2] block: be a bit more careful in checking for NULL bdev while polling Jens Axboe
1 sibling, 1 reply; 4+ messages in thread
From: Jens Axboe @ 2023-02-24 17:08 UTC (permalink / raw)
To: linux-block; +Cc: kbusch, Jens Axboe, stable
This isn't strictly needed in terms of correctness, but it does allow
polling to know if the bio has been put already by a different task
and hence avoid polling something that we don't need to.
Cc: stable@vger.kernel.org
Fixes: be4d234d7aeb ("bio: add allocation cache abstraction")
Signed-off-by: Jens Axboe <axboe@kernel.dk>
---
block/bio.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/block/bio.c b/block/bio.c
index 2693f34afb7e..605c40025068 100644
--- a/block/bio.c
+++ b/block/bio.c
@@ -772,6 +772,7 @@ static inline void bio_put_percpu_cache(struct bio *bio)
if ((bio->bi_opf & REQ_POLLED) && !WARN_ON_ONCE(in_interrupt())) {
bio->bi_next = cache->free_list;
+ bio->bi_bdev = NULL;
cache->free_list = bio;
cache->nr++;
} else {
--
2.39.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 2/2] block: be a bit more careful in checking for NULL bdev while polling
[not found] <20230224170845.175485-1-axboe@kernel.dk>
2023-02-24 17:08 ` [PATCH 1/2] block: clear bio->bi_bdev when putting a bio back in the cache Jens Axboe
@ 2023-02-24 17:08 ` Jens Axboe
2023-02-24 17:27 ` Keith Busch
1 sibling, 1 reply; 4+ messages in thread
From: Jens Axboe @ 2023-02-24 17:08 UTC (permalink / raw)
To: linux-block; +Cc: kbusch, Jens Axboe, Wei Zhang, stable
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@meta.com>
Cc: stable@vger.kernel.org
Fixes: be4d234d7aeb ("bio: add allocation cache abstraction")
Signed-off-by: Jens Axboe <axboe@kernel.dk>
---
block/blk-core.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/block/blk-core.c b/block/blk-core.c
index 5fb6856745b4..5d7e2ca75234 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -854,10 +854,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;
@@ -926,7 +932,7 @@ int iocb_bio_iopoll(struct kiocb *kiocb, struct io_comp_batch *iob,
*/
rcu_read_lock();
bio = READ_ONCE(kiocb->private);
- if (bio && bio->bi_bdev)
+ if (bio)
ret = bio_poll(bio, iob, flags);
rcu_read_unlock();
--
2.39.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 2/2] block: be a bit more careful in checking for NULL bdev while polling
2023-02-24 17:08 ` [PATCH 2/2] block: be a bit more careful in checking for NULL bdev while polling Jens Axboe
@ 2023-02-24 17:27 ` Keith Busch
0 siblings, 0 replies; 4+ messages in thread
From: Keith Busch @ 2023-02-24 17:27 UTC (permalink / raw)
To: Jens Axboe; +Cc: linux-block, Wei Zhang, stable
Looks good!
Reviewed-by: Keith Busch <kbusch@kernel.org>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 1/2] block: clear bio->bi_bdev when putting a bio back in the cache
2023-02-24 17:08 ` [PATCH 1/2] block: clear bio->bi_bdev when putting a bio back in the cache Jens Axboe
@ 2023-02-24 20:18 ` Keith Busch
0 siblings, 0 replies; 4+ messages in thread
From: Keith Busch @ 2023-02-24 20:18 UTC (permalink / raw)
To: Jens Axboe; +Cc: linux-block, stable
On Fri, Feb 24, 2023 at 10:08:44AM -0700, Jens Axboe wrote:
> This isn't strictly needed in terms of correctness, but it does allow
> polling to know if the bio has been put already by a different task
> and hence avoid polling something that we don't need to.
>
> Cc: stable@vger.kernel.org
> Fixes: be4d234d7aeb ("bio: add allocation cache abstraction")
> Signed-off-by: Jens Axboe <axboe@kernel.dk>
Looks good.
Reviewed-by: Keith Busch <kbusch@kernel.org>
> ---
> block/bio.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/block/bio.c b/block/bio.c
> index 2693f34afb7e..605c40025068 100644
> --- a/block/bio.c
> +++ b/block/bio.c
> @@ -772,6 +772,7 @@ static inline void bio_put_percpu_cache(struct bio *bio)
>
> if ((bio->bi_opf & REQ_POLLED) && !WARN_ON_ONCE(in_interrupt())) {
> bio->bi_next = cache->free_list;
> + bio->bi_bdev = NULL;
> cache->free_list = bio;
> cache->nr++;
> } else {
> --
> 2.39.1
>
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2023-02-24 20:18 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20230224170845.175485-1-axboe@kernel.dk>
2023-02-24 17:08 ` [PATCH 1/2] block: clear bio->bi_bdev when putting a bio back in the cache Jens Axboe
2023-02-24 20:18 ` Keith Busch
2023-02-24 17:08 ` [PATCH 2/2] block: be a bit more careful in checking for NULL bdev while polling Jens Axboe
2023-02-24 17:27 ` Keith Busch
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).