Re: [PATCHv3 04/11] qemu: Make qemuMonitorAddHostNetwork to pass multiple FDs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 05/16/2013 08:49 AM, 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(-)


The fact that this patch and the previous patch have *exactly* the same
diffstats has to mean something... :-)


>
> 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 1d65dd8..524eb9d 100644
> --- a/src/qemu/qemu_monitor.c
> +++ b/src/qemu/qemu_monitor.c
> @@ -2477,14 +2477,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",
> @@ -2492,12 +2494,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)
> @@ -2508,10 +2511,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 f08e468..a607712 100644
> --- a/src/qemu/qemu_monitor.h
> +++ b/src/qemu/qemu_monitor.h
> @@ -501,8 +501,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,


ACK.

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]