Message ID | 20230217121442.33914-1-p.raghav@samsung.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | brd: use radix_tree_maybe_preload instead of radix_tree_preload | expand |
On 2/17/23 5:14 AM, Pankaj Raghav wrote: > Unconditionally calling radix_tree_preload_end() results in a OOPS > message as the preload is only conditionally called for > gfpflags_allow_blocking(). > > [ 20.267323] BUG: using smp_processor_id() in preemptible [00000000] code: fio/416 > [ 20.267837] caller is brd_insert_page.part.0+0xbe/0x190 [brd] > [ 20.269436] Call Trace: > [ 20.269598] <TASK> > [ 20.269742] dump_stack_lvl+0x32/0x50 > [ 20.269982] check_preemption_disabled+0xd1/0xe0 > [ 20.270289] brd_insert_page.part.0+0xbe/0x190 [brd] > [ 20.270664] brd_submit_bio+0x33f/0xf40 [brd] > > Use radix_tree_maybe_preload() which does preload only if > gfpflags_allow_blocking() is true but also takes the lock. Therefore, > unconditionally calling radix_tree_preload_end() should not create any > issues and the message disappears. Thanks, I wonder why I didn't see this in my testing which did both. But it's certainly an oversight!
On Fri, 17 Feb 2023 17:44:44 +0530, Pankaj Raghav wrote: > Unconditionally calling radix_tree_preload_end() results in a OOPS > message as the preload is only conditionally called for > gfpflags_allow_blocking(). > > [ 20.267323] BUG: using smp_processor_id() in preemptible [00000000] code: fio/416 > [ 20.267837] caller is brd_insert_page.part.0+0xbe/0x190 [brd] > [ 20.269436] Call Trace: > [ 20.269598] <TASK> > [ 20.269742] dump_stack_lvl+0x32/0x50 > [ 20.269982] check_preemption_disabled+0xd1/0xe0 > [ 20.270289] brd_insert_page.part.0+0xbe/0x190 [brd] > [ 20.270664] brd_submit_bio+0x33f/0xf40 [brd] > > [...] Applied, thanks! [1/1] brd: use radix_tree_maybe_preload instead of radix_tree_preload commit: 6c940bf10024977b9367072d6cd7616945262dad Best regards,
diff --git a/drivers/block/brd.c b/drivers/block/brd.c index 734d9193d1d8..34177f1bd97d 100644 --- a/drivers/block/brd.c +++ b/drivers/block/brd.c @@ -94,7 +94,7 @@ static int brd_insert_page(struct brd_device *brd, sector_t sector, gfp_t gfp) if (!page) return -ENOMEM; - if (gfpflags_allow_blocking(gfp) && radix_tree_preload(gfp)) { + if (radix_tree_maybe_preload(gfp)) { __free_page(page); return -ENOMEM; }
Unconditionally calling radix_tree_preload_end() results in a OOPS message as the preload is only conditionally called for gfpflags_allow_blocking(). [ 20.267323] BUG: using smp_processor_id() in preemptible [00000000] code: fio/416 [ 20.267837] caller is brd_insert_page.part.0+0xbe/0x190 [brd] [ 20.269436] Call Trace: [ 20.269598] <TASK> [ 20.269742] dump_stack_lvl+0x32/0x50 [ 20.269982] check_preemption_disabled+0xd1/0xe0 [ 20.270289] brd_insert_page.part.0+0xbe/0x190 [brd] [ 20.270664] brd_submit_bio+0x33f/0xf40 [brd] Use radix_tree_maybe_preload() which does preload only if gfpflags_allow_blocking() is true but also takes the lock. Therefore, unconditionally calling radix_tree_preload_end() should not create any issues and the message disappears. Fixes: 6ded703c56c2 ("brd: check for REQ_NOWAIT and set correct page allocation mask") Signed-off-by: Pankaj Raghav <p.raghav@samsung.com> --- drivers/block/brd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)