Christoph Hellwig
2022-Feb-22 15:48 UTC
[PATCH] vhost: use bvec_kmap_local in {get,put}u16_iotlb
Using local kmaps slightly reduces the chances to stray writes, and
the bvec interface cleans up the code a little bit.
Signed-off-by: Christoph Hellwig <hch at lst.de>
---
drivers/vhost/vringh.c | 18 ++++++++----------
1 file changed, 8 insertions(+), 10 deletions(-)
diff --git a/drivers/vhost/vringh.c b/drivers/vhost/vringh.c
index 14e2043d76852..0f22a83fd09af 100644
--- a/drivers/vhost/vringh.c
+++ b/drivers/vhost/vringh.c
@@ -1173,7 +1173,7 @@ static inline int getu16_iotlb(const struct vringh *vrh,
u16 *val, const __virtio16 *p)
{
struct bio_vec iov;
- void *kaddr, *from;
+ void *kaddr;
int ret;
/* Atomic read is needed for getu16 */
@@ -1182,10 +1182,9 @@ static inline int getu16_iotlb(const struct vringh *vrh,
if (ret < 0)
return ret;
- kaddr = kmap_atomic(iov.bv_page);
- from = kaddr + iov.bv_offset;
- *val = vringh16_to_cpu(vrh, READ_ONCE(*(__virtio16 *)from));
- kunmap_atomic(kaddr);
+ kaddr = bvec_kmap_local(&iov);
+ *val = vringh16_to_cpu(vrh, READ_ONCE(*(__virtio16 *)kaddr));
+ kunmap_local(kaddr);
return 0;
}
@@ -1194,7 +1193,7 @@ static inline int putu16_iotlb(const struct vringh *vrh,
__virtio16 *p, u16 val)
{
struct bio_vec iov;
- void *kaddr, *to;
+ void *kaddr;
int ret;
/* Atomic write is needed for putu16 */
@@ -1203,10 +1202,9 @@ static inline int putu16_iotlb(const struct vringh *vrh,
if (ret < 0)
return ret;
- kaddr = kmap_atomic(iov.bv_page);
- to = kaddr + iov.bv_offset;
- WRITE_ONCE(*(__virtio16 *)to, cpu_to_vringh16(vrh, val));
- kunmap_atomic(kaddr);
+ kaddr = bvec_kmap_local(&iov);
+ WRITE_ONCE(*(__virtio16 *)kaddr, cpu_to_vringh16(vrh, val));
+ kunmap_local(kaddr);
return 0;
}
--
2.30.2
On Tue, Feb 22, 2022 at 11:49 PM Christoph Hellwig <hch at lst.de> wrote:> > Using local kmaps slightly reduces the chances to stray writes, and > the bvec interface cleans up the code a little bit. > > Signed-off-by: Christoph Hellwig <hch at lst.de>Acked-by: Jason Wang <jasowang at redhat.com>> --- > drivers/vhost/vringh.c | 18 ++++++++---------- > 1 file changed, 8 insertions(+), 10 deletions(-) > > diff --git a/drivers/vhost/vringh.c b/drivers/vhost/vringh.c > index 14e2043d76852..0f22a83fd09af 100644 > --- a/drivers/vhost/vringh.c > +++ b/drivers/vhost/vringh.c > @@ -1173,7 +1173,7 @@ static inline int getu16_iotlb(const struct vringh *vrh, > u16 *val, const __virtio16 *p) > { > struct bio_vec iov; > - void *kaddr, *from; > + void *kaddr; > int ret; > > /* Atomic read is needed for getu16 */ > @@ -1182,10 +1182,9 @@ static inline int getu16_iotlb(const struct vringh *vrh, > if (ret < 0) > return ret; > > - kaddr = kmap_atomic(iov.bv_page); > - from = kaddr + iov.bv_offset; > - *val = vringh16_to_cpu(vrh, READ_ONCE(*(__virtio16 *)from)); > - kunmap_atomic(kaddr); > + kaddr = bvec_kmap_local(&iov); > + *val = vringh16_to_cpu(vrh, READ_ONCE(*(__virtio16 *)kaddr)); > + kunmap_local(kaddr); > > return 0; > } > @@ -1194,7 +1193,7 @@ static inline int putu16_iotlb(const struct vringh *vrh, > __virtio16 *p, u16 val) > { > struct bio_vec iov; > - void *kaddr, *to; > + void *kaddr; > int ret; > > /* Atomic write is needed for putu16 */ > @@ -1203,10 +1202,9 @@ static inline int putu16_iotlb(const struct vringh *vrh, > if (ret < 0) > return ret; > > - kaddr = kmap_atomic(iov.bv_page); > - to = kaddr + iov.bv_offset; > - WRITE_ONCE(*(__virtio16 *)to, cpu_to_vringh16(vrh, val)); > - kunmap_atomic(kaddr); > + kaddr = bvec_kmap_local(&iov); > + WRITE_ONCE(*(__virtio16 *)kaddr, cpu_to_vringh16(vrh, val)); > + kunmap_local(kaddr); > > return 0; > } > -- > 2.30.2 >