Message ID | 2f0f6811938dafd14c6c7b1dbe8fbabfdcbb19c1.1464346333.git.baolin.wang@linaro.org (mailing list archive) |
---|---|
State | RFC |
Delegated to: | Herbert Xu |
Headers | show |
On 05/27/2016 05:11 AM, Baolin Wang wrote: > In dm-crypt, it need to map one bio to scatterlist for improving the > hardware engine encryption efficiency. Thus this patch introduces the > blk_bio_map_sg() function to map one bio with scatterlists. > > For avoiding the duplicated code in __blk_bios_map_sg() function, add > one parameter to distinguish bio map or request map. Just detach the bio in blk_bio_map_sg() instead of adding a separate case (and argument) for it in __blk_bios_map_sg().
On 05/27/2016 05:11 AM, Baolin Wang wrote: > +/* > + * Map a bio to scatterlist, return number of sg entries setup. Caller must > + * make sure sg can hold bio segments entries. > + */ > +int blk_bio_map_sg(struct request_queue *q, struct bio *bio, > + struct scatterlist *sglist) > +{ > + struct scatterlist *sg = NULL; > + int nsegs = 0; > + > + if (bio) > + nsegs = __blk_bios_map_sg(q, bio, sglist, &sg, true); > + > + if (sg) > + sg_mark_end(sg); Put that if (sg) inside the if (bio) section, 'sg' isn't going to be non-NULL outside of that. Additionally, who would call this with a NULL bio? That seems odd, I'd get rid of that check completely.
On 3 June 2016 at 22:35, Jens Axboe <axboe@kernel.dk> wrote: > On 05/27/2016 05:11 AM, Baolin Wang wrote: >> >> In dm-crypt, it need to map one bio to scatterlist for improving the >> hardware engine encryption efficiency. Thus this patch introduces the >> blk_bio_map_sg() function to map one bio with scatterlists. >> >> For avoiding the duplicated code in __blk_bios_map_sg() function, add >> one parameter to distinguish bio map or request map. > > > Just detach the bio in blk_bio_map_sg() instead of adding a separate case > (and argument) for it in __blk_bios_map_sg(). Make sense. > > -- > Jens Axboe >
On 3 June 2016 at 22:38, Jens Axboe <axboe@kernel.dk> wrote: > On 05/27/2016 05:11 AM, Baolin Wang wrote: >> >> +/* >> + * Map a bio to scatterlist, return number of sg entries setup. Caller >> must >> + * make sure sg can hold bio segments entries. >> + */ >> +int blk_bio_map_sg(struct request_queue *q, struct bio *bio, >> + struct scatterlist *sglist) >> +{ >> + struct scatterlist *sg = NULL; >> + int nsegs = 0; >> + >> + if (bio) >> + nsegs = __blk_bios_map_sg(q, bio, sglist, &sg, true); >> + >> + if (sg) >> + sg_mark_end(sg); > > > Put that if (sg) inside the if (bio) section, 'sg' isn't going to be > non-NULL outside of that. > > Additionally, who would call this with a NULL bio? That seems odd, I'd > get rid of that check completely. OK. I'll fix these in next version. Thanks for your comments.
diff --git a/block/blk-merge.c b/block/blk-merge.c index 2613531..badae44 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c @@ -376,7 +376,7 @@ new_segment: static int __blk_bios_map_sg(struct request_queue *q, struct bio *bio, struct scatterlist *sglist, - struct scatterlist **sg) + struct scatterlist **sg, bool single_bio) { struct bio_vec bvec, bvprv = { NULL }; struct bvec_iter iter; @@ -408,13 +408,39 @@ single_segment: return 1; } - for_each_bio(bio) + if (!single_bio) { + for_each_bio(bio) + bio_for_each_segment(bvec, bio, iter) + __blk_segment_map_sg(q, &bvec, sglist, &bvprv, + sg, &nsegs, &cluster); + } else { bio_for_each_segment(bvec, bio, iter) - __blk_segment_map_sg(q, &bvec, sglist, &bvprv, sg, - &nsegs, &cluster); + __blk_segment_map_sg(q, &bvec, sglist, &bvprv, + sg, &nsegs, &cluster); + } + + return nsegs; +} + +/* + * Map a bio to scatterlist, return number of sg entries setup. Caller must + * make sure sg can hold bio segments entries. + */ +int blk_bio_map_sg(struct request_queue *q, struct bio *bio, + struct scatterlist *sglist) +{ + struct scatterlist *sg = NULL; + int nsegs = 0; + + if (bio) + nsegs = __blk_bios_map_sg(q, bio, sglist, &sg, true); + + if (sg) + sg_mark_end(sg); return nsegs; } +EXPORT_SYMBOL(blk_bio_map_sg); /* * map a request to scatterlist, return number of sg entries setup. Caller @@ -427,7 +453,7 @@ int blk_rq_map_sg(struct request_queue *q, struct request *rq, int nsegs = 0; if (rq->bio) - nsegs = __blk_bios_map_sg(q, rq->bio, sglist, &sg); + nsegs = __blk_bios_map_sg(q, rq->bio, sglist, &sg, false); if (unlikely(rq->cmd_flags & REQ_COPY_USER) && (blk_rq_bytes(rq) & q->dma_pad_mask)) { diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 1fd8fdf..5868062 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -1013,6 +1013,8 @@ extern void blk_queue_write_cache(struct request_queue *q, bool enabled, bool fu extern struct backing_dev_info *blk_get_backing_dev_info(struct block_device *bdev); extern int blk_rq_map_sg(struct request_queue *, struct request *, struct scatterlist *); +extern int blk_bio_map_sg(struct request_queue *q, struct bio *bio, + struct scatterlist *sglist); extern void blk_dump_rq_flags(struct request *, char *); extern long nr_blockdev_pages(void);
In dm-crypt, it need to map one bio to scatterlist for improving the hardware engine encryption efficiency. Thus this patch introduces the blk_bio_map_sg() function to map one bio with scatterlists. For avoiding the duplicated code in __blk_bios_map_sg() function, add one parameter to distinguish bio map or request map. Signed-off-by: Baolin Wang <baolin.wang@linaro.org> --- block/blk-merge.c | 36 +++++++++++++++++++++++++++++++----- include/linux/blkdev.h | 2 ++ 2 files changed, 33 insertions(+), 5 deletions(-)