Re: [patch]raid5: fix directio regression

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



2012/8/7 Jianpeng Ma <majianpeng@xxxxxxxxx>:
> On 2012-08-07 11:22 Shaohua Li <shli@xxxxxxxxxx> Wrote:
>>My directIO randomwrite 4k workload shows a 10~20% regression caused by commit
>>895e3c5c58a80bb. directIO usually is random IO and if request size isn't big
>>(which is the common case), delay handling of the stripe hasn't any advantages.
>>For big size request, delay can still reduce IO.
>>
>>Signed-off-by: Shaohua Li <shli@xxxxxxxxxxxx>
>>---
>> drivers/md/raid5.c |    9 ++++++++-
>> 1 file changed, 8 insertions(+), 1 deletion(-)
>>
>>Index: linux/drivers/md/raid5.c
>>===================================================================
>>--- linux.orig/drivers/md/raid5.c      2012-08-07 11:04:48.442834682 +0800
>>+++ linux/drivers/md/raid5.c   2012-08-07 11:09:08.743562203 +0800
>>@@ -4076,6 +4076,7 @@ static void make_request(struct mddev *m
>>       struct stripe_head *sh;
>>       const int rw = bio_data_dir(bi);
>>       int remaining;
>>+      bool large_request;
>>
>>       if (unlikely(bi->bi_rw & REQ_FLUSH)) {
>>               md_flush_request(mddev, bi);
>>@@ -4089,6 +4090,11 @@ static void make_request(struct mddev *m
>>            chunk_aligned_read(mddev,bi))
>>               return;
>>
>>+      if (mddev->new_chunk_sectors < mddev->chunk_sectors)
>>+              large_request = (bi->bi_size >> 9) > mddev->new_chunk_sectors;
>>+      else
>>+              large_request = (bi->bi_size >> 9) > mddev->chunk_sectors;
>>+
>>       logical_sector = bi->bi_sector & ~((sector_t)STRIPE_SECTORS-1);
>>       last_sector = bi->bi_sector + (bi->bi_size>>9);
>>       bi->bi_next = NULL;
>>@@ -4192,7 +4198,8 @@ static void make_request(struct mddev *m
>>                       finish_wait(&conf->wait_for_overlap, &w);
>>                       set_bit(STRIPE_HANDLE, &sh->state);
>>                       clear_bit(STRIPE_DELAYED, &sh->state);
>>-                      if ((bi->bi_rw & REQ_NOIDLE) &&
>>+                      if ((bi->bi_rw & REQ_SYNC) &&
>>+                          ((bi->bi_rw & REQ_NOIDLE) || !large_request) &&
>>                           !test_and_set_bit(STRIPE_PREREAD_ACTIVE, &sh->state))
>>                               atomic_inc(&conf->preread_active_stripes);
>>                       release_stripe_plug(mddev, sh);
>>--
> May be used size to judge is not a good method.
> I firstly sended this patch, only want to control direct-write-block,not for reqular file.
> Because i think if someone used direct-write-block for raid5,he should know the feature of raid5 and he can control
> for write to full-write.
> But at that time, i did know how to differentiate between regular file and block-device.
> I thik we should do something to do this.

I don't think it's possible user can control his write to be a
full-write even for
raw disk IO. Why regular file and block device io matters here?

Thanks,
Shaohua
--
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux