[PATCH 2/8] md/raid5: raise stripe cache limit from 32768 to 262144
Hiroshi Nishida <[email protected]>
| Newsgroups | gmane.linux.raid,gmane.linux.kernel |
|---|---|
| Message-ID | <[email protected]> |
Stripe cache memory is approximately max_nr_stripes * num_disks * stripe_size, where stripe_size is 4KB (PAGE_SIZE). The old hardcoded ceiling of 32768 stripes therefore limits a 12-disk array to ~1.5GB of stripe cache. On servers with 256GB+ RAM backing wide arrays, a larger cache reduces stalls on stripe-cache misses under heavy write workloads. Define RAID5_MAX_NR_STRIPES = 262144 (256K) in raid5.h and use it in raid5_set_cache_size() instead of the magic 32768 literal. This allows up to ~12GB of stripe cache on a 12-disk array. The default stripe count (NR_STRIPES = 256) is unchanged, so there is no memory impact unless the administrator raises stripe_cache_size explicitly. Also fix two local variables in raid5_cache_count() that were declared as int but read from unsigned int fields; change to unsigned int to avoid implicit sign-extension in the subtraction. Tested: echo 262144 > /sys/block/md0/md/stripe_cache_size accepted; 262145 correctly returns EINVAL. Assisted-by: Claude:claude-opus-4-8 [Claude Code] Signed-off-by: Hiroshi Nishida <[email protected]> --- drivers/md/raid5.c | 6 +++--- drivers/md/raid5.h | 6 ++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 28828e083c2b..9cb4ed3bd85c 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -6923,7 +6923,7 @@ raid5_set_cache_size(struct mddev *mddev, int size) int result = 0; struct r5conf *conf = mddev->private; - if (size <= 16 || size > 32768) + if (size <= 16 || size > RAID5_MAX_NR_STRIPES) return -EINVAL; WRITE_ONCE(conf->min_nr_stripes, size); @@ -7505,8 +7505,8 @@ static unsigned long raid5_cache_count(struct shrinker *shrink, struct shrink_control *sc) { struct r5conf *conf = shrink->private_data; - int max_stripes = READ_ONCE(conf->max_nr_stripes); - int min_stripes = READ_ONCE(conf->min_nr_stripes); + unsigned int max_stripes = READ_ONCE(conf->max_nr_stripes); + unsigned int min_stripes = READ_ONCE(conf->min_nr_stripes); if (max_stripes < min_stripes) /* unlikely, but not impossible */ diff --git a/drivers/md/raid5.h b/drivers/md/raid5.h index 5cd9d0f36b6e..57349737d393 100644 --- a/drivers/md/raid5.h +++ b/drivers/md/raid5.h @@ -479,6 +479,12 @@ struct disk_info { */ #define NR_STRIPES 256 +/* Maximum user-settable stripe cache size, in stripes. Stripe cache memory is + * roughly max_nr_stripes * num_disks * stripe_size (stripe_size = 4KB), so the + * old cap of 32768 limited a 12-disk array to ~1.5GB. Raise to 262144 to allow + * larger caches on big-RAM systems; the default (NR_STRIPES) is unchanged. + */ +#define RAID5_MAX_NR_STRIPES 262144U #if PAGE_SIZE == DEFAULT_STRIPE_SIZE #define STRIPE_SIZE PAGE_SIZE -- 2.43.0