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

Laine Stump laine at laine.org
Thu May 16 05:40:05 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.

This is the same patch as 03/12. How did you manage 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 b04f3bb..41431b3 100644
> --- a/src/qemu/qemu_hotplug.c
> +++ b/src/qemu/qemu_hotplug.c
> @@ -823,8 +823,11 @@ int qemuDomainAttachNetDevice(virConnectPtr conn,
>              goto cleanup;
>          }
>      } else {
> -        if (qemuMonitorAddHostNetwork(priv->mon, netstr, tapfd, tapfd_name,
> -                                      vhostfd, vhostfd_name) < 0) {
> +        if (qemuMonitorAddHostNetwork(priv->mon, netstr,
> +                                      &tapfd, &tapfd_name,
> +                                      tapfd_name ? 1 : 0,
> +                                      &vhostfd, &vhostfd_name,
> +                                      vhostfd_name ? 1 : 0) < 0) {
>              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 c3f35b5..905801a 100644
> --- a/src/qemu/qemu_monitor.c
> +++ b/src/qemu/qemu_monitor.c
> @@ -2461,14 +2461,16 @@ cleanup:
>  
>  int qemuMonitorAddHostNetwork(qemuMonitorPtr mon,
>                                const char *netstr,
> -                              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 netstr=%s tapfd=%d tapfd_name=%s "
> -              "vhostfd=%d vhostfd_name=%s",
> -              mon, netstr, tapfd, NULLSTR(tapfd_name),
> -              vhostfd, NULLSTR(vhostfd_name));
> +    int i = 0, j = 0;
> +
> +    VIR_DEBUG("mon=%p netstr=%s tapfd=%p tapfdName=%p tapfdSize=%d "
> +              "vhostfd=%p vhostfdName=%p vhostfdSize=%d",
> +              mon, netstr, tapfd, tapfdName, tapfdSize,
> +              vhostfd, vhostfdName, vhostfdSize);
>  
>      if (!mon) {
>          virReportError(VIR_ERR_INVALID_ARG, "%s",
> @@ -2476,12 +2478,13 @@ int qemuMonitorAddHostNetwork(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)
> @@ -2492,10 +2495,14 @@ int qemuMonitorAddHostNetwork(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 580e42b..45257a4 100644
> --- a/src/qemu/qemu_monitor.h
> +++ b/src/qemu/qemu_monitor.h
> @@ -497,8 +497,8 @@ int qemuMonitorRemoveFd(qemuMonitorPtr mon, int fdset, int fd);
>   */
>  int qemuMonitorAddHostNetwork(qemuMonitorPtr mon,
>                                const char *netstr,
> -                              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 qemuMonitorRemoveHostNetwork(qemuMonitorPtr mon,
>                                   int vlan,




More information about the libvir-list mailing list