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 >