[libvirt] [PATCH v2 03/12] qemu: Make qemuMonitorAddHostNetwork to pass multiple FDs

Laine Stump laine at laine.org
Wed May 15 21:34:19 UTC 2013


On 05/13/2013 01:23 PM, Michal Privoznik wrote:
> Currently, only one tapfd and one vhostfd could be passed.
> However, multiqueue network requires several FDs to be passed to
> qemu so we must adapt out monitor handling functions to cope with
> that.
> ---
>  src/qemu/qemu_hotplug.c |  7 +++++--
>  src/qemu/qemu_monitor.c | 39 +++++++++++++++++++++++----------------
>  src/qemu/qemu_monitor.h |  4 ++--
>  3 files changed, 30 insertions(+), 20 deletions(-)
>
> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
> index d037c9d..b04f3bb 100644
> --- a/src/qemu/qemu_hotplug.c
> +++ b/src/qemu/qemu_hotplug.c
> @@ -813,8 +813,11 @@ int qemuDomainAttachNetDevice(virConnectPtr conn,
>      qemuDomainObjEnterMonitor(driver, vm);
>      if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_NETDEV) &&
>          virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE)) {
> -        if (qemuMonitorAddNetdev(priv->mon, netstr, tapfd, tapfd_name,
> -                                 vhostfd, vhostfd_name) < 0) {
> +        if (qemuMonitorAddNetdev(priv->mon, netstr,
> +                                 &tapfd, &tapfd_name,
> +                                 tapfd_name ? 1 : 0,
> +                                 &vhostfd, &vhostfd_name,
> +                                 vhostfd_name ? 1 : 0) < 0) {


That looks a bit obtuse, but of course it's all going to be corrected in
another patch or two...


>              qemuDomainObjExitMonitor(driver, vm);
>              virDomainAuditNet(vm, NULL, net, "attach", false);
>              goto cleanup;
> diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
> index 4deb2d6..c3f35b5 100644
> --- a/src/qemu/qemu_monitor.c
> +++ b/src/qemu/qemu_monitor.c
> @@ -2527,14 +2527,16 @@ int qemuMonitorRemoveHostNetwork(qemuMonitorPtr mon,
>  
>  int qemuMonitorAddNetdev(qemuMonitorPtr mon,
>                           const char *netdevstr,
> -                         int tapfd, const char *tapfd_name,
> -                         int vhostfd, const char *vhostfd_name)
> +                         int *tapfd, char **tapfdName, int tapfdSize,
> +                         int *vhostfd, char **vhostfdName, int vhostfdSize)
>  {
>      int ret = -1;
> -    VIR_DEBUG("mon=%p netdevstr=%s tapfd=%d tapfd_name=%s "
> -              "vhostfd=%d vhostfd_name=%s",
> -              mon, netdevstr, tapfd, NULLSTR(tapfd_name),
> -              vhostfd, NULLSTR(vhostfd_name));
> +    int i = 0, j = 0;
> +
> +    VIR_DEBUG("mon=%p netdevstr=%s tapfd=%p tapfdName=%p tapfdSize=%d"
> +              "vhostfd=%p vhostfdName=%p vhostfdSize=%d",
> +              mon, netdevstr, tapfd, tapfdName, tapfdSize,
> +              vhostfd, vhostfdName, tapfdSize);

The unfortunate thing here is that the debug log no longer displays the
actual fd, even in the common case of there being a single queue. On the
other hand, I've *never* gotten any use out of any of the "top of the
function" debug log messages anyway :-)


>  
>      if (!mon) {
>          virReportError(VIR_ERR_INVALID_ARG, "%s",
> @@ -2542,12 +2544,13 @@ int qemuMonitorAddNetdev(qemuMonitorPtr mon,
>          return -1;
>      }
>  
> -    if (tapfd >= 0 && qemuMonitorSendFileHandle(mon, tapfd_name, tapfd) < 0)
> -        return -1;
> -    if (vhostfd >= 0 &&
> -        qemuMonitorSendFileHandle(mon, vhostfd_name, vhostfd) < 0) {
> -        vhostfd = -1;
> -        goto cleanup;
> +    for (i = 0; i < tapfdSize; i++) {
> +        if (qemuMonitorSendFileHandle(mon, tapfdName[i], tapfd[i]) < 0)
> +            goto cleanup;
> +    }
> +    for (j = 0; j < vhostfdSize; j++) {
> +        if (qemuMonitorSendFileHandle(mon, vhostfdName[j], vhostfd[j]) < 0)
> +            goto cleanup;
>      }
>  
>      if (mon->json)
> @@ -2557,10 +2560,14 @@ int qemuMonitorAddNetdev(qemuMonitorPtr mon,
>  
>  cleanup:
>      if (ret < 0) {
> -        if (tapfd >= 0 && qemuMonitorCloseFileHandle(mon, tapfd_name) < 0)
> -            VIR_WARN("failed to close device handle '%s'", tapfd_name);
> -        if (vhostfd >= 0 && qemuMonitorCloseFileHandle(mon, vhostfd_name) < 0)
> -            VIR_WARN("failed to close device handle '%s'", vhostfd_name);
> +        while (i--) {
> +            if (qemuMonitorCloseFileHandle(mon, tapfdName[i]) < 0)
> +                VIR_WARN("failed to close device handle '%s'", tapfdName[i]);
> +        }
> +        while (j--) {
> +            if (qemuMonitorCloseFileHandle(mon, vhostfdName[j]) < 0)
> +                VIR_WARN("failed to close device handle '%s'", vhostfdName[j]);
> +        }
>      }
>  
>      return ret;
> diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
> index f39f009..580e42b 100644
> --- a/src/qemu/qemu_monitor.h
> +++ b/src/qemu/qemu_monitor.h
> @@ -506,8 +506,8 @@ int qemuMonitorRemoveHostNetwork(qemuMonitorPtr mon,
>  
>  int qemuMonitorAddNetdev(qemuMonitorPtr mon,
>                           const char *netdevstr,
> -                         int tapfd, const char *tapfd_name,
> -                         int vhostfd, const char *vhostfd_name);
> +                         int *tapfd, char **tapfdName, int tapfdSize,
> +                         int *vhostfd, char **vhostfdName, int vhostfdSize);
>  
>  int qemuMonitorRemoveNetdev(qemuMonitorPtr mon,
>                              const char *alias);


ACK.




More information about the libvir-list mailing list