On Tuesday May 23, [EMAIL PROTECTED] wrote:
> Neil hello.
> 
> 1.
> i have applied the common path according to
> http://www.spinics.net/lists/raid/msg11838.html as much as i can.

Great.  I look forward to seeing the results.

> 
> it looks ok in terms of throughput.
> before i continue to a non common path ( step 3 ) i do not understand
> raid0_mergeable_bvec entirely.

Not too surprising - it is rather subtle unfortunately.

> 
> as i understand the code checks alignment . i made a version for this
> purpose which looks like that:

Yes, it checks alignment with the chunks and devices.
However we always have to allow one page to be added to a bio, so
sometimes we have to accept a bio that crosses a chunk/device boundary.

The main (possibly only) user is in __bio_add_page in fs/bio.c
so we basically code the merge_bvec_fn to meet the needs of that code.

> 
> 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;
> 
>       max=(chunk_sectors-((sector&(chunk_sectors-1))+bio_sectors))<<9;
>       if (max < 0){
>               printk("handle_aligned_read not aligned %d %d %d
> %lld\n",max,chunk_sectors,bio_sectors,sector);
>               return -1; // Is bigger than one chunk size
>       }
> 
> //    printk("handle_aligned_read aligned %d %d %d
> %lld\n",max,chunk_sectors,bio_sectors,sector);
>       return max;
> }

you cannot return a negative number, because the result is
compared with an 'unsigned int', and the comparison will be unsigned. 
So "return -1" is a problem.  I think you need to make this code 
look a lot more like raid0_mergeable_bvec.


> 
> Questions:
>    1.1 why did you drop the max=0 case ?

I'm not sure what you mean by 'drop'.
If bio->bi_size == 0, then we are not allowed to return a number
smaller than biovec->bv_len, otherwise bio_add_page wont be able
to put any pages on the bio, and so wont be able to start any IO.

>    1.2  what these lines mean ? do i need it ?
>        if (max <= biovec->bv_len && bio_sectors == 0)
>                  return biovec->bv_len;
>          else
>                 return max;
>          }

Yes, you need this.  It basically implements the above restriction.

NeilBrown
-
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to