1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2025-01-12 13:17:58 +03:00

qemu: support netdevs from <forward mode='hostdev'> networks

For network devices allocated from a network with <forward
mode='hostdev'>, there is a need to add the newly minted hostdev to
the hostdevs array.

In this case we also need to call qemuPrepareHostDevices just for this
one device, as the standard call to initialize all the hostdevs that
were defined directly in the domain's configuration has already been
made by the time we allocate a device from a libvirt network, and thus
have something that needs initializing.

Signed-off-by: Shradha Shah <sshah@solarflare.com>
This commit is contained in:
Shradha Shah 2012-08-16 16:42:48 +01:00 committed by Laine Stump
parent a818f8cfb6
commit 1610b71a96

View File

@ -24,6 +24,7 @@
#include <config.h>
#include "qemu_command.h"
#include "qemu_hostdev.h"
#include "qemu_capabilities.h"
#include "qemu_bridge_filter.h"
#include "cpu/cpu.h"
@ -5222,12 +5223,41 @@ qemuBuildCommandLine(virConnectPtr conn,
actualType = virDomainNetGetActualType(net);
if (actualType == VIR_DOMAIN_NET_TYPE_HOSTDEV) {
/* type='hostdev' interfaces are handled in codepath
* for standard hostdev (NB: when there is a network
* with <forward mode='hostdev', there will need to be
* code here that adds the newly minted hostdev to the
* hostdevs array).
*/
if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK) {
virDomainHostdevDefPtr hostdev = virDomainNetGetActualHostdev(net);
virDomainHostdevDefPtr found;
/* For a network with <forward mode='hostdev'>, there is a need to
* add the newly minted hostdev to the hostdevs array.
*/
if (qemuAssignDeviceHostdevAlias(def, hostdev,
(def->nhostdevs-1)) < 0) {
goto error;
}
if (virDomainHostdevFind(def, hostdev, &found) < 0) {
if (virDomainHostdevInsert(def, hostdev) < 0) {
virReportOOMError();
goto error;
}
if (qemuPrepareHostdevPCIDevices(driver, def->name, def->uuid,
&hostdev, 1) < 0) {
goto error;
}
}
else {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("PCI device %04x:%02x:%02x.%x "
"allocated from network %s is already "
"in use by domain %s"),
hostdev->source.subsys.u.pci.domain,
hostdev->source.subsys.u.pci.bus,
hostdev->source.subsys.u.pci.slot,
hostdev->source.subsys.u.pci.function,
net->data.network.name,
def->name);
goto error;
}
}
continue;
}