All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 0/2 v3] Time resync support by qemu-ga
@ 2013-03-01  9:32 Lei Li
  2013-03-01  9:32 ` [Qemu-devel] [PATCH 1/2] qga: add guest-get-time command Lei Li
  2013-03-01  9:33 ` [Qemu-devel] [PATCH 2/2] qga: add guest-set-time command Lei Li
  0 siblings, 2 replies; 12+ messages in thread
From: Lei Li @ 2013-03-01  9:32 UTC (permalink / raw)
  To: qemu-devel; +Cc: aliguori, mdroth, Lei Li

This patch series attempts to add time resync support
to qemu-ga by introducing qemu-ga commands guest-get-time
and guest-set-time.

Right now, when a guest is paused or migrated to a file
then loaded from that file, the guest OS has no idea that
there was a big gap in the time. Depending on how long the
gap was, NTP might not be able to resynchronize the guest.
So adding new guest-agent command that is called any time
a guest is resumed  and which tells the guest to update its
own wall clock time based on the information from the host
will make it easier for a guest to resynchronize without
waiting for NTP.

The previous RFC send for discussion and suggestion as link
here:

http://article.gmane.org/gmane.comp.emulators.qemu/186126

The interface for these commands like:

{ 'command': 'guest-get-time', 'returns': 'int' }

{ 'command': 'guest-set-time', 'data': { 'time': int } }

Notes:
For the implementition of win32-specific commands, I plan
to send it out in another thread later.

Suggestions and comments are welcome!


Changes since v2:
  - Get rid of utc-offset, and make it just pass single nanoseconds
    relative to the Epoch in UTC/GMT according to Anthony and
    Eric's comments.
  - Make time argument mandatory.
  - Fix the overflow check for year-2038 problem.
  - Error handel improvment from Eric. 

Changes since v1:
  - Squashed patches add support to get host time and add
    guest-get-time command into one.
  - Documents improvment based on the suggestions from
    Eric and Mike.
  - Change the name of 'HostTimeInfo' to 'TimeInfo'.
  - Better use-case and logic for 'guest-set-time'
    command suggested by Eric.
  - Error handel improvment from Luiz.

Lei Li (2):
  qga: add guest-get-time command
  qga: add guest-set-time command

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [Qemu-devel] [PATCH 1/2] qga: add guest-get-time command
  2013-03-01  9:32 [Qemu-devel] [PATCH 0/2 v3] Time resync support by qemu-ga Lei Li
@ 2013-03-01  9:32 ` Lei Li
  2013-03-01 17:02   ` Eric Blake
  2013-03-01  9:33 ` [Qemu-devel] [PATCH 2/2] qga: add guest-set-time command Lei Li
  1 sibling, 1 reply; 12+ messages in thread
From: Lei Li @ 2013-03-01  9:32 UTC (permalink / raw)
  To: qemu-devel; +Cc: aliguori, mdroth, Lei Li

Signed-off-by: Lei Li <lilei@linux.vnet.ibm.com>
---
 qga/commands-posix.c | 16 ++++++++++++++++
 qga/qapi-schema.json | 16 ++++++++++++++++
 2 files changed, 32 insertions(+)

diff --git a/qga/commands-posix.c b/qga/commands-posix.c
index 0ad73f3..f159e25 100644
--- a/qga/commands-posix.c
+++ b/qga/commands-posix.c
@@ -119,6 +119,22 @@ void qmp_guest_shutdown(bool has_mode, const char *mode, Error **err)
     /* succeded */
 }
 
+int64_t qmp_guest_get_time(Error **errp)
+{
+   int ret;
+   qemu_timeval tq;
+   int64_t time_ns;
+
+   ret = qemu_gettimeofday(&tq);
+   if (ret < 0) {
+       error_setg_errno(errp, errno, "Failed to get time");
+       return -1;
+   }
+
+   time_ns = tq.tv_sec * 1000000000LL + tq.tv_usec * 1000;
+   return time_ns; 
+}
+
 typedef struct GuestFileHandle {
     uint64_t id;
     FILE *fh;
diff --git a/qga/qapi-schema.json b/qga/qapi-schema.json
index d91d903..563600c 100644
--- a/qga/qapi-schema.json
+++ b/qga/qapi-schema.json
@@ -83,6 +83,22 @@
 { 'command': 'guest-ping' }
 
 ##
+# @guest-get-time:
+#
+# Get the information about guest time relative to the Epoch
+# of 1970-01-01 in UTC/GMT.
+#
+# This command try to get the guest's notion of the current
+# time.
+#
+# Returns: Time in nanoseconds on success.
+#
+# Since 1.5
+##
+{ 'command': 'guest-get-time',
+  'returns': 'int' }
+
+##
 # @GuestAgentCommandInfo:
 #
 # Information about guest agent commands.
-- 
1.7.11.7

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [Qemu-devel] [PATCH 2/2] qga: add guest-set-time command
  2013-03-01  9:32 [Qemu-devel] [PATCH 0/2 v3] Time resync support by qemu-ga Lei Li
  2013-03-01  9:32 ` [Qemu-devel] [PATCH 1/2] qga: add guest-get-time command Lei Li
