[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH RFC v2 1/2] vhost: accept Xen guest RAM sections for vhost-user



On Mon, 29 Jun 2026, Dusan Stojkovic wrote:
> From: Dusan Stojkovic <Dusan.Stojkovic@xxxxxxxxx>
> 
> When QEMU runs as a Xen device model, the guest's RAM is not allocated
> by QEMU and is not backed by a file descriptor that could be shared
> with a vhost-user backend: accesses from QEMU go through the Xen
> mapcache and memory_region_get_fd() returns -1. vhost_section()
> therefore filters out every RAM section, the vhost memory listener
> registers no regions, and starting any vhost-user device fails with
> "Failed initializing vhost-user memory map".
> 
> With VHOST_USER_PROTOCOL_F_XEN_MMAP the backend does not need an fd or
> a process-local mapping it maps guest memory itself through the Xen
> foreign mapping interface, using the guest physical address and domain
> id. Accept the Xen RAM region in vhost_section() so that it reaches
> the backend's memory table.
> 
> The Xen grant region (xen.grants) must never be accepted: grant
> references can only be mapped individually on demand via
> address_space_map(), and deriving a host pointer for the whole region,
> as vhost_region_add_section() does, aborts in the Xen mapcache. Note
> that xen_mr_is_memory() returns true for both the RAM and the grants
> region, so the grants region is excluded explicitly.
> 
> Because of the necessity to exlude xen.grants, the missing stub for
> xen_mr_is_grants is added so that it can be called from common code.
> 
> Signed-off-by: Dusan Stojkovic <Dusan.Stojkovic@xxxxxxxxx>
> Signed-off-by: Nikola Jelic <Nikola.Jelic@xxxxxxxxx>
> ---
>  hw/virtio/vhost.c  | 18 ++++++++++++++++++
>  hw/xen/xen_stubs.c |  5 +++++
>  2 files changed, 23 insertions(+)
> 
> diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
> index af41841b52..26770d06d5 100644
> --- a/hw/virtio/vhost.c
> +++ b/hw/virtio/vhost.c
> @@ -29,6 +29,7 @@
>  #include "system/dma.h"
>  #include "system/memory.h"
>  #include "system/ramblock.h"
> +#include "system/xen.h"
>  #include "trace.h"
>  
>  /* enabled until disconnected backend stabilizes */
> @@ -657,6 +658,23 @@ static bool vhost_section(struct vhost_dev *dev, 
> MemoryRegionSection *section)
>              return false;
>          }
>  
> +        /*
> +         * Under Xen, the guest's RAM is not backed by an fd that
> +         * be passed to a vhost-user backend.  The backend instead

can be passed


> +         * guest memory through the Xen foreign mapping interface,

maps guest memory

Other than that it looks OK to me but someone more familier with
vhost-user should review the second patch

Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>


> +         * by guest physical address and domain id (see
> +         * VHOST_USER_PROTOCOL_F_XEN_MMAP), so accept the Xen RAM
> +         * region even though it has no fd.
> +         */
> +        if (xen_enabled()) {
> +            if (xen_mr_is_memory(mr) && !xen_mr_is_grants(mr)) {
> +                trace_vhost_section(mr->name);
> +                return true;
> +            }
> +            trace_vhost_reject_section(mr->name, 4);
> +            return false;
> +        }
> +
>          /*
>           * Some backends (like vhost-user) can only handle memory regions
>           * that have an fd (can be mapped into a different process). Filter
> diff --git a/hw/xen/xen_stubs.c b/hw/xen/xen_stubs.c
> index f830768d99..7af39bceb0 100644
> --- a/hw/xen/xen_stubs.c
> +++ b/hw/xen/xen_stubs.c
> @@ -29,6 +29,11 @@ bool xen_mr_is_memory(const MemoryRegion *mr)
>      g_assert_not_reached();
>  }
>  
> +bool xen_mr_is_grants(const MemoryRegion *mr)
> +{
> +    g_assert_not_reached();
> +}
> +
>  bool xen_map_cache_enabled(void)
>  {
>      return false;
> 
> -- 
> 2.43.0
> 



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.