> -----Original Message----- > From: Hao Chen <ch...@yusur.tech> > Sent: Tuesday, October 11, 2022 10:56 AM > To: maxime.coque...@redhat.com; Xia, Chenbo <chenbo....@intel.com> > Cc: dev@dpdk.org; ho...@yusur.tech; z...@yusur.tech > Subject: [PATCH] example: vdpa: support run in nested virtualization > environment
Title should be: examples/vdpa: support running in nested virtualization environment > > 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); Why not use fprintf all string including the eal one? > + exit(1); I believe the exit should happen outside of the function. Thanks, Chenbo > } > > 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