From c5b971d7f92c431a9bdaa0fab87445cf5d17ce97 Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Mon, 29 Dec 2003 05:51:44 -0800 Subject: [PATCH] [PATCH] md: set ra_pages for raid0/raid5 devices properly. From: NeilBrown stripe to be effective. This patch sets ra_pages appropriately. --- drivers/md/raid0.c | 16 ++++++++++++++++ drivers/md/raid5.c | 10 ++++++++++ 2 files changed, 26 insertions(+) diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c index d2e7227429ec3..1c4600f4b7fe2 100644 --- a/drivers/md/raid0.c +++ b/drivers/md/raid0.c @@ -311,6 +311,22 @@ static int raid0_run (mddev_t *mddev) conf->hash_spacing++; } + /* calculate the max read-ahead size. + * For read-ahead of large files to be effective, we need to + * readahead at least a whole stripe. i.e. number of devices + * multiplied by chunk size. + * If an individual device has an ra_pages greater than the + * chunk size, then we will not drive that device as hard as it + * wants. We consider this a configuration error: a larger + * chunksize should be used in that case. + */ + { + int stripe = mddev->raid_disks * mddev->chunk_size / PAGE_CACHE_SIZE; + if (mddev->queue->backing_dev_info.ra_pages < stripe) + mddev->queue->backing_dev_info.ra_pages = stripe; + } + + blk_queue_merge_bvec(mddev->queue, raid0_mergeable_bvec); return 0; diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 8ea6bf99dc299..def75ad21669f 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -1587,6 +1587,16 @@ memory = conf->max_nr_stripes * (sizeof(struct stripe_head) + print_raid5_conf(conf); + /* read-ahead size must cover a whole stripe, which is + * (n-1) * chunksize where 'n' is the number of raid devices + */ + { + int stripe = (mddev->raid_disks-1) * mddev->chunk_size + / PAGE_CACHE_SIZE; + if (mddev->queue->backing_dev_info.ra_pages < stripe) + mddev->queue->backing_dev_info.ra_pages = stripe; + } + /* Ok, everything is just fine now */ mddev->array_size = mddev->size * (mddev->raid_disks - 1); return 0; -- 2.53.0