From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1161631AbWJaGBU (ORCPT ); Tue, 31 Oct 2006 01:01:20 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1161571AbWJaGBT (ORCPT ); Tue, 31 Oct 2006 01:01:19 -0500 Received: from mx2.suse.de ([195.135.220.15]:52134 "EHLO mx2.suse.de") by vger.kernel.org with ESMTP id S1161569AbWJaGBE (ORCPT ); Tue, 31 Oct 2006 01:01:04 -0500 From: NeilBrown To: Andrew Morton Date: Tue, 31 Oct 2006 17:00:57 +1100 Message-Id: <1061031060057.5061@suse.de> X-face: [Gw_3E*Gng}4rRrKRYotwlE?.2|**#s9D Subject: [PATCH 003 of 6] md: Define raid5_mergeable_bvec References: <20061031164814.4884.patches@notabene> Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org This will encourage read request to be on only one device, so we will often be able to bypass the cache for read requests. cc: "Raz Ben-Jehuda(caro)" Signed-off-by: Neil Brown ### Diffstat output ./drivers/md/raid5.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff .prev/drivers/md/raid5.c ./drivers/md/raid5.c --- .prev/drivers/md/raid5.c 2006-10-31 16:40:57.000000000 +1100 +++ ./drivers/md/raid5.c 2006-10-31 16:41:26.000000000 +1100 @@ -2611,6 +2611,28 @@ static int raid5_congested(void *data, i return 0; } +/* We want read requests to align with chunks where possible, + * but write requests don't need to. + */ +static int raid5_mergeable_bvec(request_queue_t *q, struct bio *bio, struct bio_vec *biovec) +{ + mddev_t *mddev = q->queuedata; + sector_t sector = bio->bi_sector + get_start_sect(bio->bi_bdev); + int max; + unsigned int chunk_sectors = mddev->chunk_size >> 9; + unsigned int bio_sectors = bio->bi_size >> 9; + + if (bio_data_dir(bio)) + return biovec->bv_len; /* always allow writes to be mergeable */ + + max = (chunk_sectors - ((sector & (chunk_sectors - 1)) + bio_sectors)) << 9; + if (max < 0) max = 0; + if (max <= biovec->bv_len && bio_sectors == 0) + return biovec->bv_len; + else + return max; +} + static int make_request(request_queue_t *q, struct bio * bi) { mddev_t *mddev = q->queuedata; @@ -3320,6 +3342,8 @@ static int run(mddev_t *mddev) mddev->array_size = mddev->size * (conf->previous_raid_disks - conf->max_degraded); + blk_queue_merge_bvec(mddev->queue, raid5_mergeable_bvec); + return 0; abort: if (conf) {