Skip to content

Commit 1fe0640

Browse files
Christoph Hellwigaxboe
authored andcommitted
rnbd-srv: simplify bio mapping in process_rdma
The memory mapped in process_rdma is contiguous, so there is no need to loop over bio_add_page. Remove rnbd_bio_map_kern and just open code the bio allocation and mapping in the caller. Signed-off-by: Christoph Hellwig <[email protected]> Reviewed-by: Jack Wang <[email protected]> Tested-by: Jack Wang <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jens Axboe <[email protected]>
1 parent 4b1dc86 commit 1fe0640

File tree

3 files changed

+16
-69
lines changed

3 files changed

+16
-69
lines changed

drivers/block/rnbd/rnbd-srv-dev.c

Lines changed: 0 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -44,60 +44,3 @@ void rnbd_dev_close(struct rnbd_dev *dev)
4444
blkdev_put(dev->bdev, dev->blk_open_flags);
4545
kfree(dev);
4646
}
47-
48-
void rnbd_dev_bi_end_io(struct bio *bio)
49-
{
50-
struct rnbd_dev_blk_io *io = bio->bi_private;
51-
52-
rnbd_endio(io->priv, blk_status_to_errno(bio->bi_status));
53-
bio_put(bio);
54-
}
55-
56-
/**
57-
* rnbd_bio_map_kern - map kernel address into bio
58-
* @data: pointer to buffer to map
59-
* @bs: bio_set to use.
60-
* @len: length in bytes
61-
* @gfp_mask: allocation flags for bio allocation
62-
*
63-
* Map the kernel address into a bio suitable for io to a block
64-
* device. Returns an error pointer in case of error.
65-
*/
66-
struct bio *rnbd_bio_map_kern(void *data, struct bio_set *bs,
67-
unsigned int len, gfp_t gfp_mask)
68-
{
69-
unsigned long kaddr = (unsigned long)data;
70-
unsigned long end = (kaddr + len + PAGE_SIZE - 1) >> PAGE_SHIFT;
71-
unsigned long start = kaddr >> PAGE_SHIFT;
72-
const int nr_pages = end - start;
73-
int offset, i;
74-
struct bio *bio;
75-
76-
bio = bio_alloc_bioset(gfp_mask, nr_pages, bs);
77-
if (!bio)
78-
return ERR_PTR(-ENOMEM);
79-
80-
offset = offset_in_page(kaddr);
81-
for (i = 0; i < nr_pages; i++) {
82-
unsigned int bytes = PAGE_SIZE - offset;
83-
84-
if (len <= 0)
85-
break;
86-
87-
if (bytes > len)
88-
bytes = len;
89-
90-
if (bio_add_page(bio, virt_to_page(data), bytes,
91-
offset) < bytes) {
92-
/* we don't support partial mappings */
93-
bio_put(bio);
94-
return ERR_PTR(-EINVAL);
95-
}
96-
97-
data += bytes;
98-
len -= bytes;
99-
offset = 0;
100-
}
101-
102-
return bio;
103-
}

drivers/block/rnbd/rnbd-srv-dev.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,6 @@ void rnbd_dev_close(struct rnbd_dev *dev);
4141

4242
void rnbd_endio(void *priv, int error);
4343

44-
void rnbd_dev_bi_end_io(struct bio *bio);
45-
46-
struct bio *rnbd_bio_map_kern(void *data, struct bio_set *bs,
47-
unsigned int len, gfp_t gfp_mask);
48-
4944
static inline int rnbd_dev_get_max_segs(const struct rnbd_dev *dev)
5045
{
5146
return queue_max_segments(bdev_get_queue(dev->bdev));

drivers/block/rnbd/rnbd-srv.c

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,14 @@ rnbd_get_sess_dev(int dev_id, struct rnbd_srv_session *srv_sess)
114114
return sess_dev;
115115
}
116116

117+
static void rnbd_dev_bi_end_io(struct bio *bio)
118+
{
119+
struct rnbd_dev_blk_io *io = bio->bi_private;
120+
121+
rnbd_endio(io->priv, blk_status_to_errno(bio->bi_status));
122+
bio_put(bio);
123+
}
124+
117125
static int process_rdma(struct rnbd_srv_session *srv_sess,
118126
struct rtrs_srv_op *id, void *data, u32 datalen,
119127
const void *usr, size_t usrlen)
@@ -144,12 +152,12 @@ static int process_rdma(struct rnbd_srv_session *srv_sess,
144152
priv->sess_dev = sess_dev;
145153
priv->id = id;
146154

147-
/* Generate bio with pages pointing to the rdma buffer */
148-
bio = rnbd_bio_map_kern(data, sess_dev->rnbd_dev->ibd_bio_set, datalen, GFP_KERNEL);
149-
if (IS_ERR(bio)) {
150-
err = PTR_ERR(bio);
151-
rnbd_srv_err(sess_dev, "Failed to generate bio, err: %d\n", err);
152-
goto sess_dev_put;
155+
bio = bio_alloc_bioset(GFP_KERNEL, 1, sess_dev->rnbd_dev->ibd_bio_set);
156+
if (bio_add_page(bio, virt_to_page(data), datalen,
157+
offset_in_page(data)) != datalen) {
158+
rnbd_srv_err(sess_dev, "Failed to map data to bio\n");
159+
err = -EINVAL;
160+
goto bio_put;
153161
}
154162

155163
io = container_of(bio, struct rnbd_dev_blk_io, bio);
@@ -170,7 +178,8 @@ static int process_rdma(struct rnbd_srv_session *srv_sess,
170178

171179
return 0;
172180

173-
sess_dev_put:
181+
bio_put:
182+
bio_put(bio);
174183
rnbd_put_sess_dev(sess_dev);
175184
err:
176185
kfree(priv);

0 commit comments

Comments
 (0)