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(a)siemens.com>
> Signed-off-by: Jan Kiszka <jan.kiszka(a)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