[PATCH 16/22] xen-blkfront: Make use of the new sg_map helper function
From: Logan Gunthorpe <hidden>
Date: 2017-04-13 22:12:42
Also in:
dri-devel, intel-gfx, linux-crypto, linux-media, linux-mmc, linux-raid, linux-rdma, linux-scsi, lkml, nvdimm
Subsystem:
block layer, the rest, xen block subsystem, xen hypervisor interface · Maintainers:
Jens Axboe, Linus Torvalds, Roger Pau Monné, Juergen Gross, Stefano Stabellini
Straightforward conversion to the new helper, except due to
the lack of error path, we have to warn if unmapable memory
is ever present in the sgl.
Signed-off-by: Logan Gunthorpe <logang-OTvnGxWRz7hWk0Htik3J/w@public.gmane.org>
---
drivers/block/xen-blkfront.c | 33 +++++++++++++++++++++++++++------
1 file changed, 27 insertions(+), 6 deletions(-)
diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c
index 5067a0a..7dcf41d 100644
--- a/drivers/block/xen-blkfront.c
+++ b/drivers/block/xen-blkfront.c
@@ -807,8 +807,19 @@ static int blkif_queue_rw_req(struct request *req, struct blkfront_ring_info *ri
BUG_ON(sg->offset + sg->length > PAGE_SIZE);
if (setup.need_copy) {
- setup.bvec_off = sg->offset;
- setup.bvec_data = kmap_atomic(sg_page(sg));
+ setup.bvec_off = 0;
+ setup.bvec_data = sg_map(sg, SG_KMAP_ATOMIC);
+ if (IS_ERR(setup.bvec_data)) {
+ /*
+ * This should really never happen unless
+ * the code is changed to use memory that is
+ * not mappable in the sg. Seeing there is a
+ * questionable error path out of here,
+ * we WARN.
+ */
+ WARN(1, "Non-mappable memory used in sg!");
+ return 1;
+ }
}
gnttab_foreach_grant_in_range(sg_page(sg),@@ -818,7 +829,7 @@ static int blkif_queue_rw_req(struct request *req, struct blkfront_ring_info *ri
&setup);
if (setup.need_copy)
- kunmap_atomic(setup.bvec_data);
+ sg_unmap(sg, setup.bvec_data, SG_KMAP_ATOMIC);
}
if (setup.segments)
kunmap_atomic(setup.segments);
@@ -1468,8 +1479,18 @@ static bool blkif_completion(unsigned long *id,
for_each_sg(s->sg, sg, num_sg, i) {
BUG_ON(sg->offset + sg->length > PAGE_SIZE);
- data.bvec_offset = sg->offset;
- data.bvec_data = kmap_atomic(sg_page(sg));
+ data.bvec_offset = 0;
+ data.bvec_data = sg_map(sg, SG_KMAP_ATOMIC);
+ if (IS_ERR(data.bvec_data)) {
+ /*
+ * This should really never happen unless
+ * the code is changed to use memory that is
+ * not mappable in the sg. Seeing there is no
+ * clear error path, we WARN.
+ */
+ WARN(1, "Non-mappable memory used in sg!");
+ return 1;
+ }
gnttab_foreach_grant_in_range(sg_page(sg),
sg->offset,@@ -1477,7 +1498,7 @@ static bool blkif_completion(unsigned long *id,
blkif_copy_from_grant,
&data);
- kunmap_atomic(data.bvec_data);
+ sg_unmap(sg, data.bvec_data, SG_KMAP_ATOMIC);
}
}
/* Add the persistent grant into the list of free grants */
--
2.1.4