@ 2013-03-01  9:33 ` Lei Li
  2013-03-01 17:38   ` Eric Blake
  1 sibling, 1 reply; 12+ messages in thread
From: Lei Li @ 2013-03-01  9:33 UTC (permalink / raw)
  To: qemu-devel; +Cc: aliguori, mdroth, Lei Li

Signed-off-by: Lei Li <lilei@linux.vnet.ibm.com>
---
 qga/commands-posix.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 qga/qapi-schema.json | 27 ++++++++++++++++++++++++++
 2 files changed, 82 insertions(+)

diff --git a/qga/commands-posix.c b/qga/commands-posix.c
index f159e25..e246a0d 100644
--- a/qga/commands-posix.c
+++ b/qga/commands-posix.c
@@ -135,6 +135,61 @@ int64_t qmp_guest_get_time(Error **errp)
    return time_ns; 
 }
 
+void qmp_guest_set_time(int64_t time_ns, Error **errp)
+{
+    int ret;
+    int status;
+    pid_t pid;
+    Error *local_err = NULL;
+    struct timeval tv;
+
+    /* year-2038 will overflow in case time_t is 32bit */
+    if ((sizeof(time_t) <= 4) && ((unsigned long) time_ns & (1ul << 31))) {
+        error_setg_errno(errp, errno, "Invalid time %ld for overflow",
+                         time_ns);
+    }
+
+    tv.tv_sec = time_ns / 1000000000;
+    tv.tv_usec = (time_ns % 1000000000) / 1000;
+
+    ret = settimeofday(&tv, NULL);
+    if (ret < 0) {
+        error_setg_errno(errp, errno, "Failed to set time to guest");
+        return;
+    }
+
+    /* Set the Hardware Clock to the current System Time. */
+    pid = fork();
+    if (pid == 0) {
+        setsid();
+        reopen_fd_to_null(0);
+        reopen_fd_to_null(1);
+        reopen_fd_to_null(2);
+
+        execle("/sbin/hwclock", "hwclock", "-w", NULL, environ);
+        _exit(EXIT_FAILURE);
+    } else if (pid < 0) {
+        error_setg_errno(errp, errno, "failed to create child process");
+        return;
+    }
+
+    ga_wait_child(pid, &status, &local_err);
+    if (error_is_set(&local_err)) {
+        error_propagate(errp, local_err);
+        return;
+    }
+
+    if (!WIFEXITED(status)) {
+        error_setg(errp, "child process has terminated abnormally");
+        return;
+    }
+
+    if (WEXITSTATUS(status)) {
+        error_setg(errp, "hwclock failed to set hardware clock to system time");
+        return;
+    }
+}
+
 typedef struct GuestFileHandle {
     uint64_t id;
     FILE *fh;
diff --git a/qga/qapi-schema.json b/qga/qapi-schema.json
index 563600c..5eba324 100644
--- a/qga/qapi-schema.json
+++ b/qga/qapi-schema.json
@@ -99,6 +99,33 @@
   'returns': 'int' }
 
 ##
