Jens Axboe
1af0bdca03
block: be a bit more careful in checking for NULL bdev while polling
...
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@meta.com>
Cc: stable@vger.kernel.org
Fixes: be4d234d7aeb ("bio: add allocation cache abstraction")
Reviewed-by: Keith Busch <kbusch@kernel.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2023-03-10 09:34:02 +01:00
..
2022-09-03 11:29:03 -06:00
2022-04-23 07:15:26 -06:00
2022-09-11 19:47:12 -05:00
2023-02-09 11:28:06 +01:00
2023-02-09 11:28:06 +01:00
2022-10-20 05:46:49 -07:00
2022-08-22 10:07:56 -06:00
2023-03-10 09:32:46 +01:00
2023-03-10 09:34:02 +01:00
2022-08-26 10:57:41 -10:00
2021-03-05 11:32:15 -07:00
2022-07-14 12:14:30 -06:00
2023-03-10 09:33:46 +01:00
2022-09-26 19:09:31 -06:00
2023-03-10 09:34:02 +01:00
2022-10-11 17:42:58 -06:00
2022-02-28 06:40:23 -07:00
2021-11-29 06:38:51 -07:00
2022-02-28 06:40:23 -07:00
2022-02-28 06:40:23 -07:00
2022-09-30 07:49:09 -06:00
2022-06-29 08:36:46 -06:00
2021-11-29 06:38:51 -07:00
2022-06-27 06:29:12 -06:00
2023-03-10 09:33:46 +01:00
2022-09-26 19:17:28 -06:00
2022-09-26 19:09:31 -06:00
2022-09-26 19:09:31 -06:00
2022-09-15 00:25:17 -06:00
2022-09-30 07:51:13 -06:00
2023-03-10 09:32:47 +01:00
2022-08-22 10:07:53 -06:00
2022-07-06 06:46:26 -06:00
2022-10-07 09:19:14 -07:00
2022-06-17 07:31:05 -06:00
2022-08-22 10:07:53 -06:00
2022-08-22 10:07:53 -06:00
2023-03-10 09:32:44 +01:00
2021-11-29 06:41:29 -07:00
2022-12-31 13:33:03 +01:00
2022-09-12 00:10:34 -06:00
2022-06-27 06:29:12 -06:00
2022-08-22 10:07:53 -06:00
2023-03-10 09:32:44 +01:00
2022-09-29 07:45:47 -06:00
2021-12-22 23:38:29 -05:00
2021-02-22 06:33:48 -07:00
2022-07-12 14:38:52 -06:00
2022-09-21 19:50:53 -06:00
2022-11-16 15:58:11 -07:00
2021-12-14 17:23:05 -07:00
2021-12-14 17:23:05 -07:00
2022-09-26 19:17:27 -06:00
2022-09-26 19:17:28 -06:00
2022-09-26 19:17:28 -06:00
2020-07-31 16:29:47 -06:00
2022-10-09 07:48:16 -06:00
2022-03-31 12:58:38 -06:00
2022-09-29 07:45:47 -06:00
2023-01-04 11:29:01 +01:00
2022-08-02 17:22:54 -06:00
2022-07-06 06:33:53 -06:00
2022-06-21 21:22:51 -04:00
2022-02-02 07:49:59 -07:00
2022-09-27 09:58:56 -06:00
2022-07-14 12:14:30 -06:00
2023-03-10 09:34:02 +01:00
2023-01-04 11:29:01 +01:00
2022-06-23 07:48:05 -06:00
2023-01-04 11:29:01 +01:00
2022-06-27 06:29:12 -06:00
2022-06-29 08:35:57 -06:00
2021-12-16 10:59:02 -07:00
2022-07-14 12:14:30 -06:00
2022-05-02 14:06:20 -06:00
2023-01-24 07:24:44 +01:00
2022-08-22 07:52:51 -06:00
2022-11-08 07:14:35 -07:00
2022-03-07 12:48:35 -07:00