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