diff mbox series

brd: use radix_tree_maybe_preload instead of radix_tree_preload

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

Commit Message

Pankaj Raghav Feb. 17, 2023, 12:14 p.m. UTC
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(-)

Comments

Jens Axboe Feb. 17, 2023, 1:04 p.m. UTC | #1
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!
Jens Axboe Feb. 17, 2023, 1:04 p.m. UTC | #2
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 mbox series

Patch

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;
 	}