Message ID | 1664913657-3424-1-git-send-email-si-wei.liu@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | vhost-vdpa: allow passing opened vhostfd to vhost-vdpa | expand |
On Tue, Oct 4, 2022 at 11:09 PM Si-Wei Liu <si-wei.liu@oracle.com> wrote: > > Similar to other vhost backends, vhostfd can be passed to vhost-vdpa > backend as another parameter to instantiate vhost-vdpa net client. > This would benefit the use case where only open fd's, as oppposed to s/oppposed/opposed/ (realized by the mail client actually). Also, not an English native, but is it correct to use "fd's" there? Just "fds" or "file descriptors" sounds better to me, but I'm not sure about it. > raw vhost-vdpa device paths, are accessible from the QEMU process. > > (qemu) netdev_add type=vhost-vdpa,vhostfd=61,id=vhost-vdpa1 > > Signed-off-by: Si-Wei Liu <si-wei.liu@oracle.com> Apart from the typos, Acked-by: Eugenio PĂ©rez <eperezma@redhat.com> > --- > net/vhost-vdpa.c | 25 ++++++++++++++++++++----- > qapi/net.json | 3 +++ > qemu-options.hx | 6 ++++-- > 3 files changed, 27 insertions(+), 7 deletions(-) > > diff --git a/net/vhost-vdpa.c b/net/vhost-vdpa.c > index 182b3a1..366b070 100644 > --- a/net/vhost-vdpa.c > +++ b/net/vhost-vdpa.c > @@ -683,14 +683,29 @@ int net_init_vhost_vdpa(const Netdev *netdev, const char *name, > > assert(netdev->type == NET_CLIENT_DRIVER_VHOST_VDPA); > opts = &netdev->u.vhost_vdpa; > - if (!opts->vhostdev) { > - error_setg(errp, "vdpa character device not specified with vhostdev"); > + if (!opts->has_vhostdev && !opts->has_vhostfd) { > + error_setg(errp, > + "vhost-vdpa: neither vhostdev= nor vhostfd= was specified"); > return -1; > } > > - vdpa_device_fd = qemu_open(opts->vhostdev, O_RDWR, errp); > - if (vdpa_device_fd == -1) { > - return -errno; > + if (opts->has_vhostdev && opts->has_vhostfd) { > + error_setg(errp, > + "vhost-vdpa: vhostdev= and vhostfd= are mutually exclusive"); > + return -1; > + } > + > + if (opts->has_vhostdev) { > + vdpa_device_fd = qemu_open(opts->vhostdev, O_RDWR, errp); > + if (vdpa_device_fd == -1) { > + return -errno; > + } > + } else if (opts->has_vhostfd) { > + vdpa_device_fd = monitor_fd_param(monitor_cur(), opts->vhostfd, errp); > + if (vdpa_device_fd == -1) { > + error_prepend(errp, "vhost-vdpa: unable to parse vhostfd: "); > + return -1; > + } > } > > r = vhost_vdpa_get_features(vdpa_device_fd, &features, errp); > diff --git a/qapi/net.json b/qapi/net.json > index dd088c0..926ecc8 100644 > --- a/qapi/net.json > +++ b/qapi/net.json > @@ -442,6 +442,8 @@ > # @vhostdev: path of vhost-vdpa device > # (default:'/dev/vhost-vdpa-0') > # > +# @vhostfd: file descriptor of an already opened vhost vdpa device > +# > # @queues: number of queues to be created for multiqueue vhost-vdpa > # (default: 1) > # > @@ -456,6 +458,7 @@ > { 'struct': 'NetdevVhostVDPAOptions', > 'data': { > '*vhostdev': 'str', > + '*vhostfd': 'str', > '*queues': 'int', > '*x-svq': {'type': 'bool', 'features' : [ 'unstable'] } } } > > diff --git a/qemu-options.hx b/qemu-options.hx > index 913c71e..c040f74 100644 > --- a/qemu-options.hx > +++ b/qemu-options.hx > @@ -2774,8 +2774,10 @@ DEF("netdev", HAS_ARG, QEMU_OPTION_netdev, > " configure a vhost-user network, backed by a chardev 'dev'\n" > #endif > #ifdef __linux__ > - "-netdev vhost-vdpa,id=str,vhostdev=/path/to/dev\n" > + "-netdev vhost-vdpa,id=str[,vhostdev=/path/to/dev][,vhostfd=h]\n" > " configure a vhost-vdpa network,Establish a vhost-vdpa netdev\n" > + " use 'vhostdev=/path/to/dev' to open a vhost vdpa device\n" > + " use 'vhostfd=h' to connect to an already opened vhost vdpa device\n" > #endif > #ifdef CONFIG_VMNET > "-netdev vmnet-host,id=str[,isolated=on|off][,net-uuid=uuid]\n" > @@ -3280,7 +3282,7 @@ SRST > -netdev type=vhost-user,id=net0,chardev=chr0 \ > -device virtio-net-pci,netdev=net0 > > -``-netdev vhost-vdpa,vhostdev=/path/to/dev`` > +``-netdev vhost-vdpa[,vhostdev=/path/to/dev][,vhostfd=h]`` > Establish a vhost-vdpa netdev. > > vDPA device is a device that uses a datapath which complies with > -- > 1.8.3.1 > >
diff --git a/net/vhost-vdpa.c b/net/vhost-vdpa.c index 182b3a1..366b070 100644 --- a/net/vhost-vdpa.c +++ b/net/vhost-vdpa.c @@ -683,14 +683,29 @@ int net_init_vhost_vdpa(const Netdev *netdev, const char *name, assert(netdev->type == NET_CLIENT_DRIVER_VHOST_VDPA); opts = &netdev->u.vhost_vdpa; - if (!opts->vhostdev) { - error_setg(errp, "vdpa character device not specified with vhostdev"); + if (!opts->has_vhostdev && !opts->has_vhostfd) { + error_setg(errp, + "vhost-vdpa: neither vhostdev= nor vhostfd= was specified"); return -1; } - vdpa_device_fd = qemu_open(opts->vhostdev, O_RDWR, errp); - if (vdpa_device_fd == -1) { - return -errno; + if (opts->has_vhostdev && opts->has_vhostfd) { + error_setg(errp, + "vhost-vdpa: vhostdev= and vhostfd= are mutually exclusive"); + return -1; + } + + if (opts->has_vhostdev) { + vdpa_device_fd = qemu_open(opts->vhostdev, O_RDWR, errp); + if (vdpa_device_fd == -1) { + return -errno; + } + } else if (opts->has_vhostfd) { + vdpa_device_fd = monitor_fd_param(monitor_cur(), opts->vhostfd, errp); + if (vdpa_device_fd == -1) { + error_prepend(errp, "vhost-vdpa: unable to parse vhostfd: "); + return -1; + } } r = vhost_vdpa_get_features(vdpa_device_fd, &features, errp); diff --git a/qapi/net.json b/qapi/net.json index dd088c0..926ecc8 100644 --- a/qapi/net.json +++ b/qapi/net.json @@ -442,6 +442,8 @@ # @vhostdev: path of vhost-vdpa device # (default:'/dev/vhost-vdpa-0') # +# @vhostfd: file descriptor of an already opened vhost vdpa device +# # @queues: number of queues to be created for multiqueue vhost-vdpa # (default: 1) # @@ -456,6 +458,7 @@ { 'struct': 'NetdevVhostVDPAOptions', 'data': { '*vhostdev': 'str', + '*vhostfd': 'str', '*queues': 'int', '*x-svq': {'type': 'bool', 'features' : [ 'unstable'] } } } diff --git a/qemu-options.hx b/qemu-options.hx index 913c71e..c040f74 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -2774,8 +2774,10 @@ DEF("netdev", HAS_ARG, QEMU_OPTION_netdev, " configure a vhost-user network, backed by a chardev 'dev'\n" #endif #ifdef __linux__ - "-netdev vhost-vdpa,id=str,vhostdev=/path/to/dev\n" + "-netdev vhost-vdpa,id=str[,vhostdev=/path/to/dev][,vhostfd=h]\n" " configure a vhost-vdpa network,Establish a vhost-vdpa netdev\n" + " use 'vhostdev=/path/to/dev' to open a vhost vdpa device\n" + " use 'vhostfd=h' to connect to an already opened vhost vdpa device\n" #endif #ifdef CONFIG_VMNET "-netdev vmnet-host,id=str[,isolated=on|off][,net-uuid=uuid]\n" @@ -3280,7 +3282,7 @@ SRST -netdev type=vhost-user,id=net0,chardev=chr0 \ -device virtio-net-pci,netdev=net0 -``-netdev vhost-vdpa,vhostdev=/path/to/dev`` +``-netdev vhost-vdpa[,vhostdev=/path/to/dev][,vhostfd=h]`` Establish a vhost-vdpa netdev. vDPA device is a device that uses a datapath which complies with
Similar to other vhost backends, vhostfd can be passed to vhost-vdpa backend as another parameter to instantiate vhost-vdpa net client. This would benefit the use case where only open fd's, as oppposed to raw vhost-vdpa device paths, are accessible from the QEMU process. (qemu) netdev_add type=vhost-vdpa,vhostfd=61,id=vhost-vdpa1 Signed-off-by: Si-Wei Liu <si-wei.liu@oracle.com> --- net/vhost-vdpa.c | 25 ++++++++++++++++++++----- qapi/net.json | 3 +++ qemu-options.hx | 6 ++++-- 3 files changed, 27 insertions(+), 7 deletions(-)