+# @guest-set-time:
+#
+# Set guest time.
+#
+# Right now, when a guest is paused or migrated to a file
+# then loaded from that file, the guest OS has no idea that
+# there was a big gap in the time. Depending on how long
+# the gap was, NTP might not be able to resynchronize the
+# guest.
+#
+# This command tries to set guest time based on the information
+# from host or an absolute value given by management app, and
+# set the Hardware Clock to the current System Time. This
+# will make it easier for a guest to resynchronize without
+# waiting for NTP.
+#
+# @time: time of nanoseconds, relative to the Epoch of
+#        1970-01-01 in UTC/GMT.
+#
+# Returns: Nothing on success.
+#
+# Since: 1.5
+##
+{ 'command': 'guest-set-time',
+  'data': { 'time': 'int' } }
+
+##
 # @GuestAgentCommandInfo:
 #
 # Information about guest agent commands.
-- 
1.7.11.7

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [Qemu-devel] [PATCH 1/2] qga: add guest-get-time command
  2013-03-01  9:32 ` [Qemu-devel] [PATCH 1/2] qga: add guest-get-time command Lei Li
@ 2013-03-01 17:02   ` Eric Blake
  2013-03-04  7:39     ` Lei Li
  0 siblings, 1 reply; 12+ messages in thread
From: Eric Blake @ 2013-03-01 17:02 UTC (permalink / raw)
  To: Lei Li; +Cc: aliguori, qemu-devel, mdroth

[-- Attachment #1: Type: text/plain, Size: 1880 bytes --]

On 03/01/2013 02:32 AM, Lei Li wrote:
> Signed-off-by: Lei Li <lilei@linux.vnet.ibm.com>
> ---
>  qga/commands-posix.c | 16 ++++++++++++++++
>  qga/qapi-schema.json | 16 ++++++++++++++++
>  2 files changed, 32 insertions(+)
> 
> diff --git a/qga/commands-posix.c b/qga/commands-posix.c
> index 0ad73f3..f159e25 100644
> --- a/qga/commands-posix.c
> +++ b/qga/commands-posix.c
> @@ -119,6 +119,22 @@ void qmp_guest_shutdown(bool has_mode, const char *mode, Error **err)
>      /* succeded */
>  }
>  
> +int64_t qmp_guest_get_time(Error **errp)
> +{
> +   int ret;
> +   qemu_timeval tq;
> +   int64_t time_ns;
> +
> +   ret = qemu_gettimeofday(&tq);
> +   if (ret < 0) {
> +       error_setg_errno(errp, errno, "Failed to get time");
> +       return -1;
> +   }
> +
> +   time_ns = tq.tv_sec * 1000000000LL + tq.tv_usec * 1000;

Is it worth a sanity check that the tv_sec scaling doesn't overflow?  Of
course, that won't happen until far into the future (well beyond the
2038 overflow of 32-bit seconds since Epoch), so it won't hit in OUR
lifetime, so I can look the other way.

>  
>  ##
> +# @guest-get-time:
> +#
> +# Get the information about guest time relative to the Epoch
> +# of 1970-01-01 in UTC/GMT.

UTC and GMT are not the same thing.  I'd drop the '/GMT'.
http://www.diffen.com/difference/GMT_vs_UTC

> +#
> +# This command try to get the guest's notion of the current
> +# time.

This sentence is redundant with the first one, and has grammar issues.
Drop it.

> +#
> +# Returns: Time in nanoseconds on success.
> +#
> +# Since 1.5
> +##
> +{ 'command': 'guest-get-time',
> +  'returns': 'int' }
> +
> +##
>  # @GuestAgentCommandInfo:
>  #
>  # Information about guest agent commands.
> 

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


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 621 bytes --]

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [Qemu-devel] [PATCH 2/2] qga: add guest-set-time command
  2013-03-01  9:33 ` [Qemu-devel] [PATCH 2/2] qga: add guest-set-time command Lei Li
