[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20210223072252.GA18035@lst.de>
Date: Tue, 23 Feb 2021 08:22:52 +0100
From: Christoph Hellwig <hch@....de>
To: John Stultz <john.stultz@...aro.org>
Cc: Christoph Hellwig <hch@....de>,
Johannes Thumshirn <johannes.thumshirn@....com>,
Chaitanya Kulkarni <chaitanya.kulkarni@....com>,
Damien Le Moal <damien.lemoal@....com>,
Jens Axboe <axboe@...nel.dk>,
David Anderson <dvander@...gle.com>,
Alistair Delva <adelva@...gle.com>,
Todd Kjos <tkjos@...gle.com>,
Amit Pundir <amit.pundir@...aro.org>,
YongQin Liu <yongqin.liu@...aro.org>,
lkml <linux-kernel@...r.kernel.org>, linux-block@...r.kernel.org,
Satya Tangirala <satyat@...gle.com>
Subject: Re: [REGRESSION] "split bio_kmalloc from bio_alloc_bioset" causing
crash shortly after bootup
On Tue, Feb 23, 2021 at 08:04:08AM +0100, Christoph Hellwig wrote:
> The problem is that the blk-crypto fallback code calls bio_split
> with a NULL bioset. That was aready broken before, as the mempool
> needed to guarantee forward progress was missing, but is not fatal.
>
> Satya, can you look into adding a mempool that can guarantees forward
> progress here?
Something like this would be the minimum viable fix:
diff --git a/block/blk-crypto-fallback.c b/block/blk-crypto-fallback.c
index e8327c50d7c9f4..c176b7af56a7a5 100644
--- a/block/blk-crypto-fallback.c
+++ b/block/blk-crypto-fallback.c
@@ -80,6 +80,7 @@ static struct blk_crypto_keyslot {
static struct blk_keyslot_manager blk_crypto_ksm;
static struct workqueue_struct *blk_crypto_wq;
static mempool_t *blk_crypto_bounce_page_pool;
+static struct bio_set crypto_bio_split;
/*
* This is the key we set when evicting a keyslot. This *should* be the all 0's
@@ -224,7 +225,8 @@ static bool blk_crypto_split_bio_if_needed(struct bio **bio_ptr)
if (num_sectors < bio_sectors(bio)) {
struct bio *split_bio;
- split_bio = bio_split(bio, num_sectors, GFP_NOIO, NULL);
+ split_bio = bio_split(bio, num_sectors, GFP_NOIO,
+ &crypto_bio_split);
if (!split_bio) {
bio->bi_status = BLK_STS_RESOURCE;
return false;
@@ -538,9 +540,13 @@ static int blk_crypto_fallback_init(void)
prandom_bytes(blank_key, BLK_CRYPTO_MAX_KEY_SIZE);
- err = blk_ksm_init(&blk_crypto_ksm, blk_crypto_num_keyslots);
+ err = bioset_init(&crypto_bio_split, 64, 0, 0);
if (err)
goto out;
+
+ err = blk_ksm_init(&blk_crypto_ksm, blk_crypto_num_keyslots);
+ if (err)
+ goto fail_free_bioset;
err = -ENOMEM;
blk_crypto_ksm.ksm_ll_ops = blk_crypto_ksm_ll_ops;
@@ -591,6 +597,8 @@ static int blk_crypto_fallback_init(void)
destroy_workqueue(blk_crypto_wq);
fail_free_ksm:
blk_ksm_destroy(&blk_crypto_ksm);
+fail_free_bioset:
+ bioset_exit(&crypto_bio_split);
out:
return err;
}
Powered by blists - more mailing lists