[libvirt] [PATCH 17/17] qemu: support type=hostdev network device hotplug attach/detach
Michal Privoznik
mprivozn at redhat.com
Mon Mar 5 20:46:04 UTC 2012
On 28.02.2012 21:14, Laine Stump wrote:
> qemuDomainAttachNetDevice
>
> - re-ordered some things at start of function because
> networkAllocateActualDevice should always be run and a slot
> in def->nets always allocated, but host_net_add isn't needed
> if the actual type is hostdev.
>
> - if actual type is hostdev, defer to
> qemuDomainAttachHostDevice (which will reach up to the NetDef
> for things like MAC address when necessary). After return
> from qemuDomainAttachHostDevice, slip directly to cleanup,
> since the rest of the function is specific to emulated net
> devices.
>
> - put assignment of new NetDef into expanded def->nets down
> below cleanup: (but only on success) since it is also needed
> for emulated and hostdev net devices.
>
> qemuDomainDetachHostDevice
>
> - after locating the exact device to detach, check if it's a
> network device and, if so, use toplevel
> qemuDomainDetachNetDevice instead so that the def->nets list
> is properly updated, and 'actual device' properly returned to
> network pool if appropriate. Otherwise, for normal hostdevs,
> call the lower level qemuDomainDetachThisDevice.
>
> qemuDomainDetachNetDevice
>
> - This is where it gets a bit tricky. After locating the device
> on the def->nets list, if the network device type == hostdev,
> call the *lower level* qemuDomainDetachThisDevice (which will
> reach back up to the parent net device for MAC address /
> virtualport when appropriate, then clear the device out of
> def->hostdevs) before skipping past all the emulated
> net-device-specific code to cleanup:, where the network
> device is removed from def->nets, and the network device
> object is freed.
>
> In short, any time a hostdev-type network device is detached, we must
> go through the toplevel virDomaineDetachNetDevice function first and
> last, to make sure 1) the def->nnets list is properly managed, and 2)
> any device allocated with networkAllocateActualDevice is properly
> freed. At the same time, in the middle we need to go through the
> lower-level virDomainDetach*This*HostDevice to be sure that 1) the
> def->hostdevs list is properly managed, 2) the PCI device is properly
> detached from the guest and reattached to the host (if appropriate),
> and 3) any higher level setup/teardown is called at the appropriate
> time, by reaching back up to the NetDef config (part (3) will be
> covered in a separate patch).
>
> ---
> src/qemu/qemu_hotplug.c | 61 +++++++++++++++++++++++++++++++++-------------
> 1 files changed, 44 insertions(+), 17 deletions(-)
>
> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
> index 6119108..50563c5 100644
> --- a/src/qemu/qemu_hotplug.c
> +++ b/src/qemu/qemu_hotplug.c
> @@ -661,9 +661,9 @@ int qemuDomainAttachNetDevice(virConnectPtr conn,
> bool iface_connected = false;
> int actualType;
>
> - if (!qemuCapsGet(priv->qemuCaps, QEMU_CAPS_HOST_NET_ADD)) {
> - qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> - _("installed qemu version does not support host_net_add"));
> + /* preallocate new slot for device */
> + if (VIR_REALLOC_N(vm->def->nets, vm->def->nnets+1) < 0) {
> + virReportOOMError();
> return -1;
> }
>
> @@ -672,9 +672,27 @@ int qemuDomainAttachNetDevice(virConnectPtr conn,
> * to the one defined in the network definition.
> */
> if (networkAllocateActualDevice(net) < 0)
> - goto cleanup;
> + return -1;
Okay, vm->def->nets won't leak, but will be one item bigger; Do we want
to realloc it back as we do in all detach functions, e.g.
virDomainNetRemove() ? The vm->def->nnets counter isn't changed yet so I
guess this is alright.
Anyway, looking good so ACK.
Michal
More information about the libvir-list
mailing list