@ 2013-03-01 17:38   ` Eric Blake
  2013-03-01 17:50     ` Eric Blake
  2013-03-04  8:25     ` Lei Li
  0 siblings, 2 replies; 12+ messages in thread
From: Eric Blake @ 2013-03-01 17:38 UTC (permalink / raw)
  To: Lei Li; +Cc: aliguori, qemu-devel, mdroth

[-- Attachment #1: Type: text/plain, Size: 2816 bytes --]

On 03/01/2013 02:33 AM, Lei Li wrote:
> Signed-off-by: Lei Li <lilei@linux.vnet.ibm.com>
> ---
>  qga/commands-posix.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++
>  qga/qapi-schema.json | 27 ++++++++++++++++++++++++++
>  2 files changed, 82 insertions(+)
> 
> diff --git a/qga/commands-posix.c b/qga/commands-posix.c
> index f159e25..e246a0d 100644
> --- a/qga/commands-posix.c
> +++ b/qga/commands-posix.c
> @@ -135,6 +135,61 @@ int64_t qmp_guest_get_time(Error **errp)
>     return time_ns; 
>  }
>  
> +void qmp_guest_set_time(int64_t time_ns, Error **errp)
> +{
> +    int ret;
> +    int status;
> +    pid_t pid;
> +    Error *local_err = NULL;
> +    struct timeval tv;
> +
> +    /* year-2038 will overflow in case time_t is 32bit */
> +    if ((sizeof(time_t) <= 4) && ((unsigned long) time_ns & (1ul << 31))) {

Wrong.  If 'unsigned long' and 'time_t' are both 32 bits, but time_ns is
0x1000000000000000, then the cast truncates to 0 and you don't report
overflow.  Conversely, if time_ns is 0x80000000, you report overflow,
even though this value fits in 32-bit time_t after you do division from
nanoseconds back to seconds.  What you WANT is:

if (time_ns / 1000000000 != (time_t)(time_ns / 1000000000)) {

> +        error_setg_errno(errp, errno, "Invalid time %ld for overflow",
> +                         time_ns);

That wording sounds awkward.  Worse, errno is NOT set to anything sane,
so you do NOT want error_setg_errno.  And %ld is wrong for int64_t on
32-bit platforms.  How about:

error_setg(errp, "Time %" PRI64D " is too large", time_ns);

> +++ b/qga/qapi-schema.json
> @@ -99,6 +99,33 @@
>    'returns': 'int' }
>  
>  ##
> +# @guest-set-time:
> +#
> +# Set guest time.
> +#
> +# Right now, when a guest is paused or migrated to a file

s/Right now, when/When/

> +# then loaded from that file, the guest OS has no idea that
> +# there was a big gap in the time. Depending on how long
> +# the gap was, NTP might not be able to resynchronize the
> +# guest.
> +#
> +# This command tries to set guest time based on the information
> +# from host or an absolute value given by management app, and
> +# set the Hardware Clock to the current System Time. This
> +# will make it easier for a guest to resynchronize without
> +# waiting for NTP.
> +#
> +# @time: time of nanoseconds, relative to the Epoch of
> +#        1970-01-01 in UTC/GMT.

drop '/GMT'

> +#
> +# Returns: Nothing on success.
> +#
> +# Since: 1.5
> +##
> +{ 'command': 'guest-set-time',
> +  'data': { 'time': 'int' } }
> +
> +##
>  # @GuestAgentCommandInfo:
>  #
>  # Information about guest agent commands.
> 

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


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 621 bytes --]

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [Qemu-devel] [PATCH 2/2] qga: add guest-set-time command
  2013-03-01 17:38   ` Eric Blake
@ 2013-03-01 17:50     ` Eric Blake
  2013-03-04  8:25     ` Lei Li
  1 sibling, 0 replies; 12+ messages in thread
From: Eric Blake @ 2013-03-01 17:50 UTC (permalink / raw)
  Cc: mdroth, aliguori, Lei Li, qemu-devel

[-- Attachment #1: Type: text/plain, Size: 594 bytes --]

On 03/01/2013 10:38 AM, Eric Blake wrote:
>> +        error_setg_errno(errp, errno, "Invalid time %ld for overflow",
>> +                         time_ns);
> 
> That wording sounds awkward.  Worse, errno is NOT set to anything sane,
> so you do NOT want error_setg_errno.  And %ld is wrong for int64_t on
> 32-bit platforms.  How about:
> 
> error_setg(errp, "Time %" PRI64D " is too large", time_ns);

Don't know what I was thinking; there is no PRI64D.  I meant PRId64.

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


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 621 bytes --]

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [Qemu-devel] [PATCH 1/2] qga: add guest-get-time command
  2013-03-01 17:02   ` Eric Blake
@ 2013-03-04  7:39     ` Lei Li
  0 siblings, 0 replies; 12+ messages in thread
