Re: [PATCH v2 04/11] md/raid5: use mempool to allocate stripe_request_ctx

"Yu Kuai" <[email protected]>
Newsgroups gmane.linux.raid,gmane.linux.kernel
Message-ID <[email protected]>
Hi,

在 2025/12/26 16:33, Li Nan 写道:
>
>
> 在 2025/11/24 14:31, Yu Kuai 写道:
>> On the one hand, stripe_request_ctx is 72 bytes, and it's a bit huge for
>> a stack variable.
>>
>> On the other hand, the bitmap sectors_to_do is a fixed size, result in
>> max_hw_sector_kb of raid5 array is at most 256 * 4k = 1Mb, and this will
>> make full stripe IO impossible for the array that chunk_size * 
>> data_disks
>> is bigger. Allocate ctx during runtime will make it possible to get rid
>> of this limit.
>>
>> Signed-off-by: Yu Kuai <[email protected]>
>> ---
>>   drivers/md/md.h       |  4 +++
>>   drivers/md/raid1-10.c |  5 ----
>>   drivers/md/raid5.c    | 61 +++++++++++++++++++++++++++----------------
>>   drivers/md/raid5.h    |  2 ++
>>   4 files changed, 45 insertions(+), 27 deletions(-)
>>
>
> [...]
>
>> @@ -7374,6 +7380,10 @@ static void free_conf(struct r5conf *conf)
>>       bioset_exit(&conf->bio_split);
>>       kfree(conf->stripe_hashtbl);
>>       kfree(conf->pending_data);
>> +
>> +    if (conf->ctx_pool)
>> +        mempool_destroy(conf->ctx_pool);
>> +
>>       kfree(conf);
>>   }
>>   @@ -8057,6 +8067,13 @@ static int raid5_run(struct mddev *mddev)
>>               goto abort;
>>       }
>>   +    conf->ctx_pool = mempool_create_kmalloc_pool(NR_RAID_BIOS,
>> +                    sizeof(struct stripe_request_ctx));
>> +    if (!conf->ctx_pool) {
>> +        ret = -ENOMEM;
>> +        goto abort;
>> +    }
>> +
>
> What about moving create to setup_conf()? If so, call destroy in
> free_conf() without checks.

No, we can't, this must be done after raid5_set_limits(), which is called
at the end of raid5_run().

>
>>       if (log_init(conf, journal_dev, raid5_has_ppl(conf)))
>>           goto abort;
>>   diff --git a/drivers/md/raid5.h b/drivers/md/raid5.h
>> index eafc6e9ed6ee..6e3f07119fa4 100644
>> --- a/drivers/md/raid5.h
>> +++ b/drivers/md/raid5.h
>> @@ -690,6 +690,8 @@ struct r5conf {
>>       struct list_head    pending_list;
>>       int            pending_data_cnt;
>>       struct r5pending_data    *next_pending_data;
>> +
>> +    mempool_t        *ctx_pool;
>>   };
>>     #if PAGE_SIZE == DEFAULT_STRIPE_SIZE
>
-- 
Thansk,
Kuai
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.