Message ID | 20200722102653.19224-2-guoqing.jiang@cloud.ionos.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Two patches for rnbd | expand |
On Wed, Jul 22, 2020 at 12:27 PM Guoqing Jiang <guoqing.jiang@cloud.ionos.com> wrote: > > The function only has one caller, so let's open code it in process_rdma. > Another bonus is we can avoid push/pop stack, since we need to pass 8 > arguments to rnbd_dev_submit_io. > > Signed-off-by: Guoqing Jiang <guoqing.jiang@cloud.ionos.com> > --- > drivers/block/rnbd/rnbd-srv-dev.c | 36 +++---------------------------- > drivers/block/rnbd/rnbd-srv-dev.h | 19 +++++----------- > drivers/block/rnbd/rnbd-srv.c | 32 +++++++++++++++++++-------- > 3 files changed, 31 insertions(+), 56 deletions(-) > > diff --git a/drivers/block/rnbd/rnbd-srv-dev.c b/drivers/block/rnbd/rnbd-srv-dev.c > index 5eddfd29ab64..49c62b506c9b 100644 > --- a/drivers/block/rnbd/rnbd-srv-dev.c > +++ b/drivers/block/rnbd/rnbd-srv-dev.c > @@ -45,7 +45,7 @@ void rnbd_dev_close(struct rnbd_dev *dev) > kfree(dev); > } > > -static void rnbd_dev_bi_end_io(struct bio *bio) > +void rnbd_dev_bi_end_io(struct bio *bio) > { > struct rnbd_dev_blk_io *io = bio->bi_private; > > @@ -63,8 +63,8 @@ static void rnbd_dev_bi_end_io(struct bio *bio) > * Map the kernel address into a bio suitable for io to a block > * device. Returns an error pointer in case of error. > */ > -static struct bio *rnbd_bio_map_kern(void *data, struct bio_set *bs, > - unsigned int len, gfp_t gfp_mask) > +struct bio *rnbd_bio_map_kern(void *data, struct bio_set *bs, > + unsigned int len, gfp_t gfp_mask) > { > unsigned long kaddr = (unsigned long)data; > unsigned long end = (kaddr + len + PAGE_SIZE - 1) >> PAGE_SHIFT; > @@ -102,33 +102,3 @@ static struct bio *rnbd_bio_map_kern(void *data, struct bio_set *bs, > bio->bi_end_io = bio_put; > return bio; > } > - > -int rnbd_dev_submit_io(struct rnbd_dev *dev, sector_t sector, void *data, > - size_t len, u32 bi_size, enum rnbd_io_flags flags, > - short prio, void *priv) > -{ > - struct rnbd_dev_blk_io *io; > - struct bio *bio; > - > - /* Generate bio with pages pointing to the rdma buffer */ > - bio = rnbd_bio_map_kern(data, dev->ibd_bio_set, len, GFP_KERNEL); > - if (IS_ERR(bio)) > - return PTR_ERR(bio); > - > - io = container_of(bio, struct rnbd_dev_blk_io, bio); > - > - io->dev = dev; > - io->priv = priv; > - > - bio->bi_end_io = rnbd_dev_bi_end_io; > - bio->bi_private = io; > - bio->bi_opf = rnbd_to_bio_flags(flags); > - bio->bi_iter.bi_sector = sector; > - bio->bi_iter.bi_size = bi_size; > - bio_set_prio(bio, prio); > - bio_set_dev(bio, dev->bdev); > - > - submit_bio(bio); > - > - return 0; > -} > diff --git a/drivers/block/rnbd/rnbd-srv-dev.h b/drivers/block/rnbd/rnbd-srv-dev.h > index 0f65b09a270e..0eb23850afb9 100644 > --- a/drivers/block/rnbd/rnbd-srv-dev.h > +++ b/drivers/block/rnbd/rnbd-srv-dev.h > @@ -41,6 +41,11 @@ void rnbd_dev_close(struct rnbd_dev *dev); > > void rnbd_endio(void *priv, int error); > > +void rnbd_dev_bi_end_io(struct bio *bio); > + > +struct bio *rnbd_bio_map_kern(void *data, struct bio_set *bs, > + unsigned int len, gfp_t gfp_mask); > + > static inline int rnbd_dev_get_max_segs(const struct rnbd_dev *dev) > { > return queue_max_segments(bdev_get_queue(dev->bdev)); > @@ -75,18 +80,4 @@ static inline int rnbd_dev_get_discard_alignment(const struct rnbd_dev *dev) > return bdev_get_queue(dev->bdev)->limits.discard_alignment; > } > > -/** > - * rnbd_dev_submit_io() - Submit an I/O to the disk > - * @dev: device to that the I/O is submitted > - * @sector: address to read/write data to > - * @data: I/O data to write or buffer to read I/O date into > - * @len: length of @data > - * @bi_size: Amount of data that will be read/written > - * @prio: IO priority > - * @priv: private data passed to @io_fn > - */ > -int rnbd_dev_submit_io(struct rnbd_dev *dev, sector_t sector, void *data, > - size_t len, u32 bi_size, enum rnbd_io_flags flags, > - short prio, void *priv); > - > #endif /* RNBD_SRV_DEV_H */ > diff --git a/drivers/block/rnbd/rnbd-srv.c b/drivers/block/rnbd/rnbd-srv.c > index 86e61523907b..0fb94843a495 100644 > --- a/drivers/block/rnbd/rnbd-srv.c > +++ b/drivers/block/rnbd/rnbd-srv.c > @@ -124,6 +124,9 @@ static int process_rdma(struct rtrs_srv *sess, > struct rnbd_srv_sess_dev *sess_dev; > u32 dev_id; > int err; > + struct rnbd_dev_blk_io *io; > + struct bio *bio; > + short prio; > > priv = kmalloc(sizeof(*priv), GFP_KERNEL); > if (!priv) > @@ -142,18 +145,29 @@ static int process_rdma(struct rtrs_srv *sess, > priv->sess_dev = sess_dev; > priv->id = id; > > - err = rnbd_dev_submit_io(sess_dev->rnbd_dev, le64_to_cpu(msg->sector), > - data, datalen, le32_to_cpu(msg->bi_size), > - le32_to_cpu(msg->rw), > - srv_sess->ver < RNBD_PROTO_VER_MAJOR || > - usrlen < sizeof(*msg) ? > - 0 : le16_to_cpu(msg->prio), priv); > - if (unlikely(err)) { > - rnbd_srv_err(sess_dev, "Submitting I/O to device failed, err: %d\n", > - err); > + /* Generate bio with pages pointing to the rdma buffer */ > + bio = rnbd_bio_map_kern(data, sess_dev->rnbd_dev->ibd_bio_set, datalen, GFP_KERNEL); > + if (IS_ERR(bio)) { > + rnbd_srv_err(sess_dev, "Failed to generate bio, err: %ld\n", PTR_ERR(bio)); > goto sess_dev_put; > } > > + io = container_of(bio, struct rnbd_dev_blk_io, bio); > + io->dev = sess_dev->rnbd_dev; > + io->priv = priv; > + > + bio->bi_end_io = rnbd_dev_bi_end_io; > + bio->bi_private = io; > + bio->bi_opf = rnbd_to_bio_flags(le32_to_cpu(msg->rw)); > + bio->bi_iter.bi_sector = le64_to_cpu(msg->sector); > + bio->bi_iter.bi_size = le32_to_cpu(msg->bi_size); > + prio = srv_sess->ver < RNBD_PROTO_VER_MAJOR || > + usrlen < sizeof(*msg) ? 0 : le16_to_cpu(msg->prio); > + bio_set_prio(bio, prio); > + bio_set_dev(bio, sess_dev->rnbd_dev->bdev); > + > + submit_bio(bio); > + > return 0; > > sess_dev_put: > -- > 2.17.1 > Looks good. Thank you! Acked-by: Danil Kipnis <danil.kipnis@cloud.ionos.com>
On Wed, Jul 22, 2020 at 12:27 PM Guoqing Jiang <guoqing.jiang@cloud.ionos.com> wrote: > > The function only has one caller, so let's open code it in process_rdma. > Another bonus is we can avoid push/pop stack, since we need to pass 8 > arguments to rnbd_dev_submit_io. > > Signed-off-by: Guoqing Jiang <guoqing.jiang@cloud.ionos.com> Thanks! Acked-by: Jack Wang <jinpu.wang@cloud.ionos.com> > --- > drivers/block/rnbd/rnbd-srv-dev.c | 36 +++---------------------------- > drivers/block/rnbd/rnbd-srv-dev.h | 19 +++++----------- > drivers/block/rnbd/rnbd-srv.c | 32 +++++++++++++++++++-------- > 3 files changed, 31 insertions(+), 56 deletions(-) > > diff --git a/drivers/block/rnbd/rnbd-srv-dev.c b/drivers/block/rnbd/rnbd-srv-dev.c > index 5eddfd29ab64..49c62b506c9b 100644 > --- a/drivers/block/rnbd/rnbd-srv-dev.c > +++ b/drivers/block/rnbd/rnbd-srv-dev.c > @@ -45,7 +45,7 @@ void rnbd_dev_close(struct rnbd_dev *dev) > kfree(dev); > } > > -static void rnbd_dev_bi_end_io(struct bio *bio) > +void rnbd_dev_bi_end_io(struct bio *bio) > { > struct rnbd_dev_blk_io *io = bio->bi_private; > > @@ -63,8 +63,8 @@ static void rnbd_dev_bi_end_io(struct bio *bio) > * Map the kernel address into a bio suitable for io to a block > * device. Returns an error pointer in case of error. > */ > -static struct bio *rnbd_bio_map_kern(void *data, struct bio_set *bs, > - unsigned int len, gfp_t gfp_mask) > +struct bio *rnbd_bio_map_kern(void *data, struct bio_set *bs, > + unsigned int len, gfp_t gfp_mask) > { > unsigned long kaddr = (unsigned long)data; > unsigned long end = (kaddr + len + PAGE_SIZE - 1) >> PAGE_SHIFT; > @@ -102,33 +102,3 @@ static struct bio *rnbd_bio_map_kern(void *data, struct bio_set *bs, > bio->bi_end_io = bio_put; > return bio; > } > - > -int rnbd_dev_submit_io(struct rnbd_dev *dev, sector_t sector, void *data, > - size_t len, u32 bi_size, enum rnbd_io_flags flags, > - short prio, void *priv) > -{ > - struct rnbd_dev_blk_io *io; > - struct bio *bio; > - > - /* Generate bio with pages pointing to the rdma buffer */ > - bio = rnbd_bio_map_kern(data, dev->ibd_bio_set, len, GFP_KERNEL); > - if (IS_ERR(bio)) > - return PTR_ERR(bio); > - > - io = container_of(bio, struct rnbd_dev_blk_io, bio); > - > - io->dev = dev; > - io->priv = priv; > - > - bio->bi_end_io = rnbd_dev_bi_end_io; > - bio->bi_private = io; > - bio->bi_opf = rnbd_to_bio_flags(flags); > - bio->bi_iter.bi_sector = sector; > - bio->bi_iter.bi_size = bi_size; > - bio_set_prio(bio, prio); > - bio_set_dev(bio, dev->bdev); > - > - submit_bio(bio); > - > - return 0; > -} > diff --git a/drivers/block/rnbd/rnbd-srv-dev.h b/drivers/block/rnbd/rnbd-srv-dev.h > index 0f65b09a270e..0eb23850afb9 100644 > --- a/drivers/block/rnbd/rnbd-srv-dev.h > +++ b/drivers/block/rnbd/rnbd-srv-dev.h > @@ -41,6 +41,11 @@ void rnbd_dev_close(struct rnbd_dev *dev); > > void rnbd_endio(void *priv, int error); > > +void rnbd_dev_bi_end_io(struct bio *bio); > + > +struct bio *rnbd_bio_map_kern(void *data, struct bio_set *bs, > + unsigned int len, gfp_t gfp_mask); > + > static inline int rnbd_dev_get_max_segs(const struct rnbd_dev *dev) > { > return queue_max_segments(bdev_get_queue(dev->bdev)); > @@ -75,18 +80,4 @@ static inline int rnbd_dev_get_discard_alignment(const struct rnbd_dev *dev) > return bdev_get_queue(dev->bdev)->limits.discard_alignment; > } > > -/** > - * rnbd_dev_submit_io() - Submit an I/O to the disk > - * @dev: device to that the I/O is submitted > - * @sector: address to read/write data to > - * @data: I/O data to write or buffer to read I/O date into > - * @len: length of @data > - * @bi_size: Amount of data that will be read/written > - * @prio: IO priority > - * @priv: private data passed to @io_fn > - */ > -int rnbd_dev_submit_io(struct rnbd_dev *dev, sector_t sector, void *data, > - size_t len, u32 bi_size, enum rnbd_io_flags flags, > - short prio, void *priv); > - > #endif /* RNBD_SRV_DEV_H */ > diff --git a/drivers/block/rnbd/rnbd-srv.c b/drivers/block/rnbd/rnbd-srv.c > index 86e61523907b..0fb94843a495 100644 > --- a/drivers/block/rnbd/rnbd-srv.c > +++ b/drivers/block/rnbd/rnbd-srv.c > @@ -124,6 +124,9 @@ static int process_rdma(struct rtrs_srv *sess, > struct rnbd_srv_sess_dev *sess_dev; > u32 dev_id; > int err; > + struct rnbd_dev_blk_io *io; > + struct bio *bio; > + short prio; > > priv = kmalloc(sizeof(*priv), GFP_KERNEL); > if (!priv) > @@ -142,18 +145,29 @@ static int process_rdma(struct rtrs_srv *sess, > priv->sess_dev = sess_dev; > priv->id = id; > > - err = rnbd_dev_submit_io(sess_dev->rnbd_dev, le64_to_cpu(msg->sector), > - data, datalen, le32_to_cpu(msg->bi_size), > - le32_to_cpu(msg->rw), > - srv_sess->ver < RNBD_PROTO_VER_MAJOR || > - usrlen < sizeof(*msg) ? > - 0 : le16_to_cpu(msg->prio), priv); > - if (unlikely(err)) { > - rnbd_srv_err(sess_dev, "Submitting I/O to device failed, err: %d\n", > - err); > + /* Generate bio with pages pointing to the rdma buffer */ > + bio = rnbd_bio_map_kern(data, sess_dev->rnbd_dev->ibd_bio_set, datalen, GFP_KERNEL); > + if (IS_ERR(bio)) { > + rnbd_srv_err(sess_dev, "Failed to generate bio, err: %ld\n", PTR_ERR(bio)); > goto sess_dev_put; > } > > + io = container_of(bio, struct rnbd_dev_blk_io, bio); > + io->dev = sess_dev->rnbd_dev; > + io->priv = priv; > + > + bio->bi_end_io = rnbd_dev_bi_end_io; > + bio->bi_private = io; > + bio->bi_opf = rnbd_to_bio_flags(le32_to_cpu(msg->rw)); > + bio->bi_iter.bi_sector = le64_to_cpu(msg->sector); > + bio->bi_iter.bi_size = le32_to_cpu(msg->bi_size); > + prio = srv_sess->ver < RNBD_PROTO_VER_MAJOR || > + usrlen < sizeof(*msg) ? 0 : le16_to_cpu(msg->prio); > + bio_set_prio(bio, prio); > + bio_set_dev(bio, sess_dev->rnbd_dev->bdev); > + > + submit_bio(bio); > + > return 0; > > sess_dev_put: > -- > 2.17.1 >
diff --git a/drivers/block/rnbd/rnbd-srv-dev.c b/drivers/block/rnbd/rnbd-srv-dev.c index 5eddfd29ab64..49c62b506c9b 100644 --- a/drivers/block/rnbd/rnbd-srv-dev.c +++ b/drivers/block/rnbd/rnbd-srv-dev.c @@ -45,7 +45,7 @@ void rnbd_dev_close(struct rnbd_dev *dev) kfree(dev); } -static void rnbd_dev_bi_end_io(struct bio *bio) +void rnbd_dev_bi_end_io(struct bio *bio) { struct rnbd_dev_blk_io *io = bio->bi_private; @@ -63,8 +63,8 @@ static void rnbd_dev_bi_end_io(struct bio *bio) * Map the kernel address into a bio suitable for io to a block * device. Returns an error pointer in case of error. */ -static struct bio *rnbd_bio_map_kern(void *data, struct bio_set *bs, - unsigned int len, gfp_t gfp_mask) +struct bio *rnbd_bio_map_kern(void *data, struct bio_set *bs, + unsigned int len, gfp_t gfp_mask) { unsigned long kaddr = (unsigned long)data; unsigned long end = (kaddr + len + PAGE_SIZE - 1) >> PAGE_SHIFT; @@ -102,33 +102,3 @@ static struct bio *rnbd_bio_map_kern(void *data, struct bio_set *bs, bio->bi_end_io = bio_put; return bio; } - -int rnbd_dev_submit_io(struct rnbd_dev *dev, sector_t sector, void *data, - size_t len, u32 bi_size, enum rnbd_io_flags flags, - short prio, void *priv) -{ - struct rnbd_dev_blk_io *io; - struct bio *bio; - - /* Generate bio with pages pointing to the rdma buffer */ - bio = rnbd_bio_map_kern(data, dev->ibd_bio_set, len, GFP_KERNEL); - if (IS_ERR(bio)) - return PTR_ERR(bio); - - io = container_of(bio, struct rnbd_dev_blk_io, bio); - - io->dev = dev; - io->priv = priv; - - bio->bi_end_io = rnbd_dev_bi_end_io; - bio->bi_private = io; - bio->bi_opf = rnbd_to_bio_flags(flags); - bio->bi_iter.bi_sector = sector; - bio->bi_iter.bi_size = bi_size; - bio_set_prio(bio, prio); - bio_set_dev(bio, dev->bdev); - - submit_bio(bio); - - return 0; -} diff --git a/drivers/block/rnbd/rnbd-srv-dev.h b/drivers/block/rnbd/rnbd-srv-dev.h index 0f65b09a270e..0eb23850afb9 100644 --- a/drivers/block/rnbd/rnbd-srv-dev.h +++ b/drivers/block/rnbd/rnbd-srv-dev.h @@ -41,6 +41,11 @@ void rnbd_dev_close(struct rnbd_dev *dev); void rnbd_endio(void *priv, int error); +void rnbd_dev_bi_end_io(struct bio *bio); + +struct bio *rnbd_bio_map_kern(void *data, struct bio_set *bs, + unsigned int len, gfp_t gfp_mask); + static inline int rnbd_dev_get_max_segs(const struct rnbd_dev *dev) { return queue_max_segments(bdev_get_queue(dev->bdev)); @@ -75,18 +80,4 @@ static inline int rnbd_dev_get_discard_alignment(const struct rnbd_dev *dev) return bdev_get_queue(dev->bdev)->limits.discard_alignment; } -/** - * rnbd_dev_submit_io() - Submit an I/O to the disk - * @dev: device to that the I/O is submitted - * @sector: address to read/write data to - * @data: I/O data to write or buffer to read I/O date into - * @len: length of @data - * @bi_size: Amount of data that will be read/written - * @prio: IO priority - * @priv: private data passed to @io_fn - */ -int rnbd_dev_submit_io(struct rnbd_dev *dev, sector_t sector, void *data, - size_t len, u32 bi_size, enum rnbd_io_flags flags, - short prio, void *priv); - #endif /* RNBD_SRV_DEV_H */ diff --git a/drivers/block/rnbd/rnbd-srv.c b/drivers/block/rnbd/rnbd-srv.c index 86e61523907b..0fb94843a495 100644 --- a/drivers/block/rnbd/rnbd-srv.c +++ b/drivers/block/rnbd/rnbd-srv.c @@ -124,6 +124,9 @@ static int process_rdma(struct rtrs_srv *sess, struct rnbd_srv_sess_dev *sess_dev; u32 dev_id; int err; + struct rnbd_dev_blk_io *io; + struct bio *bio; + short prio; priv = kmalloc(sizeof(*priv), GFP_KERNEL); if (!priv) @@ -142,18 +145,29 @@ static int process_rdma(struct rtrs_srv *sess, priv->sess_dev = sess_dev; priv->id = id; - err = rnbd_dev_submit_io(sess_dev->rnbd_dev, le64_to_cpu(msg->sector), - data, datalen, le32_to_cpu(msg->bi_size), - le32_to_cpu(msg->rw), - srv_sess->ver < RNBD_PROTO_VER_MAJOR || - usrlen < sizeof(*msg) ? - 0 : le16_to_cpu(msg->prio), priv); - if (unlikely(err)) { - rnbd_srv_err(sess_dev, "Submitting I/O to device failed, err: %d\n", - err); + /* Generate bio with pages pointing to the rdma buffer */ + bio = rnbd_bio_map_kern(data, sess_dev->rnbd_dev->ibd_bio_set, datalen, GFP_KERNEL); + if (IS_ERR(bio)) { + rnbd_srv_err(sess_dev, "Failed to generate bio, err: %ld\n", PTR_ERR(bio)); goto sess_dev_put; } + io = container_of(bio, struct rnbd_dev_blk_io, bio); + io->dev = sess_dev->rnbd_dev; + io->priv = priv; + + bio->bi_end_io = rnbd_dev_bi_end_io; + bio->bi_private = io; + bio->bi_opf = rnbd_to_bio_flags(le32_to_cpu(msg->rw)); + bio->bi_iter.bi_sector = le64_to_cpu(msg->sector); + bio->bi_iter.bi_size = le32_to_cpu(msg->bi_size); + prio = srv_sess->ver < RNBD_PROTO_VER_MAJOR || + usrlen < sizeof(*msg) ? 0 : le16_to_cpu(msg->prio); + bio_set_prio(bio, prio); + bio_set_dev(bio, sess_dev->rnbd_dev->bdev); + + submit_bio(bio); + return 0; sess_dev_put:
The function only has one caller, so let's open code it in process_rdma. Another bonus is we can avoid push/pop stack, since we need to pass 8 arguments to rnbd_dev_submit_io. Signed-off-by: Guoqing Jiang <guoqing.jiang@cloud.ionos.com> --- drivers/block/rnbd/rnbd-srv-dev.c | 36 +++---------------------------- drivers/block/rnbd/rnbd-srv-dev.h | 19 +++++----------- drivers/block/rnbd/rnbd-srv.c | 32 +++++++++++++++++++-------- 3 files changed, 31 insertions(+), 56 deletions(-)