From: Lei Li @ 2013-03-04  7:39 UTC (permalink / raw)
  To: Eric Blake; +Cc: aliguori, qemu-devel, mdroth

On 03/02/2013 01:02 AM, Eric Blake wrote:
> On 03/01/2013 02:32 AM, Lei Li wrote:
>> Signed-off-by: Lei Li <lilei@linux.vnet.ibm.com>
>> ---
>>   qga/commands-posix.c | 16 ++++++++++++++++
>>   qga/qapi-schema.json | 16 ++++++++++++++++
>>   2 files changed, 32 insertions(+)
>>
>> diff --git a/qga/commands-posix.c b/qga/commands-posix.c
>> index 0ad73f3..f159e25 100644
>> --- a/qga/commands-posix.c
>> +++ b/qga/commands-posix.c
>> @@ -119,6 +119,22 @@ void qmp_guest_shutdown(bool has_mode, const char *mode, Error **err)
>>       /* succeded */
>>   }
>>   
>> +int64_t qmp_guest_get_time(Error **errp)
>> +{
>> +   int ret;
>> +   qemu_timeval tq;
>> +   int64_t time_ns;
>> +
>> +   ret = qemu_gettimeofday(&tq);
>> +   if (ret < 0) {
>> +       error_setg_errno(errp, errno, "Failed to get time");
>> +       return -1;
>> +   }
>> +
>> +   time_ns = tq.tv_sec * 1000000000LL + tq.tv_usec * 1000;
> Is it worth a sanity check that the tv_sec scaling doesn't overflow?  Of
> course, that won't happen until far into the future (well beyond the
> 2038 overflow of 32-bit seconds since Epoch), so it won't hit in OUR
> lifetime, so I can look the other way.
>>   
>>   ##
>> +# @guest-get-time:
>> +#
>> +# Get the information about guest time relative to the Epoch
>> +# of 1970-01-01 in UTC/GMT.
> UTC and GMT are not the same thing.  I'd drop the '/GMT'.
> http://www.diffen.com/difference/GMT_vs_UTC

Oh, good to know! :)
Thanks.

>> +#
>> +# This command try to get the guest's notion of the current
>> +# time.
> This sentence is redundant with the first one, and has grammar issues.
> Drop it.

Sure.

>
>> +#
>> +# Returns: Time in nanoseconds on success.
>> +#
>> +# Since 1.5
>> +##
>> +{ 'command': 'guest-get-time',
>> +  'returns': 'int' }
>> +
>> +##
>>   # @GuestAgentCommandInfo:
>>   #
>>   # Information about guest agent commands.
>>


-- 
Lei

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [Qemu-devel] [PATCH 2/2] qga: add guest-set-time command
  2013-03-01 17:38   ` Eric Blake
  2013-03-01 17:50     ` Eric Blake
