[libvirt] [PATCH v2] qemu: Report the offset from host UTC for RTC_CHANGE event

Eric Blake eblake at redhat.com
Wed Jun 5 21:28:13 UTC 2013


On 06/05/2013 04:32 AM, Osier Yang wrote:
> https://bugzilla.redhat.com/show_bug.cgi?id=964177
> 
> Though both libvirt and QEMU's document say RTC_CHANGE returns
> the offset from the host UTC, qemu actually returns the offset
> from the specified date instead when specific date is provided
> (-rtc base=$date).
> 
> It's not safe for qemu to fix it in code, it worked like that
> for 3 years, changing it now may break other QEMU use cases.
> What qemu tries to do is to fix the document:
> 
> http://lists.gnu.org/archive/html/qemu-devel/2013-05/msg04782.html
> 
> And in libvirt side, instead of reply on the qemu, this convert

Unclear grammar.  Not sure if you meant:

instead of replaying the value from qemu

or:

instead of relying on the value from qemu

but either alternative makes more sense.

s/convert/converts/

> the offset returned from qemu to the offset from host UTC, by:
> 
>   /*
>    * a: the offset from qemu RTC_CHANGE event
>    * b: The specified date (-rtc base=$date)
>    * c: the host date when libvirt gets the RTC_CHANGE event
>    * offset: What libvirt will report
>    */
> 
>   offset = a + (b - c);
> 
> The specified date (-rtc base=$date) is recorded in clock's def as
> an internal only member (may be useful to exposed outside?).
> 
> Internal only XML tag "starttime" is introduced to not lose the
> domain process's starttime after libvirt restarting/reloading:
> 
> <clock offset='variable' adjustment='304' basis='utc' starttime='1370423588'/>
> ---
>  src/conf/domain_conf.c  | 27 +++++++++++++++++++++++----
>  src/conf/domain_conf.h  |  3 +++
>  src/qemu/qemu_command.c |  3 +++
>  src/qemu/qemu_process.c | 13 +++++++++++++
>  4 files changed, 42 insertions(+), 4 deletions(-)
> 
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index a16ebd1..7773abf 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -96,6 +96,7 @@ typedef enum {
>     VIR_DOMAIN_XML_INTERNAL_PCI_ORIG_STATES = (1<<18),
>     VIR_DOMAIN_XML_INTERNAL_ALLOW_ROM = (1<<19),
>     VIR_DOMAIN_XML_INTERNAL_ALLOW_BOOT = (1<<20),
> +   VIR_DOMAIN_XML_INTERNAL_STARTTIME = (1 << 21)

Please add the trailing comma, so that the next edit to this code can
also be a one-liner.

> +++ b/src/conf/domain_conf.h
> @@ -1767,6 +1767,9 @@ struct _virDomainClockDef {
>          struct {
>              long long adjustment;
>              int basis;
> +
> +            /* Store the start time of guest process, internal only */
> +            unsigned long long starttime;

Might be worth mentioning how to interpret the value - is it seconds
since Epoch?

> +++ b/src/qemu/qemu_process.c
> @@ -796,6 +796,19 @@ qemuProcessHandleRTCChange(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
>      virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
>  
>      virObjectLock(vm);
> +
> +    /* QEMU's RTC_CHANGE event returns the offset from the specified
> +     * date instead of the host UTC if a specific date is provided
> +     * (-rtc base=$date). We need to convert it to be offset from
> +     * host UTC.
> +     */
> +    if (vm->def->clock.offset == VIR_DOMAIN_CLOCK_OFFSET_VARIABLE) {
> +        time_t now = time(NULL);
> +
> +        offset += vm->def->clock.data.variable.starttime -
> +                  (unsigned long long)now;
> +    }
> +

Looks correct.  ACK with the nits fixed up.

-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

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


More information about the libvir-list mailing list