Re: [libvirt] [PATCH 4/4] qemu: hot-unplug of watchdog

2017-09-26 Thread Michal Privoznik
On 09/26/2017 01:34 PM, John Ferlan wrote:
> 
> 
> On 09/26/2017 05:38 AM, Michal Privoznik wrote:
>> On 09/12/2017 04:29 PM, John Ferlan wrote:
>>>
>>>
>>> On 09/05/2017 07:45 AM, Michal Privoznik wrote:
 https://bugzilla.redhat.com/show_bug.cgi?id=1447169

 Signed-off-by: Michal Privoznik 
 ---
  src/qemu/qemu_driver.c |  4 +-
  src/qemu/qemu_hotplug.c| 61 
 ++
  src/qemu/qemu_hotplug.h|  3 ++
  tests/qemuhotplugtest.c|  7 ++-
  .../qemuhotplug-watchdog-full.xml  |  3 ++
  5 files changed, 76 insertions(+), 2 deletions(-)
  create mode 100644 
 tests/qemuhotplugtestdevices/qemuhotplug-watchdog-full.xml

 diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
 index 626148dba..4c636b956 100644
 --- a/src/qemu/qemu_driver.c
 +++ b/src/qemu/qemu_driver.c
 @@ -7692,12 +7692,14 @@ qemuDomainDetachDeviceLive(virDomainObjPtr vm,
  case VIR_DOMAIN_DEVICE_SHMEM:
  ret = qemuDomainDetachShmemDevice(driver, vm, dev->data.shmem);
  break;
 +case VIR_DOMAIN_DEVICE_WATCHDOG:
 +ret = qemuDomainDetachWatchdog(driver, vm, dev->data.watchdog);
 +break;
  
  case VIR_DOMAIN_DEVICE_FS:
  case VIR_DOMAIN_DEVICE_INPUT:
  case VIR_DOMAIN_DEVICE_SOUND:
  case VIR_DOMAIN_DEVICE_VIDEO:
 -case VIR_DOMAIN_DEVICE_WATCHDOG:
  case VIR_DOMAIN_DEVICE_GRAPHICS:
  case VIR_DOMAIN_DEVICE_HUB:
  case VIR_DOMAIN_DEVICE_SMARTCARD:
 diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
 index 989146eb9..44472ce9f 100644
 --- a/src/qemu/qemu_hotplug.c
 +++ b/src/qemu/qemu_hotplug.c
 @@ -4360,6 +4360,25 @@ qemuDomainRemoveShmemDevice(virQEMUDriverPtr driver,
  }
  
  
 +static int
 +qemuDomainRemoveWatchdog(virQEMUDriverPtr driver,
 + virDomainObjPtr vm,
 + virDomainWatchdogDefPtr watchdog)
 +{
 +virObjectEventPtr event = NULL;
 +
 +VIR_DEBUG("Removing watchdog %s from domain %p %s",
>>>
>>> Is "Removing watchdog watchdog0 from ..." a bit superfluous?
>>>
>>> Perhaps just "Removing '%s' from ..."
>>>
 +  watchdog->info.alias, vm, vm->def->name);
 +
>>>
>>> This would/could be the place for the virDomainAuditWatchdog for
>>> "detach" too.
>>>
 +event = virDomainEventDeviceRemovedNewFromObj(vm, 
 watchdog->info.alias);
 +qemuDomainEventQueue(driver, event);
 +qemuDomainReleaseDeviceAddress(vm, &watchdog->info, NULL);
 +virDomainWatchdogDefFree(vm->def->watchdog);
 +vm->def->watchdog = NULL;
 +return 0;
 +}
 +
 +
  int
  qemuDomainRemoveDevice(virQEMUDriverPtr driver,
 virDomainObjPtr vm,
 @@ -5076,6 +5095,48 @@ qemuDomainDetachShmemDevice(virQEMUDriverPtr driver,
  }
  
  
 +int
 +qemuDomainDetachWatchdog(virQEMUDriverPtr driver,
 + virDomainObjPtr vm,
 + virDomainWatchdogDefPtr dev)
 +{
 +int ret = -1;
 +virDomainWatchdogDefPtr watchdog;
>>>
>>> Why not watchdog = vm->def->watchdog; here?
>>>
 +qemuDomainObjPrivatePtr priv = vm->privateData;
 +
 +/* While domains can have up to one watchdog, the one supplied by user
>>>
>>> s/by/by the/
>>>
 + * doesn't necessarily match the one domain has. Refuse to detach in 
 such
 + * case. */
 +if (!(vm->def->watchdog &&
 +  STREQ_NULLABLE(dev->info.alias,
 + vm->def->watchdog->info.alias))) {
>>>
>>> if (!watchdog || STRNEQ_NULLABLE(dev->info.alias, watchdog->info.alias))
>>>
>>> Trying to think why NULLABLE would be necessary... So it seems it's
>>> required that that input XML has the alias - something not quite right
>>> with that...
>>
>> Is that so? We match devices based on their alias in a lot of places.
>> Users are expected to pass the full device XML anyway. So it's up to us
>> how we pick the right device to be detached. For instance, when
>> detaching a vNIC we match MAC addresses and ignore the rest, since MAC
>> identifies the device uniquely. So for instance, if the detach XML
>> provided by user has  set but the one in domain doesn't have
>> it, we detach the device anyway. One can argue this is a buggy
>> behaviour. But I just don't think we should care. There's a line we have
>> to draw between protecting users from themselves and too complex and
>> mostly useless code. So we've documented that users are supposed to pass
>> the device XML as is in the domain XML.
>>
> 
> Can the alias be user supplied and not be overwritten on attach?  IOW:
> If someone supplies watchdog5 on hot plug, would supplying the 

Re: [libvirt] [PATCH 4/4] qemu: hot-unplug of watchdog

2017-09-26 Thread Michal Privoznik
On 09/26/2017 12:30 PM, Daniel P. Berrange wrote:
> On Tue, Sep 26, 2017 at 11:38:26AM +0200, Michal Privoznik wrote:
>> On 09/12/2017 04:29 PM, John Ferlan wrote:
>>>
>>>
>>> On 09/05/2017 07:45 AM, Michal Privoznik wrote:
 https://bugzilla.redhat.com/show_bug.cgi?id=1447169

 Signed-off-by: Michal Privoznik 
 ---
  src/qemu/qemu_driver.c |  4 +-
  src/qemu/qemu_hotplug.c| 61 
 ++
  src/qemu/qemu_hotplug.h|  3 ++
  tests/qemuhotplugtest.c|  7 ++-
  .../qemuhotplug-watchdog-full.xml  |  3 ++
  5 files changed, 76 insertions(+), 2 deletions(-)
  create mode 100644 
 tests/qemuhotplugtestdevices/qemuhotplug-watchdog-full.xml

 diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
 index 626148dba..4c636b956 100644
 --- a/src/qemu/qemu_driver.c
 +++ b/src/qemu/qemu_driver.c
 @@ -7692,12 +7692,14 @@ qemuDomainDetachDeviceLive(virDomainObjPtr vm,
  case VIR_DOMAIN_DEVICE_SHMEM:
  ret = qemuDomainDetachShmemDevice(driver, vm, dev->data.shmem);
  break;
 +case VIR_DOMAIN_DEVICE_WATCHDOG:
 +ret = qemuDomainDetachWatchdog(driver, vm, dev->data.watchdog);
 +break;
  
  case VIR_DOMAIN_DEVICE_FS:
  case VIR_DOMAIN_DEVICE_INPUT:
  case VIR_DOMAIN_DEVICE_SOUND:
  case VIR_DOMAIN_DEVICE_VIDEO:
 -case VIR_DOMAIN_DEVICE_WATCHDOG:
  case VIR_DOMAIN_DEVICE_GRAPHICS:
  case VIR_DOMAIN_DEVICE_HUB:
  case VIR_DOMAIN_DEVICE_SMARTCARD:
 diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
 index 989146eb9..44472ce9f 100644
 --- a/src/qemu/qemu_hotplug.c
 +++ b/src/qemu/qemu_hotplug.c
 @@ -4360,6 +4360,25 @@ qemuDomainRemoveShmemDevice(virQEMUDriverPtr driver,
  }
  
  
 +static int
 +qemuDomainRemoveWatchdog(virQEMUDriverPtr driver,
 + virDomainObjPtr vm,
 + virDomainWatchdogDefPtr watchdog)
 +{
 +virObjectEventPtr event = NULL;
 +
 +VIR_DEBUG("Removing watchdog %s from domain %p %s",
>>>
>>> Is "Removing watchdog watchdog0 from ..." a bit superfluous?
>>>
>>> Perhaps just "Removing '%s' from ..."
>>>
 +  watchdog->info.alias, vm, vm->def->name);
 +
>>>
>>> This would/could be the place for the virDomainAuditWatchdog for
>>> "detach" too.
>>>
 +event = virDomainEventDeviceRemovedNewFromObj(vm, 
 watchdog->info.alias);
 +qemuDomainEventQueue(driver, event);
 +qemuDomainReleaseDeviceAddress(vm, &watchdog->info, NULL);
 +virDomainWatchdogDefFree(vm->def->watchdog);
 +vm->def->watchdog = NULL;
 +return 0;
 +}
 +
 +
  int
  qemuDomainRemoveDevice(virQEMUDriverPtr driver,
 virDomainObjPtr vm,
 @@ -5076,6 +5095,48 @@ qemuDomainDetachShmemDevice(virQEMUDriverPtr driver,
  }
  
  
 +int
 +qemuDomainDetachWatchdog(virQEMUDriverPtr driver,
 + virDomainObjPtr vm,
 + virDomainWatchdogDefPtr dev)
 +{
 +int ret = -1;
 +virDomainWatchdogDefPtr watchdog;
>>>
>>> Why not watchdog = vm->def->watchdog; here?
>>>
 +qemuDomainObjPrivatePtr priv = vm->privateData;
 +
 +/* While domains can have up to one watchdog, the one supplied by user
>>>
>>> s/by/by the/
>>>
 + * doesn't necessarily match the one domain has. Refuse to detach in 
 such
 + * case. */
 +if (!(vm->def->watchdog &&
 +  STREQ_NULLABLE(dev->info.alias,
 + vm->def->watchdog->info.alias))) {
>>>
>>> if (!watchdog || STRNEQ_NULLABLE(dev->info.alias, watchdog->info.alias))
>>>
>>> Trying to think why NULLABLE would be necessary... So it seems it's
>>> required that that input XML has the alias - something not quite right
>>> with that...
>>
>> Is that so? We match devices based on their alias in a lot of places.
>> Users are expected to pass the full device XML anyway. So it's up to us
>> how we pick the right device to be detached. For instance, when
>> detaching a vNIC we match MAC addresses and ignore the rest, since MAC
>> identifies the device uniquely. So for instance, if the detach XML
>> provided by user has  set but the one in domain doesn't have
>> it, we detach the device anyway. One can argue this is a buggy
>> behaviour. But I just don't think we should care. There's a line we have
>> to draw between protecting users from themselves and too complex and
>> mostly useless code. So we've documented that users are supposed to pass
>> the device XML as is in the domain XML.
> 
> We can protect ourselves from the danger of user passing incomplete device
> XML by not using the passed in device XML d

Re: [libvirt] [PATCH 4/4] qemu: hot-unplug of watchdog

2017-09-26 Thread John Ferlan


On 09/26/2017 05:38 AM, Michal Privoznik wrote:
> On 09/12/2017 04:29 PM, John Ferlan wrote:
>>
>>
>> On 09/05/2017 07:45 AM, Michal Privoznik wrote:
>>> https://bugzilla.redhat.com/show_bug.cgi?id=1447169
>>>
>>> Signed-off-by: Michal Privoznik 
>>> ---
>>>  src/qemu/qemu_driver.c |  4 +-
>>>  src/qemu/qemu_hotplug.c| 61 
>>> ++
>>>  src/qemu/qemu_hotplug.h|  3 ++
>>>  tests/qemuhotplugtest.c|  7 ++-
>>>  .../qemuhotplug-watchdog-full.xml  |  3 ++
>>>  5 files changed, 76 insertions(+), 2 deletions(-)
>>>  create mode 100644 
>>> tests/qemuhotplugtestdevices/qemuhotplug-watchdog-full.xml
>>>
>>> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
>>> index 626148dba..4c636b956 100644
>>> --- a/src/qemu/qemu_driver.c
>>> +++ b/src/qemu/qemu_driver.c
>>> @@ -7692,12 +7692,14 @@ qemuDomainDetachDeviceLive(virDomainObjPtr vm,
>>>  case VIR_DOMAIN_DEVICE_SHMEM:
>>>  ret = qemuDomainDetachShmemDevice(driver, vm, dev->data.shmem);
>>>  break;
>>> +case VIR_DOMAIN_DEVICE_WATCHDOG:
>>> +ret = qemuDomainDetachWatchdog(driver, vm, dev->data.watchdog);
>>> +break;
>>>  
>>>  case VIR_DOMAIN_DEVICE_FS:
>>>  case VIR_DOMAIN_DEVICE_INPUT:
>>>  case VIR_DOMAIN_DEVICE_SOUND:
>>>  case VIR_DOMAIN_DEVICE_VIDEO:
>>> -case VIR_DOMAIN_DEVICE_WATCHDOG:
>>>  case VIR_DOMAIN_DEVICE_GRAPHICS:
>>>  case VIR_DOMAIN_DEVICE_HUB:
>>>  case VIR_DOMAIN_DEVICE_SMARTCARD:
>>> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
>>> index 989146eb9..44472ce9f 100644
>>> --- a/src/qemu/qemu_hotplug.c
>>> +++ b/src/qemu/qemu_hotplug.c
>>> @@ -4360,6 +4360,25 @@ qemuDomainRemoveShmemDevice(virQEMUDriverPtr driver,
>>>  }
>>>  
>>>  
>>> +static int
>>> +qemuDomainRemoveWatchdog(virQEMUDriverPtr driver,
>>> + virDomainObjPtr vm,
>>> + virDomainWatchdogDefPtr watchdog)
>>> +{
>>> +virObjectEventPtr event = NULL;
>>> +
>>> +VIR_DEBUG("Removing watchdog %s from domain %p %s",
>>
>> Is "Removing watchdog watchdog0 from ..." a bit superfluous?
>>
>> Perhaps just "Removing '%s' from ..."
>>
>>> +  watchdog->info.alias, vm, vm->def->name);
>>> +
>>
>> This would/could be the place for the virDomainAuditWatchdog for
>> "detach" too.
>>
>>> +event = virDomainEventDeviceRemovedNewFromObj(vm, 
>>> watchdog->info.alias);
>>> +qemuDomainEventQueue(driver, event);
>>> +qemuDomainReleaseDeviceAddress(vm, &watchdog->info, NULL);
>>> +virDomainWatchdogDefFree(vm->def->watchdog);
>>> +vm->def->watchdog = NULL;
>>> +return 0;
>>> +}
>>> +
>>> +
>>>  int
>>>  qemuDomainRemoveDevice(virQEMUDriverPtr driver,
>>> virDomainObjPtr vm,
>>> @@ -5076,6 +5095,48 @@ qemuDomainDetachShmemDevice(virQEMUDriverPtr driver,
>>>  }
>>>  
>>>  
>>> +int
>>> +qemuDomainDetachWatchdog(virQEMUDriverPtr driver,
>>> + virDomainObjPtr vm,
>>> + virDomainWatchdogDefPtr dev)
>>> +{
>>> +int ret = -1;
>>> +virDomainWatchdogDefPtr watchdog;
>>
>> Why not watchdog = vm->def->watchdog; here?
>>
>>> +qemuDomainObjPrivatePtr priv = vm->privateData;
>>> +
>>> +/* While domains can have up to one watchdog, the one supplied by user
>>
>> s/by/by the/
>>
>>> + * doesn't necessarily match the one domain has. Refuse to detach in 
>>> such
>>> + * case. */
>>> +if (!(vm->def->watchdog &&
>>> +  STREQ_NULLABLE(dev->info.alias,
>>> + vm->def->watchdog->info.alias))) {
>>
>> if (!watchdog || STRNEQ_NULLABLE(dev->info.alias, watchdog->info.alias))
>>
>> Trying to think why NULLABLE would be necessary... So it seems it's
>> required that that input XML has the alias - something not quite right
>> with that...
> 
> Is that so? We match devices based on their alias in a lot of places.
> Users are expected to pass the full device XML anyway. So it's up to us
> how we pick the right device to be detached. For instance, when
> detaching a vNIC we match MAC addresses and ignore the rest, since MAC
> identifies the device uniquely. So for instance, if the detach XML
> provided by user has  set but the one in domain doesn't have
> it, we detach the device anyway. One can argue this is a buggy
> behaviour. But I just don't think we should care. There's a line we have
> to draw between protecting users from themselves and too complex and
> mostly useless code. So we've documented that users are supposed to pass
> the device XML as is in the domain XML.
> 

Can the alias be user supplied and not be overwritten on attach?  IOW:
If someone supplies watchdog5 on hot plug, would supplying the same XML
work on hot unplug?

Typically I pass/use the same XML for my disk/hostdev hot plug/unplug.
Some of those aliases could be tricky unless of course someone's looked
at 

Re: [libvirt] [PATCH 4/4] qemu: hot-unplug of watchdog

2017-09-26 Thread Daniel P. Berrange
On Tue, Sep 26, 2017 at 11:38:26AM +0200, Michal Privoznik wrote:
> On 09/12/2017 04:29 PM, John Ferlan wrote:
> > 
> > 
> > On 09/05/2017 07:45 AM, Michal Privoznik wrote:
> >> https://bugzilla.redhat.com/show_bug.cgi?id=1447169
> >>
> >> Signed-off-by: Michal Privoznik 
> >> ---
> >>  src/qemu/qemu_driver.c |  4 +-
> >>  src/qemu/qemu_hotplug.c| 61 
> >> ++
> >>  src/qemu/qemu_hotplug.h|  3 ++
> >>  tests/qemuhotplugtest.c|  7 ++-
> >>  .../qemuhotplug-watchdog-full.xml  |  3 ++
> >>  5 files changed, 76 insertions(+), 2 deletions(-)
> >>  create mode 100644 
> >> tests/qemuhotplugtestdevices/qemuhotplug-watchdog-full.xml
> >>
> >> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> >> index 626148dba..4c636b956 100644
> >> --- a/src/qemu/qemu_driver.c
> >> +++ b/src/qemu/qemu_driver.c
> >> @@ -7692,12 +7692,14 @@ qemuDomainDetachDeviceLive(virDomainObjPtr vm,
> >>  case VIR_DOMAIN_DEVICE_SHMEM:
> >>  ret = qemuDomainDetachShmemDevice(driver, vm, dev->data.shmem);
> >>  break;
> >> +case VIR_DOMAIN_DEVICE_WATCHDOG:
> >> +ret = qemuDomainDetachWatchdog(driver, vm, dev->data.watchdog);
> >> +break;
> >>  
> >>  case VIR_DOMAIN_DEVICE_FS:
> >>  case VIR_DOMAIN_DEVICE_INPUT:
> >>  case VIR_DOMAIN_DEVICE_SOUND:
> >>  case VIR_DOMAIN_DEVICE_VIDEO:
> >> -case VIR_DOMAIN_DEVICE_WATCHDOG:
> >>  case VIR_DOMAIN_DEVICE_GRAPHICS:
> >>  case VIR_DOMAIN_DEVICE_HUB:
> >>  case VIR_DOMAIN_DEVICE_SMARTCARD:
> >> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
> >> index 989146eb9..44472ce9f 100644
> >> --- a/src/qemu/qemu_hotplug.c
> >> +++ b/src/qemu/qemu_hotplug.c
> >> @@ -4360,6 +4360,25 @@ qemuDomainRemoveShmemDevice(virQEMUDriverPtr driver,
> >>  }
> >>  
> >>  
> >> +static int
> >> +qemuDomainRemoveWatchdog(virQEMUDriverPtr driver,
> >> + virDomainObjPtr vm,
> >> + virDomainWatchdogDefPtr watchdog)
> >> +{
> >> +virObjectEventPtr event = NULL;
> >> +
> >> +VIR_DEBUG("Removing watchdog %s from domain %p %s",
> > 
> > Is "Removing watchdog watchdog0 from ..." a bit superfluous?
> > 
> > Perhaps just "Removing '%s' from ..."
> > 
> >> +  watchdog->info.alias, vm, vm->def->name);
> >> +
> > 
> > This would/could be the place for the virDomainAuditWatchdog for
> > "detach" too.
> > 
> >> +event = virDomainEventDeviceRemovedNewFromObj(vm, 
> >> watchdog->info.alias);
> >> +qemuDomainEventQueue(driver, event);
> >> +qemuDomainReleaseDeviceAddress(vm, &watchdog->info, NULL);
> >> +virDomainWatchdogDefFree(vm->def->watchdog);
> >> +vm->def->watchdog = NULL;
> >> +return 0;
> >> +}
> >> +
> >> +
> >>  int
> >>  qemuDomainRemoveDevice(virQEMUDriverPtr driver,
> >> virDomainObjPtr vm,
> >> @@ -5076,6 +5095,48 @@ qemuDomainDetachShmemDevice(virQEMUDriverPtr driver,
> >>  }
> >>  
> >>  
> >> +int
> >> +qemuDomainDetachWatchdog(virQEMUDriverPtr driver,
> >> + virDomainObjPtr vm,
> >> + virDomainWatchdogDefPtr dev)
> >> +{
> >> +int ret = -1;
> >> +virDomainWatchdogDefPtr watchdog;
> > 
> > Why not watchdog = vm->def->watchdog; here?
> > 
> >> +qemuDomainObjPrivatePtr priv = vm->privateData;
> >> +
> >> +/* While domains can have up to one watchdog, the one supplied by user
> > 
> > s/by/by the/
> > 
> >> + * doesn't necessarily match the one domain has. Refuse to detach in 
> >> such
> >> + * case. */
> >> +if (!(vm->def->watchdog &&
> >> +  STREQ_NULLABLE(dev->info.alias,
> >> + vm->def->watchdog->info.alias))) {
> > 
> > if (!watchdog || STRNEQ_NULLABLE(dev->info.alias, watchdog->info.alias))
> > 
> > Trying to think why NULLABLE would be necessary... So it seems it's
> > required that that input XML has the alias - something not quite right
> > with that...
> 
> Is that so? We match devices based on their alias in a lot of places.
> Users are expected to pass the full device XML anyway. So it's up to us
> how we pick the right device to be detached. For instance, when
> detaching a vNIC we match MAC addresses and ignore the rest, since MAC
> identifies the device uniquely. So for instance, if the detach XML
> provided by user has  set but the one in domain doesn't have
> it, we detach the device anyway. One can argue this is a buggy
> behaviour. But I just don't think we should care. There's a line we have
> to draw between protecting users from themselves and too complex and
> mostly useless code. So we've documented that users are supposed to pass
> the device XML as is in the domain XML.

We can protect ourselves from the danger of user passing incomplete device
XML by not using the passed in device XML directly.

IOW, once we parse the XML to create our virDom

Re: [libvirt] [PATCH 4/4] qemu: hot-unplug of watchdog

2017-09-26 Thread Michal Privoznik
On 09/12/2017 04:29 PM, John Ferlan wrote:
> 
> 
> On 09/05/2017 07:45 AM, Michal Privoznik wrote:
>> https://bugzilla.redhat.com/show_bug.cgi?id=1447169
>>
>> Signed-off-by: Michal Privoznik 
>> ---
>>  src/qemu/qemu_driver.c |  4 +-
>>  src/qemu/qemu_hotplug.c| 61 
>> ++
>>  src/qemu/qemu_hotplug.h|  3 ++
>>  tests/qemuhotplugtest.c|  7 ++-
>>  .../qemuhotplug-watchdog-full.xml  |  3 ++
>>  5 files changed, 76 insertions(+), 2 deletions(-)
>>  create mode 100644 
>> tests/qemuhotplugtestdevices/qemuhotplug-watchdog-full.xml
>>
>> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
>> index 626148dba..4c636b956 100644
>> --- a/src/qemu/qemu_driver.c
>> +++ b/src/qemu/qemu_driver.c
>> @@ -7692,12 +7692,14 @@ qemuDomainDetachDeviceLive(virDomainObjPtr vm,
>>  case VIR_DOMAIN_DEVICE_SHMEM:
>>  ret = qemuDomainDetachShmemDevice(driver, vm, dev->data.shmem);
>>  break;
>> +case VIR_DOMAIN_DEVICE_WATCHDOG:
>> +ret = qemuDomainDetachWatchdog(driver, vm, dev->data.watchdog);
>> +break;
>>  
>>  case VIR_DOMAIN_DEVICE_FS:
>>  case VIR_DOMAIN_DEVICE_INPUT:
>>  case VIR_DOMAIN_DEVICE_SOUND:
>>  case VIR_DOMAIN_DEVICE_VIDEO:
>> -case VIR_DOMAIN_DEVICE_WATCHDOG:
>>  case VIR_DOMAIN_DEVICE_GRAPHICS:
>>  case VIR_DOMAIN_DEVICE_HUB:
>>  case VIR_DOMAIN_DEVICE_SMARTCARD:
>> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
>> index 989146eb9..44472ce9f 100644
>> --- a/src/qemu/qemu_hotplug.c
>> +++ b/src/qemu/qemu_hotplug.c
>> @@ -4360,6 +4360,25 @@ qemuDomainRemoveShmemDevice(virQEMUDriverPtr driver,
>>  }
>>  
>>  
>> +static int
>> +qemuDomainRemoveWatchdog(virQEMUDriverPtr driver,
>> + virDomainObjPtr vm,
>> + virDomainWatchdogDefPtr watchdog)
>> +{
>> +virObjectEventPtr event = NULL;
>> +
>> +VIR_DEBUG("Removing watchdog %s from domain %p %s",
> 
> Is "Removing watchdog watchdog0 from ..." a bit superfluous?
> 
> Perhaps just "Removing '%s' from ..."
> 
>> +  watchdog->info.alias, vm, vm->def->name);
>> +
> 
> This would/could be the place for the virDomainAuditWatchdog for
> "detach" too.
> 
>> +event = virDomainEventDeviceRemovedNewFromObj(vm, watchdog->info.alias);
>> +qemuDomainEventQueue(driver, event);
>> +qemuDomainReleaseDeviceAddress(vm, &watchdog->info, NULL);
>> +virDomainWatchdogDefFree(vm->def->watchdog);
>> +vm->def->watchdog = NULL;
>> +return 0;
>> +}
>> +
>> +
>>  int
>>  qemuDomainRemoveDevice(virQEMUDriverPtr driver,
>> virDomainObjPtr vm,
>> @@ -5076,6 +5095,48 @@ qemuDomainDetachShmemDevice(virQEMUDriverPtr driver,
>>  }
>>  
>>  
>> +int
>> +qemuDomainDetachWatchdog(virQEMUDriverPtr driver,
>> + virDomainObjPtr vm,
>> + virDomainWatchdogDefPtr dev)
>> +{
>> +int ret = -1;
>> +virDomainWatchdogDefPtr watchdog;
> 
> Why not watchdog = vm->def->watchdog; here?
> 
>> +qemuDomainObjPrivatePtr priv = vm->privateData;
>> +
>> +/* While domains can have up to one watchdog, the one supplied by user
> 
> s/by/by the/
> 
>> + * doesn't necessarily match the one domain has. Refuse to detach in 
>> such
>> + * case. */
>> +if (!(vm->def->watchdog &&
>> +  STREQ_NULLABLE(dev->info.alias,
>> + vm->def->watchdog->info.alias))) {
> 
> if (!watchdog || STRNEQ_NULLABLE(dev->info.alias, watchdog->info.alias))
> 
> Trying to think why NULLABLE would be necessary... So it seems it's
> required that that input XML has the alias - something not quite right
> with that...

Is that so? We match devices based on their alias in a lot of places.
Users are expected to pass the full device XML anyway. So it's up to us
how we pick the right device to be detached. For instance, when
detaching a vNIC we match MAC addresses and ignore the rest, since MAC
identifies the device uniquely. So for instance, if the detach XML
provided by user has  set but the one in domain doesn't have
it, we detach the device anyway. One can argue this is a buggy
behaviour. But I just don't think we should care. There's a line we have
to draw between protecting users from themselves and too complex and
mostly useless code. So we've documented that users are supposed to pass
the device XML as is in the domain XML.

> 
> I would think for unplug there'd be something that would compare the
> input "model" and "action" values to whatever watchdog is currently
> present and if they don't match, then fail. Not sure why comparing the
> alias is "right". It's not something we require of other unplugs, is it?

Sort of. For instance when detaching disks we only care about the
target. And for a lot of other devices we require alias too.

> We just need to make sure the same "something" is being removed. S

Re: [libvirt] [PATCH 4/4] qemu: hot-unplug of watchdog

2017-09-12 Thread John Ferlan


On 09/05/2017 07:45 AM, Michal Privoznik wrote:
> https://bugzilla.redhat.com/show_bug.cgi?id=1447169
> 
> Signed-off-by: Michal Privoznik 
> ---
>  src/qemu/qemu_driver.c |  4 +-
>  src/qemu/qemu_hotplug.c| 61 
> ++
>  src/qemu/qemu_hotplug.h|  3 ++
>  tests/qemuhotplugtest.c|  7 ++-
>  .../qemuhotplug-watchdog-full.xml  |  3 ++
>  5 files changed, 76 insertions(+), 2 deletions(-)
>  create mode 100644 tests/qemuhotplugtestdevices/qemuhotplug-watchdog-full.xml
> 
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 626148dba..4c636b956 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -7692,12 +7692,14 @@ qemuDomainDetachDeviceLive(virDomainObjPtr vm,
>  case VIR_DOMAIN_DEVICE_SHMEM:
>  ret = qemuDomainDetachShmemDevice(driver, vm, dev->data.shmem);
>  break;
> +case VIR_DOMAIN_DEVICE_WATCHDOG:
> +ret = qemuDomainDetachWatchdog(driver, vm, dev->data.watchdog);
> +break;
>  
>  case VIR_DOMAIN_DEVICE_FS:
>  case VIR_DOMAIN_DEVICE_INPUT:
>  case VIR_DOMAIN_DEVICE_SOUND:
>  case VIR_DOMAIN_DEVICE_VIDEO:
> -case VIR_DOMAIN_DEVICE_WATCHDOG:
>  case VIR_DOMAIN_DEVICE_GRAPHICS:
>  case VIR_DOMAIN_DEVICE_HUB:
>  case VIR_DOMAIN_DEVICE_SMARTCARD:
> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
> index 989146eb9..44472ce9f 100644
> --- a/src/qemu/qemu_hotplug.c
> +++ b/src/qemu/qemu_hotplug.c
> @@ -4360,6 +4360,25 @@ qemuDomainRemoveShmemDevice(virQEMUDriverPtr driver,
>  }
>  
>  
> +static int
> +qemuDomainRemoveWatchdog(virQEMUDriverPtr driver,
> + virDomainObjPtr vm,
> + virDomainWatchdogDefPtr watchdog)
> +{
> +virObjectEventPtr event = NULL;
> +
> +VIR_DEBUG("Removing watchdog %s from domain %p %s",

Is "Removing watchdog watchdog0 from ..." a bit superfluous?

Perhaps just "Removing '%s' from ..."

> +  watchdog->info.alias, vm, vm->def->name);
> +

This would/could be the place for the virDomainAuditWatchdog for
"detach" too.

> +event = virDomainEventDeviceRemovedNewFromObj(vm, watchdog->info.alias);
> +qemuDomainEventQueue(driver, event);
> +qemuDomainReleaseDeviceAddress(vm, &watchdog->info, NULL);
> +virDomainWatchdogDefFree(vm->def->watchdog);
> +vm->def->watchdog = NULL;
> +return 0;
> +}
> +
> +
>  int
>  qemuDomainRemoveDevice(virQEMUDriverPtr driver,
> virDomainObjPtr vm,
> @@ -5076,6 +5095,48 @@ qemuDomainDetachShmemDevice(virQEMUDriverPtr driver,
>  }
>  
>  
> +int
> +qemuDomainDetachWatchdog(virQEMUDriverPtr driver,
> + virDomainObjPtr vm,
> + virDomainWatchdogDefPtr dev)
> +{
> +int ret = -1;
> +virDomainWatchdogDefPtr watchdog;

Why not watchdog = vm->def->watchdog; here?

> +qemuDomainObjPrivatePtr priv = vm->privateData;
> +
> +/* While domains can have up to one watchdog, the one supplied by user

s/by/by the/

> + * doesn't necessarily match the one domain has. Refuse to detach in such
> + * case. */
> +if (!(vm->def->watchdog &&
> +  STREQ_NULLABLE(dev->info.alias,
> + vm->def->watchdog->info.alias))) {

if (!watchdog || STRNEQ_NULLABLE(dev->info.alias, watchdog->info.alias))

Trying to think why NULLABLE would be necessary... So it seems it's
required that that input XML has the alias - something not quite right
with that...

I would think for unplug there'd be something that would compare the
input "model" and "action" values to whatever watchdog is currently
present and if they don't match, then fail. Not sure why comparing the
alias is "right". It's not something we require of other unplugs, is it?
We just need to make sure the same "something" is being removed. Since
the alias is essentially static for the single available watchdog
device, then as long as the model and action are the same, we can
remove; otherwise, someone has to fix the input XML to have the matching
model and action.

> +virReportError(VIR_ERR_OPERATION_INVALID, "%s",
> +   _("device not present in domain configuration"));

s/device/watchdog device/

> +return -1;
> +}

> +
> +watchdog = vm->def->watchdog;

Now unnecessary...

> +
> +qemuDomainMarkDeviceForRemoval(vm, &watchdog->info);
> +qemuDomainObjEnterMonitor(driver, vm);
> +
> +ret = qemuMonitorDelDevice(priv->mon, watchdog->info.alias);

So if this succeeds and the following fails, then we have no watchdog in
the domain, but then again we probably have no domain if the following
fails... Of course this is similar to what the shmem code is doing, so

> +
> +if (qemuDomainObjExitMonitor(driver, vm) < 0)
> +ret = -1;
> +
> +if (ret == 0) {
> +if ((ret = qemuDomainWaitForDeviceRemoval(vm