
Daniel P. Berrange wrote:
On Fri, Sep 18, 2009 at 05:26:12PM +0200, Wolfgang Mauerer wrote:
This enables to hot-add disk controllers without attached disks into the system. Previously, it was only possible to (implicitly) add disk controllers in the static machine configuration.
Notice that the actual functionality is only available for qemu at present, but other emulators can be extended likewise.
Any idea what we can do about initial startup? eg, if we start a guest with 1 SCSI controller and 1 disk, and then we've then hotplugged a 2nd controller, and 1 disk. When we later boot or migrate the same guest, we need to have suitable QEMU command line args to make sure we get 2 controllers each with the same disk, rather than 1 controller with 2 disks. I'm not sure how we do this in QEMU, hopefully the existing args support it in some way I've not realized, or failing that the new qdev -device args might help us.
I'm not yet sure how to solve that best. I'll take a look at how the -device can help exactly.
Signed-off-by: Wolfgang Mauerer <wolfgang.mauerer@siemens.com> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> --- src/domain_conf.c | 26 +++++++++++++++++++++++--- src/domain_conf.h | 2 ++ src/libvirt_private.syms | 1 + src/qemu_driver.c | 21 +++++++++++++++++---- 4 files changed, 43 insertions(+), 7 deletions(-)
diff --git a/src/domain_conf.c b/src/domain_conf.c index d0fda64..ea51fda 100644 --- a/src/domain_conf.c +++ b/src/domain_conf.c @@ -647,7 +647,6 @@ void virDomainRemoveInactive(virDomainObjListPtr doms,
}
- /* Parse the XML definition for a disk * @param node XML nodeset to parse for disk definition */ @@ -2554,6 +2553,27 @@ virDomainDeviceDefPtr virDomainDeviceDefParse(virConnectPtr conn, #endif
+static int virDomainControllerCompare(virDomainControllerDefPtr a, + virDomainControllerDefPtr b) { + if (a->pci_addr.bus == b->pci_addr.bus) { + if (a->pci_addr.domain == b->pci_addr.domain) + return a->pci_addr.slot - b->pci_addr.slot; + + return a->pci_addr.domain - b->pci_addr.domain; + } + + return a->pci_addr.bus - b->pci_addr.bus; +} + + +int virDomainControllerQSort(const void *a, const void *b) +{ + const virDomainControllerDefPtr *da = a; + const virDomainControllerDefPtr *db = b; + + return virDomainControllerCompare(*da, *db); +} +
I know we used todo this for disk devices, but I'd recommand not going a qsort of devices when hotplugging/unplugging. For hotplug always append to the list, for unplug just shuffle down later devices in the list to fill the hole.
okay. Thanks, Wolfgang