[libvirt] [PATCH 06/11] qemu: Add handling for VSERPORT_CHANGE event

Peter Krempa pkrempa at redhat.com
Thu Nov 20 07:47:26 UTC 2014


On 11/20/14 08:44, Wang Rui wrote:
> On 2014/11/19 18:23, Peter Krempa wrote:
>> New qemu added a new event that is emitted when a virtio serial channel
>> is opened in the guest OS. This allows us to update the state of the
>> port in the output-only XML element.
>>
>> This patch implements the monitor callbacks and necessary handlers to
>> update the state in the definition.
>> ---
>>  src/qemu/qemu_domain.h       |  1 +
>>  src/qemu/qemu_driver.c       | 57 ++++++++++++++++++++++++++++++++++++++++++++
>>  src/qemu/qemu_monitor.c      | 14 +++++++++++
>>  src/qemu/qemu_monitor.h      | 10 ++++++++
>>  src/qemu/qemu_monitor_json.c | 23 ++++++++++++++++++
>>  src/qemu/qemu_process.c      | 44 ++++++++++++++++++++++++++++++++++
>>  6 files changed, 149 insertions(+)
>>
>> diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
>> index ad45a66..e4ea4ce 100644
>> --- a/src/qemu/qemu_domain.h
>> +++ b/src/qemu/qemu_domain.h
>> @@ -196,6 +196,7 @@ typedef enum {
>>      QEMU_PROCESS_EVENT_GUESTPANIC,
>>      QEMU_PROCESS_EVENT_DEVICE_DELETED,
>>      QEMU_PROCESS_EVENT_NIC_RX_FILTER_CHANGED,
>> +    QEMU_PROCESS_EVENT_SERIAL_CHANGED,
>>
>>      QEMU_PROCESS_EVENT_LAST
>>  } qemuProcessEventType;
>> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
>> index a84fd47..31bf6bb 100644
>> --- a/src/qemu/qemu_driver.c
>> +++ b/src/qemu/qemu_driver.c
>> @@ -4334,6 +4334,60 @@ processNicRxFilterChangedEvent(virQEMUDriverPtr driver,
>>  }
>>
>>
>> +static void
>> +processSerialChangedEvent(virQEMUDriverPtr driver,
>> +                          virDomainObjPtr vm,
>> +                          char *devAlias,
>> +                          bool connected)
>> +{
>> +    virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
>> +    virDomainChrDeviceState newstate;
>> +    virDomainDeviceDef dev;
>> +
>> +    if (connected)
>> +        newstate = VIR_DOMAIN_CHR_DEVICE_STATE_CONNECTED;
>> +    else
>> +        newstate = VIR_DOMAIN_CHR_DEVICE_STATE_DISCONNECTED;
>> +
>> +    VIR_DEBUG("Changing serial port state %s in domain %p %s",
>> +              devAlias, vm, vm->def->name);
>> +
>> +    if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0)
>> +        goto cleanup;
>> +
>> +    if (!virDomainObjIsActive(vm)) {
>> +        VIR_DEBUG("Domain is not running");
>> +        goto endjob;
>> +    }
>> +
>> +    if (virDomainDefFindDevice(vm->def, devAlias, &dev, true) < 0)
>> +        goto endjob;
>> +
>> +    /* we care only about certain devices */
>> +    if (dev.type != VIR_DOMAIN_DEVICE_CHR ||
>> +        dev.data.chr->deviceType != VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL ||
>> +        dev.data.chr->targetType != VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO)
>> +        goto endjob;
>> +
>> +    dev.data.chr->state = newstate;
>> +
>> +    if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm) < 0)
>> +        VIR_WARN("unable to save domain status after removing device %s",
>> +                 devAlias);
>> +
> 
> Hi, Peter
> IIUC, QEMU emitted the event and libvirt saved the state for the next time
> being queryed. 'the output-only XML element' and 'SaveStatus' means the state
> is not saved persistently.

This saves the state of the port into the status XML and

> 
> In case of libvirtd being restarted after state is saved, we'll lose it. Could
> we handle this case?

the status XML is the piece that is reloaded on libvirtd restart for
running VMs. For inactive VMs this doesn't make sense to report.

> 
> 

Peter


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20141120/6facfcc7/attachment-0001.sig>


More information about the libvir-list mailing list