When we run dpdk vdpa in the nested virtual machine vm-L1 and ping test in vm-L2, the ping is NG. The reason for troubleshooting is that the virtio net in vm-L2 sends control information to the vring, and the qemu back-end device in vm-L1 cannot obtain correct data from the vring. This problem is related to the opening of the vIOMMU.
This patch add option '--iommu-support' to use guest vIOMMU to protect vhost, then the ping test in vm-L2 is OK. This option is required in a nested virtualization environment. Signed-off-by: Hao Chen <ch...@yusur.tech> --- examples/vdpa/main.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/examples/vdpa/main.c b/examples/vdpa/main.c index 4c7e81d7b6..a24c78d7a4 100644 --- a/examples/vdpa/main.c +++ b/examples/vdpa/main.c @@ -43,16 +43,20 @@ static char iface[MAX_PATH_LEN]; static int devcnt; static int interactive; static int client_mode; +static int iommu_support; /* display usage */ static void vdpa_usage(const char *prgname) { - printf("Usage: %s [EAL options] -- " - " --interactive|-i: run in interactive mode.\n" - " --iface <path>: specify the path prefix of the socket files, e.g. /tmp/vhost-user-.\n" - " --client: register a vhost-user socket as client mode.\n", - prgname); + printf("Usage: %s [EAL options] --\n", prgname); + const char *usage_str = " --interactive|-i: run in interactive mode.\n" + " --iface <path>: specify the path prefix of the socket files, e.g. /tmp/vhost-user-.\n" + " --client: register a vhost-user socket as client mode.\n" + " --iommu-support: use guest vIOMMU to protect vhost.\n"; + + fprintf(stderr, "%s", usage_str); + exit(1); } static int @@ -63,6 +67,7 @@ parse_args(int argc, char **argv) {"iface", required_argument, NULL, 0}, {"interactive", no_argument, &interactive, 1}, {"client", no_argument, &client_mode, 1}, + {"iommu-support", no_argument, &iommu_support, 1}, {NULL, 0, 0, 0}, }; int opt, idx; @@ -220,6 +225,10 @@ start_vdpa(struct vdpa_port *vport) socket_path); return -1; } + + if (iommu_support) + vport->flags |= RTE_VHOST_USER_IOMMU_SUPPORT; + ret = rte_vhost_driver_register(socket_path, vport->flags); if (ret != 0) rte_exit(EXIT_FAILURE, -- 2.27.0