[dm-devel] [BUG 5.19-rc0] dm: BIOSET_PERCPU_CACHE breaks dm-error

Dave Chinner david at fromorbit.com
Mon May 30 02:51:32 UTC 2022


fstests generic/250 dies tearing down a dm-error device like so:

[ 3287.076109] general protection fault, probably for non-canonical address 0xdead000000000122: 0000 [#1] PREEMPT SMP
[ 3287.080726] CPU: 3 PID: 1146698 Comm: dmsetup Not tainted 5.18.0-dgc+ #1260
[ 3287.083703] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.15.0-1 04/01/2014
[ 3287.087308] RIP: 0010:__cpuhp_state_remove_instance+0xf3/0x1a0
[ 3287.089821] Code: d8 8f 82 42 3b 1c 20 7f d9 48 89 e9 31 d2 89 de 89 7c 24 04 e8 2e fd ff ff 8b 7c 24 04 eb c3 48 8b 45 00 48 8b 557
[ 3287.097662] RSP: 0018:ffffc900037b3cb8 EFLAGS: 00010286
[ 3287.099860] RAX: dead000000000100 RBX: 0000000000000017 RCX: ffff88811157a780
[ 3287.102797] RDX: dead000000000122 RSI: 000000000000011b RDI: ffffffff827fb91d
[ 3287.105648] RBP: ffff888105c72510 R08: 0000000000000001 R09: ffffffff81859800
[ 3287.108391] R10: ffff888020d8c900 R11: ffff88813bdab6f0 R12: 0000000000000000
[ 3287.111192] R13: ffffffff82a8cab8 R14: ffff8881117eb800 R15: ffffc900037b3d90
[ 3287.113916] FS:  00007f10f28e0c40(0000) GS:ffff88813bd80000(0000) knlGS:0000000000000000
[ 3287.116905] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 3287.118925] CR2: 00007f10f2b0550e CR3: 000000011b634000 CR4: 00000000000006e0
[ 3287.121480] Call Trace:
[ 3287.122368]  <TASK>
[ 3287.123170]  bioset_exit+0x28/0x170
[ 3287.124495]  cleanup_mapped_device+0x32/0x130
[ 3287.125870]  __dm_destroy+0x160/0x200
[ 3287.127059]  ? table_clear+0xb0/0xb0
[ 3287.128249]  dev_remove+0xd3/0x110
[ 3287.129365]  ctl_ioctl+0x1d6/0x410
[ 3287.130394]  dm_ctl_ioctl+0xa/0x10
[ 3287.131420]  __x64_sys_ioctl+0x7f/0xb0
[ 3287.132541]  do_syscall_64+0x35/0x80
[ 3287.133568]  entry_SYSCALL_64_after_hwframe+0x46/0xb0
[ 3287.134996] RIP: 0033:0x7f10f2c2c397
[ 3287.136052] Code: 3c 1c e8 1c ff ff ff 85 c0 79 87 49 c7 c4 ff ff ff ff 5b 5d 4c 89 e0 41 5c c3 66 0f 1f 84 00 00 00 00 00 b8 10 008
[ 3287.141271] RSP: 002b:00007ffc165d3ca8 EFLAGS: 00000202 ORIG_RAX: 0000000000000010
[ 3287.143314] RAX: ffffffffffffffda RBX: 00007f10f2d22a8e RCX: 00007f10f2c2c397
[ 3287.145224] RDX: 0000558ef56f3b50 RSI: 00000000c138fd04 RDI: 0000000000000003
[ 3287.147140] RBP: 00007ffc165d3d60 R08: 00007f10f2d72558 R09: 00007ffc165d3b10
[ 3287.149074] R10: 00007f10f2d718a2 R11: 0000000000000202 R12: 00007f10f2d718a2
[ 3287.150996] R13: 00007f10f2d718a2 R14: 00007f10f2d718a2 R15: 00007f10f2d718a2
[ 3287.152929]  </TASK>
[ 3287.153544] Modules linked in:
[ 3287.154488] ---[ end trace 0000000000000000 ]---
[ 3287.154491] RIP: 0010:__cpuhp_state_remove_instance+0xf3/0x1a0
[ 3287.154496] Code: d8 8f 82 42 3b 1c 20 7f d9 48 89 e9 31 d2 89 de 89 7c 24 04 e8 2e fd ff ff 8b 7c 24 04 eb c3 48 8b 45 00 48 8b 557
[ 3287.154498] RSP: 0018:ffffc900037b3cb8 EFLAGS: 00010286
[ 3287.154500] RAX: dead000000000100 RBX: 0000000000000017 RCX: ffff88811157a780
[ 3287.154501] RDX: dead000000000122 RSI: 000000000000011b RDI: ffffffff827fb91d
[ 3287.154503] RBP: ffff888105c72510 R08: 0000000000000001 R09: ffffffff81859800
[ 3287.154504] R10: ffff888020d8c900 R11: ffff88813bdab6f0 R12: 0000000000000000
[ 3287.154505] R13: ffffffff82a8cab8 R14: ffff8881117eb800 R15: ffffc900037b3d90
[ 3287.154507] FS:  00007f10f28e0c40(0000) GS:ffff88813bd80000(0000) knlGS:0000000000000000
[ 3287.154512] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 3287.154513] CR2: 00007f10f2b0550e CR3: 000000011b634000 CR4: 00000000000006e0

Looks like polled bioset optimisations are the cause. Disabling the
change made in cfc97abcbe0b ("dm: conditionally enable
BIOSET_PERCPU_CACHE for dm_io bioset") as per the hack below makes
the regression go away.

-Dave.

---
 drivers/md/dm-table.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c
index a37c7b763643..c5a8862462c4 100644
--- a/drivers/md/dm-table.c
+++ b/drivers/md/dm-table.c
@@ -1027,7 +1027,7 @@ static int dm_table_alloc_md_mempools(struct dm_table *t, struct mapped_device *
 			per_io_data_size = max(per_io_data_size, ti->per_io_data_size);
 			min_pool_size = max(min_pool_size, ti->num_flush_bios);
 		}
-		poll_supported = !!dm_table_supports_poll(t);
+		//poll_supported = !!dm_table_supports_poll(t);
 	}
 
 	t->mempools = dm_alloc_md_mempools(md, type, per_io_data_size, min_pool_size,
-- 
Dave Chinner
david at fromorbit.com



More information about the dm-devel mailing list