[PATCH 29/40] vdpa: expose API vhost_vdpa_dma_batch_once

Si-Wei Liu posted 40 patches 11 months, 3 weeks ago
[PATCH 29/40] vdpa: expose API vhost_vdpa_dma_batch_once
Posted by Si-Wei Liu 11 months, 3 weeks ago
So that the batching API can be called from other file
externally than the local.

Signed-off-by: Si-Wei Liu <si-wei.liu@oracle.com>
---
 hw/virtio/vhost-vdpa.c         | 21 +++++++++++++++------
 include/hw/virtio/vhost-vdpa.h |  3 +++
 2 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/hw/virtio/vhost-vdpa.c b/hw/virtio/vhost-vdpa.c
index b7896a8..68dc01b 100644
--- a/hw/virtio/vhost-vdpa.c
+++ b/hw/virtio/vhost-vdpa.c
@@ -187,7 +187,7 @@ static bool vhost_vdpa_map_batch_begin(VhostVDPAShared *s, uint32_t asid)
     return true;
 }
 
-static int vhost_vdpa_dma_batch_begin_once(VhostVDPAShared *s, uint32_t asid)
+int vhost_vdpa_dma_batch_begin_once(VhostVDPAShared *s, uint32_t asid)
 {
     if (!(s->backend_cap & (0x1ULL << VHOST_BACKEND_F_IOTLB_BATCH))) {
         return 0;
@@ -237,7 +237,7 @@ static bool vhost_vdpa_dma_batch_end(VhostVDPAShared *s, uint32_t asid)
     return true;
 }
 
-static int vhost_vdpa_dma_batch_end_once(VhostVDPAShared *s, uint32_t asid)
+int vhost_vdpa_dma_batch_end_once(VhostVDPAShared *s, uint32_t asid)
 {
     if (!(s->backend_cap & (0x1ULL << VHOST_BACKEND_F_IOTLB_BATCH))) {
         return 0;
@@ -436,7 +436,12 @@ static void vhost_vdpa_listener_region_add(MemoryListener *listener,
         iova = mem_region.iova;
     }
 
-    vhost_vdpa_dma_batch_begin_once(s, VHOST_VDPA_GUEST_PA_ASID);
+    ret = vhost_vdpa_dma_batch_begin_once(s, VHOST_VDPA_GUEST_PA_ASID);
+    if (unlikely(ret)) {
+        error_report("Can't batch mapping on asid 0 (%p)", s);
+        goto fail_map;
+    }
+
     ret = vhost_vdpa_dma_map(s, VHOST_VDPA_GUEST_PA_ASID, iova,
                              int128_get64(llsize), vaddr, section->readonly);
     if (ret) {
@@ -518,7 +523,11 @@ static void vhost_vdpa_listener_region_del(MemoryListener *listener,
         iova = result->iova;
         vhost_iova_tree_remove(s->iova_tree, *result);
     }
-    vhost_vdpa_dma_batch_begin_once(s, VHOST_VDPA_GUEST_PA_ASID);
+    ret = vhost_vdpa_dma_batch_begin_once(s, VHOST_VDPA_GUEST_PA_ASID);
+    if (ret) {
+        error_report("Can't batch mapping on asid 0 (%p)", s);
+    }
+
     /*
      * The unmap ioctl doesn't accept a full 64-bit. need to check it
      */
@@ -1396,10 +1405,10 @@ static void *vhost_vdpa_load_map(void *opaque)
                                      msg->iotlb.size);
             break;
         case VHOST_IOTLB_BATCH_BEGIN:
-            vhost_vdpa_dma_batch_begin_once(shared, msg->asid);
+            r = vhost_vdpa_dma_batch_begin_once(shared, msg->asid);
             break;
         case VHOST_IOTLB_BATCH_END:
-            vhost_vdpa_dma_batch_end_once(shared, msg->asid);
+            r = vhost_vdpa_dma_batch_end_once(shared, msg->asid);
             break;
         default:
             error_report("Invalid IOTLB msg type %d", msg->iotlb.type);
diff --git a/include/hw/virtio/vhost-vdpa.h b/include/hw/virtio/vhost-vdpa.h
index 219316f..aa13679 100644
--- a/include/hw/virtio/vhost-vdpa.h
+++ b/include/hw/virtio/vhost-vdpa.h
@@ -106,6 +106,9 @@ int vhost_vdpa_dma_map(VhostVDPAShared *s, uint32_t asid, hwaddr iova,
                        hwaddr size, void *vaddr, bool readonly);
 int vhost_vdpa_dma_unmap(VhostVDPAShared *s, uint32_t asid, hwaddr iova,
                          hwaddr size);
+int vhost_vdpa_dma_batch_begin_once(VhostVDPAShared *s, uint32_t asid);
+int vhost_vdpa_dma_batch_end_once(VhostVDPAShared *s, uint32_t asid);
+
 int vhost_vdpa_load_setup(VhostVDPAShared *s, AddressSpace *dma_as);
 int vhost_vdpa_load_cleanup(VhostVDPAShared *s, bool vhost_will_start);
 
-- 
1.8.3.1
Re: [PATCH 29/40] vdpa: expose API vhost_vdpa_dma_batch_once
Posted by Jason Wang 10 months, 2 weeks ago
On Fri, Dec 8, 2023 at 2:51 AM Si-Wei Liu <si-wei.liu@oracle.com> wrote:
>
> So that the batching API can be called from other file
> externally than the local.
>
> Signed-off-by: Si-Wei Liu <si-wei.liu@oracle.com>
> ---
>  hw/virtio/vhost-vdpa.c         | 21 +++++++++++++++------
>  include/hw/virtio/vhost-vdpa.h |  3 +++
>  2 files changed, 18 insertions(+), 6 deletions(-)
>
> diff --git a/hw/virtio/vhost-vdpa.c b/hw/virtio/vhost-vdpa.c
> index b7896a8..68dc01b 100644
> --- a/hw/virtio/vhost-vdpa.c
> +++ b/hw/virtio/vhost-vdpa.c
> @@ -187,7 +187,7 @@ static bool vhost_vdpa_map_batch_begin(VhostVDPAShared *s, uint32_t asid)
>      return true;
>  }
>
> -static int vhost_vdpa_dma_batch_begin_once(VhostVDPAShared *s, uint32_t asid)
> +int vhost_vdpa_dma_batch_begin_once(VhostVDPAShared *s, uint32_t asid)
>  {
>      if (!(s->backend_cap & (0x1ULL << VHOST_BACKEND_F_IOTLB_BATCH))) {
>          return 0;
> @@ -237,7 +237,7 @@ static bool vhost_vdpa_dma_batch_end(VhostVDPAShared *s, uint32_t asid)
>      return true;
>  }
>
> -static int vhost_vdpa_dma_batch_end_once(VhostVDPAShared *s, uint32_t asid)
> +int vhost_vdpa_dma_batch_end_once(VhostVDPAShared *s, uint32_t asid)
>  {
>      if (!(s->backend_cap & (0x1ULL << VHOST_BACKEND_F_IOTLB_BATCH))) {
>          return 0;
> @@ -436,7 +436,12 @@ static void vhost_vdpa_listener_region_add(MemoryListener *listener,
>          iova = mem_region.iova;
>      }
>
> -    vhost_vdpa_dma_batch_begin_once(s, VHOST_VDPA_GUEST_PA_ASID);
> +    ret = vhost_vdpa_dma_batch_begin_once(s, VHOST_VDPA_GUEST_PA_ASID);
> +    if (unlikely(ret)) {
> +        error_report("Can't batch mapping on asid 0 (%p)", s);
> +        goto fail_map;
> +    }
> +

This seems like another patch.

>      ret = vhost_vdpa_dma_map(s, VHOST_VDPA_GUEST_PA_ASID, iova,
>                               int128_get64(llsize), vaddr, section->readonly);
>      if (ret) {
> @@ -518,7 +523,11 @@ static void vhost_vdpa_listener_region_del(MemoryListener *listener,
>          iova = result->iova;
>          vhost_iova_tree_remove(s->iova_tree, *result);
>      }
> -    vhost_vdpa_dma_batch_begin_once(s, VHOST_VDPA_GUEST_PA_ASID);
> +    ret = vhost_vdpa_dma_batch_begin_once(s, VHOST_VDPA_GUEST_PA_ASID);
> +    if (ret) {
> +        error_report("Can't batch mapping on asid 0 (%p)", s);
> +    }

And this as well.

> +
>      /*
>       * The unmap ioctl doesn't accept a full 64-bit. need to check it
>       */
> @@ -1396,10 +1405,10 @@ static void *vhost_vdpa_load_map(void *opaque)
>                                       msg->iotlb.size);
>              break;
>          case VHOST_IOTLB_BATCH_BEGIN:
> -            vhost_vdpa_dma_batch_begin_once(shared, msg->asid);
> +            r = vhost_vdpa_dma_batch_begin_once(shared, msg->asid);
>              break;
>          case VHOST_IOTLB_BATCH_END:
> -            vhost_vdpa_dma_batch_end_once(shared, msg->asid);
> +            r = vhost_vdpa_dma_batch_end_once(shared, msg->asid);

And these.

Thanks

>              break;
>          default:
>              error_report("Invalid IOTLB msg type %d", msg->iotlb.type);
> diff --git a/include/hw/virtio/vhost-vdpa.h b/include/hw/virtio/vhost-vdpa.h
> index 219316f..aa13679 100644
> --- a/include/hw/virtio/vhost-vdpa.h
> +++ b/include/hw/virtio/vhost-vdpa.h
> @@ -106,6 +106,9 @@ int vhost_vdpa_dma_map(VhostVDPAShared *s, uint32_t asid, hwaddr iova,
>                         hwaddr size, void *vaddr, bool readonly);
>  int vhost_vdpa_dma_unmap(VhostVDPAShared *s, uint32_t asid, hwaddr iova,
>                           hwaddr size);
> +int vhost_vdpa_dma_batch_begin_once(VhostVDPAShared *s, uint32_t asid);
> +int vhost_vdpa_dma_batch_end_once(VhostVDPAShared *s, uint32_t asid);
> +
>  int vhost_vdpa_load_setup(VhostVDPAShared *s, AddressSpace *dma_as);
>  int vhost_vdpa_load_cleanup(VhostVDPAShared *s, bool vhost_will_start);
>
> --
> 1.8.3.1
>
Re: [PATCH 29/40] vdpa: expose API vhost_vdpa_dma_batch_once
Posted by Eugenio Perez Martin 11 months, 2 weeks ago
On Thu, Dec 7, 2023 at 7:51 PM Si-Wei Liu <si-wei.liu@oracle.com> wrote:
>
> So that the batching API can be called from other file
> externally than the local.
>
> Signed-off-by: Si-Wei Liu <si-wei.liu@oracle.com>
> ---
>  hw/virtio/vhost-vdpa.c         | 21 +++++++++++++++------
>  include/hw/virtio/vhost-vdpa.h |  3 +++
>  2 files changed, 18 insertions(+), 6 deletions(-)
>
> diff --git a/hw/virtio/vhost-vdpa.c b/hw/virtio/vhost-vdpa.c
> index b7896a8..68dc01b 100644
> --- a/hw/virtio/vhost-vdpa.c
> +++ b/hw/virtio/vhost-vdpa.c
> @@ -187,7 +187,7 @@ static bool vhost_vdpa_map_batch_begin(VhostVDPAShared *s, uint32_t asid)
>      return true;
>  }
>
> -static int vhost_vdpa_dma_batch_begin_once(VhostVDPAShared *s, uint32_t asid)
> +int vhost_vdpa_dma_batch_begin_once(VhostVDPAShared *s, uint32_t asid)
>  {
>      if (!(s->backend_cap & (0x1ULL << VHOST_BACKEND_F_IOTLB_BATCH))) {
>          return 0;
> @@ -237,7 +237,7 @@ static bool vhost_vdpa_dma_batch_end(VhostVDPAShared *s, uint32_t asid)
>      return true;
>  }
>
> -static int vhost_vdpa_dma_batch_end_once(VhostVDPAShared *s, uint32_t asid)
> +int vhost_vdpa_dma_batch_end_once(VhostVDPAShared *s, uint32_t asid)
>  {
>      if (!(s->backend_cap & (0x1ULL << VHOST_BACKEND_F_IOTLB_BATCH))) {
>          return 0;
> @@ -436,7 +436,12 @@ static void vhost_vdpa_listener_region_add(MemoryListener *listener,
>          iova = mem_region.iova;
>      }
>
> -    vhost_vdpa_dma_batch_begin_once(s, VHOST_VDPA_GUEST_PA_ASID);
> +    ret = vhost_vdpa_dma_batch_begin_once(s, VHOST_VDPA_GUEST_PA_ASID);
> +    if (unlikely(ret)) {
> +        error_report("Can't batch mapping on asid 0 (%p)", s);

Can we move this error to vhost_vdpa_dma_batch_begin_once?

That way we avoid duplicating the error message later in the patch and
we can tell the expected ASID.

> +        goto fail_map;
> +    }
> +
>      ret = vhost_vdpa_dma_map(s, VHOST_VDPA_GUEST_PA_ASID, iova,
>                               int128_get64(llsize), vaddr, section->readonly);
>      if (ret) {
> @@ -518,7 +523,11 @@ static void vhost_vdpa_listener_region_del(MemoryListener *listener,
>          iova = result->iova;
>          vhost_iova_tree_remove(s->iova_tree, *result);
>      }
> -    vhost_vdpa_dma_batch_begin_once(s, VHOST_VDPA_GUEST_PA_ASID);
> +    ret = vhost_vdpa_dma_batch_begin_once(s, VHOST_VDPA_GUEST_PA_ASID);
> +    if (ret) {
> +        error_report("Can't batch mapping on asid 0 (%p)", s);
> +    }
> +
>      /*
>       * The unmap ioctl doesn't accept a full 64-bit. need to check it
>       */
> @@ -1396,10 +1405,10 @@ static void *vhost_vdpa_load_map(void *opaque)
>                                       msg->iotlb.size);
>              break;
>          case VHOST_IOTLB_BATCH_BEGIN:
> -            vhost_vdpa_dma_batch_begin_once(shared, msg->asid);
> +            r = vhost_vdpa_dma_batch_begin_once(shared, msg->asid);
>              break;
>          case VHOST_IOTLB_BATCH_END:
> -            vhost_vdpa_dma_batch_end_once(shared, msg->asid);
> +            r = vhost_vdpa_dma_batch_end_once(shared, msg->asid);
>              break;
>          default:
>              error_report("Invalid IOTLB msg type %d", msg->iotlb.type);
> diff --git a/include/hw/virtio/vhost-vdpa.h b/include/hw/virtio/vhost-vdpa.h
> index 219316f..aa13679 100644
> --- a/include/hw/virtio/vhost-vdpa.h
> +++ b/include/hw/virtio/vhost-vdpa.h
> @@ -106,6 +106,9 @@ int vhost_vdpa_dma_map(VhostVDPAShared *s, uint32_t asid, hwaddr iova,
>                         hwaddr size, void *vaddr, bool readonly);
>  int vhost_vdpa_dma_unmap(VhostVDPAShared *s, uint32_t asid, hwaddr iova,
>                           hwaddr size);
> +int vhost_vdpa_dma_batch_begin_once(VhostVDPAShared *s, uint32_t asid);
> +int vhost_vdpa_dma_batch_end_once(VhostVDPAShared *s, uint32_t asid);
> +
>  int vhost_vdpa_load_setup(VhostVDPAShared *s, AddressSpace *dma_as);
>  int vhost_vdpa_load_cleanup(VhostVDPAShared *s, bool vhost_will_start);
>
> --
> 1.8.3.1
>