[libvirt] [PATCH 5/9] Implement controller hotplugging

Wolfgang Mauerer wolfgang.mauerer at siemens.com
Fri Sep 25 13:03:18 UTC 2009


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




More information about the libvir-list mailing list