[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