From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:54388) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TtZav-0003LH-OK for qemu-devel@nongnu.org; Fri, 11 Jan 2013 03:04:10 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TtZaq-00022u-H8 for qemu-devel@nongnu.org; Fri, 11 Jan 2013 03:04:05 -0500 Received: from e28smtp09.in.ibm.com ([122.248.162.9]:59957) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TtZap-00021Q-TQ for qemu-devel@nongnu.org; Fri, 11 Jan 2013 03:04:00 -0500 Received: from /spool/local by e28smtp09.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 11 Jan 2013 13:33:01 +0530 Received: from d28relay02.in.ibm.com (d28relay02.in.ibm.com [9.184.220.59]) by d28dlp03.in.ibm.com (Postfix) with ESMTP id 0B614125804C for ; Fri, 11 Jan 2013 13:34:07 +0530 (IST) Received: from d28av05.in.ibm.com (d28av05.in.ibm.com [9.184.220.67]) by d28relay02.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r0B83oEZ28246102 for ; Fri, 11 Jan 2013 13:33:51 +0530 Received: from d28av05.in.ibm.com (loopback [127.0.0.1]) by d28av05.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r0B83oBo014665 for ; Fri, 11 Jan 2013 19:03:51 +1100 Message-ID: <50EFC765.7070503@linux.vnet.ibm.com> Date: Fri, 11 Jan 2013 16:03:49 +0800 From: Lei Li MIME-Version: 1.0 References: <1357466820-12860-1-git-send-email-lilei@linux.vnet.ibm.com> <1357466820-12860-4-git-send-email-lilei@linux.vnet.ibm.com> <20130109114028.5258d721@doriath.home> In-Reply-To: <20130109114028.5258d721@doriath.home> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 3/3] qga: add guest-set-time command List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Luiz Capitulino Cc: aliguori@us.ibm.com, qemu-devel@nongnu.org, mdroth@linux.vnet.ibm.com On 01/09/2013 09:40 PM, Luiz Capitulino wrote: > On Sun, 6 Jan 2013 18:07:00 +0800 > Lei Li wrote: > >> Signed-off-by: Lei Li >> --- >> qga/commands-posix.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++ >> qga/qapi-schema.json | 32 ++++++++++++++++++++++++++++ >> 2 files changed, 89 insertions(+), 0 deletions(-) >> >> diff --git a/qga/commands-posix.c b/qga/commands-posix.c >> index 190199d..7fff49a 100644 >> --- a/qga/commands-posix.c >> +++ b/qga/commands-posix.c >> @@ -121,6 +121,63 @@ struct HostTimeInfo *qmp_guest_get_time(Error **errp) >> return host_time; >> } >> >> +void qmp_guest_set_time(bool has_seconds, int64_t seconds, >> + bool has_microseconds, int64_t microseconds, >> + bool has_utc_offset, int64_t utc_offset, Error **errp) >> +{ >> + int ret; >> + int status; >> + pid_t pid, rpid; >> + struct timeval tv; >> + HostTimeInfo *host_time; >> + >> + if ((!has_seconds) && (!has_microseconds) && (!has_utc_offset)) { >> + host_time = get_host_time(); >> + if (!host_time) { >> + error_set(errp, QERR_QGA_COMMAND_FAILED, "Failed to set guest time"); > If you change get_host_time() to take an Error * argument, you can drop this. ok. >> + return; >> + } >> + tv.tv_sec = host_time->seconds; >> + tv.tv_usec = host_time->microseconds; >> + } else if (has_seconds && has_microseconds && has_utc_offset) { >> + tv.tv_sec = (time_t) seconds + utc_offset; >> + tv.tv_usec = (time_t) microseconds; >> + } else { >> + error_set(errp, QERR_INVALID_PARAMETER, "parameter missing"); > Please, use error_setg() instead. Sure. >> + return; >> + } >> + >> + ret = settimeofday(&tv, NULL); >> + if (ret < 0) { >> + error_set(errp, QERR_QGA_COMMAND_FAILED, strerror(errno)); > Please, use error_setg_errno(). > Yes. >> + 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); > Honest question: is this really necessary? Can't we do whatever hwclock does? > I have thought about implementing this ourselves, and I did take a look at the source code of hwclock. But looks like the implement ofthe synchronization for hardware clock and system clock is a little complicated, so I am not sure if it's worth to have a try here. >> + _exit(EXIT_FAILURE); >> + } else if (pid < 0) { >> + goto exit_err; >> + } >> + >> + do { >> + rpid = waitpid(pid, &status, 0); >> + } while (rpid == -1 && errno == EINTR); >> + if (rpid == pid && WIFEXITED(status) && !WEXITSTATUS(status)) { >> + return; >> + } >> + >> +exit_err: >> + error_set(errp, QERR_UNDEFINED_ERROR); >> +} >> + >> typedef struct GuestFileHandle { >> uint64_t id; >> FILE *fh; >> diff --git a/qga/qapi-schema.json b/qga/qapi-schema.json >> index 4a8b93c..4649b55 100644 >> --- a/qga/qapi-schema.json >> +++ b/qga/qapi-schema.json >> @@ -117,6 +117,38 @@ >> 'returns': 'HostTimeInfo' } >> >> ## >> +# @guest-set-time: >> +# >> +# Set guest time. If none arguments were given, will set >> +# host time to guest. >> +# >> +# 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. >> +# >> +# @seconds: #optional "seconds" time. >> +# >> +# @microseconds: #optional "microseconds" time. >> +# >> +# @utc-offset: #optional utc offset. >> +# >> +# Returns: Nothing on success. >> +# >> +# Since: 1.4 >> +## >> +{ 'command': 'guest-set-time', >> + 'data': { '*seconds': 'int', '*microseconds': 'int', >> + '*utc-offset': 'int' } } >> + >> +## >> # @GuestAgentCommandInfo: >> # >> # Information about guest agent commands. > -- Lei