@ 2013-03-04  8:25     ` Lei Li
  1 sibling, 0 replies; 12+ messages in thread
From: Lei Li @ 2013-03-04  8:25 UTC (permalink / raw)
  To: Eric Blake; +Cc: aliguori, qemu-devel, mdroth

On 03/02/2013 01:38 AM, Eric Blake wrote:
> On 03/01/2013 02:33 AM, Lei Li wrote:
>> Signed-off-by: Lei Li <lilei@linux.vnet.ibm.com>
>> ---
>>   qga/commands-posix.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++
>>   qga/qapi-schema.json | 27 ++++++++++++++++++++++++++
>>   2 files changed, 82 insertions(+)
>>
>> diff --git a/qga/commands-posix.c b/qga/commands-posix.c
>> index f159e25..e246a0d 100644
>> --- a/qga/commands-posix.c
>> +++ b/qga/commands-posix.c
>> @@ -135,6 +135,61 @@ int64_t qmp_guest_get_time(Error **errp)
>>      return time_ns;
>>   }
>>   
>> +void qmp_guest_set_time(int64_t time_ns, Error **errp)
>> +{
>> +    int ret;
>> +    int status;
>> +    pid_t pid;
>> +    Error *local_err = NULL;
>> +    struct timeval tv;
>> +
>> +    /* year-2038 will overflow in case time_t is 32bit */
>> +    if ((sizeof(time_t) <= 4) && ((unsigned long) time_ns & (1ul << 31))) {
> Wrong.  If 'unsigned long' and 'time_t' are both 32 bits, but time_ns is
> 0x1000000000000000, then the cast truncates to 0 and you don't report
> overflow.  Conversely, if time_ns is 0x80000000, you report overflow,
> even though this value fits in 32-bit time_t after you do division from
> nanoseconds back to seconds.  What you WANT is:

Yes, you are right.. thanks.

>
> if (time_ns / 1000000000 != (time_t)(time_ns / 1000000000)) {
>
>> +        error_setg_errno(errp, errno, "Invalid time %ld for overflow",
>> +                         time_ns);
> That wording sounds awkward.  Worse, errno is NOT set to anything sane,
> so you do NOT want error_setg_errno.  And %ld is wrong for int64_t on
> 32-bit platforms.  How about:
>
> error_setg(errp, "Time %" PRI64D " is too large", time_ns);

Sure, will address it as the your later reply.

>> +++ b/qga/qapi-schema.json
>> @@ -99,6 +99,33 @@
>>     'returns': 'int' }
>>   
>>   ##
>> +# @guest-set-time:
>> +#
>> +# Set guest time.
>> +#
>> +# Right now, when a guest is paused or migrated to a file
> s/Right now, when/When/
>
>> +# then loaded from that file, the guest OS has no idea that
>> +# there was a big gap in the time. Depending on how long
>> +# the gap was, NTP might not be able to resynchronize the
>> +# guest.
>> +#
>> +# This command tries to set guest time based on the information
>> +# from host or an absolute value given by management app, and
>> +# set the Hardware Clock to the current System Time. This
>> +# will make it easier for a guest to resynchronize without
>> +# waiting for NTP.
>> +#
>> +# @time: time of nanoseconds, relative to the Epoch of
>> +#        1970-01-01 in UTC/GMT.
> drop '/GMT'
>
>> +#
>> +# Returns: Nothing on success.
>> +#
>> +# Since: 1.5
>> +##
>> +{ 'command': 'guest-set-time',
>> +  'data': { 'time': 'int' } }
>> +
>> +##
>>   # @GuestAgentCommandInfo:
>>   #
>>   # Information about guest agent commands.
>>


-- 
Lei

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [Qemu-devel] [PATCH 1/2] qga: add guest-get-time command
  2013-03-04  9:16 [Qemu-devel] [PATCH 0/2 v4] Time resync support by qemu-ga Lei Li
@ 2013-03-04  9:16 ` Lei Li
  2013-03-04 18:04   ` mdroth
  2013-03-04 19:02   ` Eric Blake
  0 siblings, 2 replies; 12+ messages in thread
From: Lei Li @ 2013-03-04  9:16 UTC (permalink / raw)
  To: qemu-devel; +Cc: aliguori, mdroth, Lei Li

Signed-off-by: Lei Li <lilei@linux.vnet.ibm.com>
---
 qga/commands-posix.c | 16 ++++++++++++++++
 qga/qapi-schema.json | 13 +++++++++++++
 2 files changed, 29 insertions(+)

diff --git a/qga/commands-posix.c b/qga/commands-posix.c
index 0ad73f3..6fc6003 100644
--- a/qga/commands-posix.c
+++ b/qga/commands-posix.c
@@ -119,6 +119,22 @@ void qmp_guest_shutdown(bool has_mode, const char *mode, Error **err)
     /* succeded */
 }
 
