Thread (15 messages) 15 messages, 3 authors, 2021-02-23

Re: [REGRESSION] "split bio_kmalloc from bio_alloc_bioset" causing crash shortly after bootup

From: Chaitanya Kulkarni <hidden>
Date: 2021-02-23 05:00:08
Also in: lkml

On 2/22/21 20:22, John Stultz wrote:
On Mon, Feb 22, 2021 at 7:39 PM Chaitanya Kulkarni
[off-list ref] wrote:
quoted
On 2/22/21 19:07, John Stultz wrote:
quoted
[   34.784901] ueventd: LoadWithAliases was unable to load platform:regulatory
[   34.785313]  bio_alloc_bioset+0x14/0x230
[   34.796189]  bio_clone_fast+0x28/0x80
[   34.799848]  bio_split+0x50/0xd0
[   34.803072]  blk_crypto_fallback_encrypt_bio+0x2ec/0x5e8
[   34.808384]  blk_crypto_fallback_bio_prep+0xfc/0x140
[   34.813345]  __blk_crypto_bio_prep+0x13c/0x150
[   34.817784]  submit_bio_noacct+0x3c0/0x548
[   34.821880]  submit_bio+0x48/0x200
[   34.825278]  ext4_io_submit+0x50/0x68
[   34.828939]  ext4_writepages+0x558/0xca8
[   34.832860]  do_writepages+0x58/0x108
[   34.836522]  __writeback_single_inode+0x44/0x510
[   34.841137]  writeback_sb_inodes+0x1e0/0x4a8
[   34.845404]  __writeback_inodes_wb+0x78/0xe8
[   34.849670]  wb_writeback+0x274/0x3e8
[   34.853328]  wb_workfn+0x308/0x5f0
[   34.856726]  process_one_work+0x1ec/0x4d0
[   34.860734]  worker_thread+0x44/0x478
[   34.864392]  kthread+0x140/0x150
[   34.867618]  ret_from_fork+0x10/0x30
[   34.871197] Code: a9ba7bfd 910003fd f9000bf3 7900bfa1 (f9403441)
[   34.877289] ---[ end trace e6c2a3ab108278f0 ]---
[   34.893636] Kernel panic - not syncing: Oops: Fatal exception
If you have time then until you get the reply from others, can you try
following patch ?
diff --git a/block/bio.c b/block/bio.c
index a1c4d2900c7a..9976400ec66a 100644
--- a/block/bio.c
+++ b/block/bio.c
@@ -663,7 +663,10 @@ struct bio *bio_clone_fast(struct bio *bio, gfp_t
gfp_mask, struct bio_set *bs)
 {
        struct bio *b;

-       b = bio_alloc_bioset(gfp_mask, 0, bs);
+       if (bs)
+               b = bio_alloc_bioset(gfp_mask, 0, bs);
+       else
+               b = bio_kmalloc(gfp_mask, 0);
        if (!b)
                return NULL;

P.S.This is purely based on the code inspection and it may not solve your
issue. Proceed with the caution as it may *break* your system.
So with an initial quick test, this patch (along with the follow-on
one you sent) seems to avoid the issue.
Thanks for bisecting, the patch you are referring to is with the similar
fix for bio bounce ? 
I'm wondering if given there are multiple call sites, that in
bio_alloc_bioset() would something like the following make more sense?
(apologies, copy pasted so this is whitespace corrupted)
thanks
-john
I've asked Christoph about how we can go about this issue, based on his
reply I can send a patch.

I think having kmalloc is what we want to avoid in the fast path, with
that in
mind in my opinion we need to fix the call sites with kmalloc call if number
is small,  which I think it is. Let's wait.

Meanwhile it will be great if you can share the result of the thorough
testing.
quoted hunk ↗ jump to hunk
diff --git a/block/bio.c b/block/bio.c
index a1c4d2900c7a..391d5cde79fc 100644
--- a/block/bio.c
+++ b/block/bio.c
@@ -402,6 +402,9 @@ struct bio *bio_alloc_bioset(gfp_t gfp_mask,
unsigned short nr_iovecs,
        struct bio *bio;
        void *p;

+       if(!bs)
+               return bio_kmalloc(gfp_mask, 0);
it may not work since nr_iovecs needs to be passed
+
        /* should not use nobvec bioset for nr_iovecs > 0 */
        if (WARN_ON_ONCE(!mempool_initialized(&bs->bvec_pool) && nr_iovecs > 0))
                return NULL;
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help