virtio_user exception path with external memory

Maxime Coquelin maxime.coquelin at redhat.com
Mon Oct 6 11:44:57 CEST 2025


Hi Pekka,

On 8/6/25 9:56 AM, Pekka Riikonen wrote:
> 
> It seems that currently it's not possible to use packet pools allocated 
> with external memory with the virtio_user exception path use case, 
> because it ignores extmem in virtio_user_mem_event_cb() (and also in the 
> kernel backend in add_memseg_list()).  This is easy to test with testpmd 
> with the --mp-alloc=xmemhuge or --mp-alloc=anon option (https:// 
> doc.dpdk.org/guides/howto/virtio_user_as_exception_path.html).
> 
> The original commit that added the check (5282bb1c3 mem: allow memseg 
> lists to be marked as external) talks about needing file descriptors in 
> virtio that aren't available with extmem, but at least the kernel 
> backend doesn't seem to need any.  The patch below fixes the issue for 
> me with with the exception path.
> 
> So I'm wondering whether ignoring the extmem is actually needed, in this 
> use case?

It might not be needed, but we would need to take care of not breaking 
backends that does not support extmem.

Could you prepare a formal patch?

Thanks,
Maxime

> 
> ---
> diff --git a/drivers/net/virtio/virtio_user/vhost_kernel.c b/drivers/ 
> net/virtio/virtio_user/vhost_kernel.c
> index e42bb35935..cd5b975675 100644
> --- a/drivers/net/virtio/virtio_user/vhost_kernel.c
> +++ b/drivers/net/virtio/virtio_user/vhost_kernel.c
> @@ -189,9 +189,6 @@ add_memseg_list(const struct rte_memseg_list *msl, 
> void *arg)
>       void *start_addr;
>       uint64_t len;
> 
> -    if (msl->external)
> -        return 0;
> -
>       if (vm->nregions >= max_regions)
>           return -1;
> 
> diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c b/drivers/ 
> net/virtio/virtio_user/virtio_user_dev.c
> index 187f81b066..d5204a64a7 100644
> --- a/drivers/net/virtio/virtio_user/virtio_user_dev.c
> +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c
> @@ -539,20 +539,14 @@ virtio_user_fill_intr_handle(struct 
> virtio_user_dev *dev)
> 
>   static void
>   virtio_user_mem_event_cb(enum rte_mem_event type __rte_unused,
> -             const void *addr,
> +             const void *addr __rte_unused,
>                size_t len __rte_unused,
>                void *arg)
>   {
>       struct virtio_user_dev *dev = arg;
> -    struct rte_memseg_list *msl;
>       uint16_t i;
>       int ret = 0;
> 
> -    /* ignore externally allocated memory */
> -    msl = rte_mem_virt2memseg_list(addr);
> -    if (msl->external)
> -        return;
> -
>       pthread_mutex_lock(&dev->mutex);
> 
>       if (dev->started == false)
> ---
> 
> Pekka
> 



More information about the dev mailing list