+int64_t qmp_guest_get_time(Error **errp)
+{
+   int ret;
+   qemu_timeval tq;
+   int64_t time_ns;
+
+   ret = qemu_gettimeofday(&tq);
+   if (ret < 0) {
+       error_setg_errno(errp, errno, "Failed to get time");
+       return -1;
+   }
+
+   time_ns = tq.tv_sec * 1000000000LL + tq.tv_usec * 1000;
+   return time_ns;
+}
+
 typedef struct GuestFileHandle {
     uint64_t id;
     FILE *fh;
diff --git a/qga/qapi-schema.json b/qga/qapi-schema.json
index d91d903..52bb091 100644
--- a/qga/qapi-schema.json
+++ b/qga/qapi-schema.json
@@ -83,6 +83,19 @@
 { 'command': 'guest-ping' }
 
 ##
+# @guest-get-time:
+#
+# Get the information about guest time relative to the Epoch
+# of 1970-01-01 in UTC.
+#
+# Returns: Time in nanoseconds on success.
+#
+# Since 1.5
+##
+{ 'command': 'guest-get-time',
+  'returns': 'int' }
+
+##
 # @GuestAgentCommandInfo:
 #
 # Information about guest agent commands.
-- 
1.7.11.7

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [Qemu-devel] [PATCH 1/2] qga: add guest-get-time command
  2013-03-04  9:16 ` [Qemu-devel] [PATCH 1/2] qga: add guest-get-time command Lei Li
@ 2013-03-04 18:04   ` mdroth
  2013-03-04 19:02   ` Eric Blake
  1 sibling, 0 replies; 12+ messages in thread
From: mdroth @ 2013-03-04 18:04 UTC (permalink / raw)
  To: Lei Li; +Cc: aliguori, qemu-devel

On Mon, Mar 04, 2013 at 05:16:29PM +0800, Lei Li wrote:
> Signed-off-by: Lei Li <lilei@linux.vnet.ibm.com>

Reviewed-by: Michael Roth <mdroth@linux.vnet.ibm.com>

> ---
>  qga/commands-posix.c | 16 ++++++++++++++++
>  qga/qapi-schema.json | 13 +++++++++++++
>  2 files changed, 29 insertions(+)
> 
> diff --git a/qga/commands-posix.c b/qga/commands-posix.c
> index 0ad73f3..6fc6003 100644
> --- a/qga/commands-posix.c
> +++ b/qga/commands-posix.c
> @@ -119,6 +119,22 @@ void qmp_guest_shutdown(bool has_mode, const char *mode, Error **err)
>      /* succeded */
>  }
> 
> +int64_t qmp_guest_get_time(Error **errp)
> +{
> +   int ret;
> +   qemu_timeval tq;
> +   int64_t time_ns;
> +
> +   ret = qemu_gettimeofday(&tq);
> +   if (ret < 0) {
> +       error_setg_errno(errp, errno, "Failed to get time");
> +       return -1;
> +   }
> +
> +   time_ns = tq.tv_sec * 1000000000LL + tq.tv_usec * 1000;
> +   return time_ns;
> +}
> +
>  typedef struct GuestFileHandle {
>      uint64_t id;
>      FILE *fh;
> diff --git a/qga/qapi-schema.json b/qga/qapi-schema.json
> index d91d903..52bb091 100644
> --- a/qga/qapi-schema.json
> +++ b/qga/qapi-schema.json
> @@ -83,6 +83,19 @@
>  { 'command': 'guest-ping' }
> 
>  ##
> +# @guest-get-time:
> +#
> +# Get the information about guest time relative to the Epoch
> +# of 1970-01-01 in UTC.
> +#
> +# Returns: Time in nanoseconds on success.
> +#
> +# Since 1.5
> +##
> +{ 'command': 'guest-get-time',
> +  'returns': 'int' }
> +
> +##
>  # @GuestAgentCommandInfo:
>  #
>  # Information about guest agent commands.
> -- 
> 1.7.11.7
> 

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [Qemu-devel] [PATCH 1/2] qga: add guest-get-time command
  2013-03-04  9:16 ` [Qemu-devel] [PATCH 1/2] qga: add guest-get-time command Lei Li
  2013-03-04 18:04   ` mdroth
@ 2013-03-04 19:02   ` Eric Blake
  1 sibling, 0 replies; 12+ messages in thread
From: Eric Blake @ 2013-03-04 19:02 UTC (permalink / raw)
  To: Lei Li; +Cc: aliguori, qemu-devel, mdroth

[-- Attachment #1: Type: text/plain, Size: 755 bytes --]

On 03/04/2013 02:16 AM, Lei Li wrote:
> Signed-off-by: Lei Li <lilei@linux.vnet.ibm.com>
> ---
>  qga/commands-posix.c | 16 ++++++++++++++++
>  qga/qapi-schema.json | 13 +++++++++++++
>  2 files changed, 29 insertions(+)
> 

>  ##
> +# @guest-get-time:
> +#
> +# Get the information about guest time relative to the Epoch
> +# of 1970-01-01 in UTC.
> +#
> +# Returns: Time in nanoseconds on success.

The return value is only possible on success in the first place, so you
can simplify this:

s/ on success//

But that's minor, and I'm okay even with the longer wording, so:

Reviewed-by: Eric Blake <eblake@redhat.com>

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


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 621 bytes --]

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [Qemu-devel] [PATCH 1/2] qga: add guest-get-time command
  2013-03-05  9:39 [Qemu-devel] [PATCH 0/2 v5] Time resync support by qemu-ga Lei Li
@ 2013-03-05  9:39 ` Lei Li
  0 siblings, 0 replies; 12+ messages in thread
From: Lei Li @ 2013-03-05  9:39 UTC (permalink / raw)
  To: qemu-devel; +Cc: aliguori, mdroth, Lei Li

Signed-off-by: Lei Li <lilei@linux.vnet.ibm.com>
---
 qga/commands-posix.c | 16 ++++++++++++++++
 qga/qapi-schema.json | 13 +++++++++++++
 2 files changed, 29 insertions(+)

diff --git a/qga/commands-posix.c b/qga/commands-posix.c
index 7a0202e..1426262 100644
--- a/qga/commands-posix.c
+++ b/qga/commands-posix.c
@@ -119,6 +119,22 @@ void qmp_guest_shutdown(bool has_mode, const char *mode, Error **err)
     /* succeded */
 }
 
+int64_t qmp_guest_get_time(Error **errp)
+{
+   int ret;
+   qemu_timeval tq;
+   int64_t time_ns;
+
+   ret = qemu_gettimeofday(&tq);
+   if (ret < 0) {
+       error_setg_errno(errp, errno, "Failed to get time");
+       return -1;
+   }
+
+   time_ns = tq.tv_sec * 1000000000LL + tq.tv_usec * 1000;
+   return time_ns;
+}
+
 typedef struct GuestFileHandle {
     uint64_t id;
     FILE *fh;
diff --git a/qga/qapi-schema.json b/qga/qapi-schema.json
index d91d903..bb0f75e 100644
--- a/qga/qapi-schema.json
+++ b/qga/qapi-schema.json
@@ -83,6 +83,19 @@
 { 'command': 'guest-ping' }
 
 ##
+# @guest-get-time:
+#
+# Get the information about guest time relative to the Epoch
+# of 1970-01-01 in UTC.
+#
+# Returns: Time in nanoseconds.
+#
+# Since 1.5
+##
+{ 'command': 'guest-get-time',
+  'returns': 'int' }
+
+##
 # @GuestAgentCommandInfo:
 #
 # Information about guest agent commands.
-- 
1.7.11.7

^ permalink raw reply related	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2013-03-05  9:39 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-03-01  9:32 [Qemu-devel] [PATCH 0/2 v3] Time resync support by qemu-ga Lei Li
2013-03-01  9:32 ` [Qemu-devel] [PATCH 1/2] qga: add guest-get-time command Lei Li
2013-03-01 17:02   ` Eric Blake
2013-03-04  7:39     ` Lei Li
2013-03-01  9:33 ` [Qemu-devel] [PATCH 2/2] qga: add guest-set-time command Lei Li
2013-03-01 17:38   ` Eric Blake
2013-03-01 17:50     ` Eric Blake
2013-03-04  8:25     ` Lei Li
  -- strict thread matches above, loose matches on Subject: below --
2013-03-04  9:16 [Qemu-devel] [PATCH 0/2 v4] Time resync support by qemu-ga Lei Li
2013-03-04  9:16 ` [Qemu-devel] [PATCH 1/2] qga: add guest-get-time command Lei Li
2013-03-04 18:04   ` mdroth
2013-03-04 19:02   ` Eric Blake
2013-03-05  9:39 [Qemu-devel] [PATCH 0/2 v5] Time resync support by qemu-ga Lei Li
2013-03-05  9:39 ` [Qemu-devel] [PATCH 1/2] qga: add guest-get-time command Lei Li

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.