From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54912) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YO4W1-0007bE-Hi for qemu-devel@nongnu.org; Wed, 18 Feb 2015 08:18:13 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YO4Vx-0004qS-HN for qemu-devel@nongnu.org; Wed, 18 Feb 2015 08:18:09 -0500 Received: from mail-we0-f170.google.com ([74.125.82.170]:39703) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YO4Vx-0004qA-8s for qemu-devel@nongnu.org; Wed, 18 Feb 2015 08:18:05 -0500 Received: by wesx3 with SMTP id x3so1093802wes.6 for ; Wed, 18 Feb 2015 05:18:04 -0800 (PST) Sender: Paolo Bonzini Message-ID: <54E49108.6060401@redhat.com> Date: Wed, 18 Feb 2015 14:18:00 +0100 From: Paolo Bonzini MIME-Version: 1.0 References: <20150218115534.4176.12578.stgit@PASHA-ISP> <20150218115753.4176.28510.stgit@PASHA-ISP> In-Reply-To: <20150218115753.4176.28510.stgit@PASHA-ISP> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [RFC PATCH v9 22/23] replay: command line options List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Pavel Dovgalyuk , qemu-devel@nongnu.org Cc: peter.maydell@linaro.org, peter.crosthwaite@xilinx.com, alex.bennee@linaro.org, mark.burton@greensocs.com, real@ispras.ru, batuzovk@ispras.ru, maria.klimushenkova@ispras.ru, afaerber@suse.de, fred.konrad@greensocs.com On 18/02/2015 12:57, Pavel Dovgalyuk wrote: > This patch introduces command line options for enabling recording or replaying > virtual machine behavior. "-record" option starts recording of the execution > and saves it into the log, specified with "fname" parameter. "-replay" option > is intended for replaying previously saved log. Inaccurate commit message... > Signed-off-by: Pavel Dovgalyuk > --- > cpus.c | 1 + > qemu-options.hx | 8 ++++++-- > vl.c | 16 +++++++++++++++- > 3 files changed, 22 insertions(+), 3 deletions(-) > > diff --git a/cpus.c b/cpus.c > index 5b2f896..e289a9d 100644 > --- a/cpus.c > +++ b/cpus.c > @@ -895,6 +895,7 @@ static void qemu_wait_io_event_common(CPUState *cpu) > static void qemu_tcg_wait_io_event(void) > { > CPUState *cpu; > + GMainContext *context = g_main_context_default(); ... and unnecessary change (I think---shouldn't this give a warning?). > > while (all_cpu_threads_idle()) { > /* Start accounting real time to the virtual clock if the CPUs > diff --git a/qemu-options.hx b/qemu-options.hx > index 85ca3ad..c62661a 100644 > --- a/qemu-options.hx > +++ b/qemu-options.hx > @@ -3038,11 +3038,11 @@ re-inject them. > ETEXI > > DEF("icount", HAS_ARG, QEMU_OPTION_icount, \ > - "-icount [shift=N|auto][,align=on|off]\n" \ > + "-icount [shift=N|auto][,align=on|off][,rr=record|replay,rrfile=]\n" \ > " enable virtual instruction counter with 2^N clock ticks per\n" \ > " instruction and enable aligning the host and virtual clocks\n", QEMU_ARCH_ALL) > STEXI > -@item -icount [shift=@var{N}|auto] > +@item -icount [shift=@var{N}|auto][,rr=record|replay,rrfile=@var{filename}] > @findex -icount > Enable virtual instruction counter. The virtual cpu will execute one > instruction every 2^@var{N} ns of virtual time. If @code{auto} is specified > @@ -3064,6 +3064,10 @@ Currently this option does not work when @option{shift} is @code{auto}. > Note: The sync algorithm will work for those shift values for which > the guest clock runs ahead of the host clock. Typically this happens > when the shift value is high (how high depends on the host machine). > + > +When @option{rr} option is specified deterministic record/replay is enabled. > +Replay log is written into @var{filename} file in record mode and > +read from this file in replay mode. > ETEXI > > DEF("watchdog", HAS_ARG, QEMU_OPTION_watchdog, \ > diff --git a/vl.c b/vl.c > index a5555fb..f12d3db 100644 > --- a/vl.c > +++ b/vl.c > @@ -472,6 +472,12 @@ static QemuOptsList qemu_icount_opts = { > }, { > .name = "align", > .type = QEMU_OPT_BOOL, > + }, { > + .name = "rr", > + .type = QEMU_OPT_STRING, > + }, { > + .name = "rrfile", > + .type = QEMU_OPT_STRING, > }, > { /* end of list */ } > }, > @@ -2751,6 +2757,7 @@ int main(int argc, char **argv, char **envp) > { > int i; > int snapshot, linux_boot; > + const char *icount_option = NULL; > const char *initrd_filename; > const char *kernel_filename, *kernel_cmdline; > const char *boot_order; > @@ -3770,6 +3777,8 @@ int main(int argc, char **argv, char **envp) > } > } > > + replay_configure(icount_opts); Is it possible to call this together with configure_icount (or even from configure_icount)? > opts = qemu_get_machine_opts(); > optarg = qemu_opt_get(opts, "type"); > if (optarg) { > @@ -4137,6 +4146,11 @@ int main(int argc, char **argv, char **envp) > qemu_opts_del(icount_opts); > } > > + if (replay_mode != REPLAY_MODE_NONE && !use_icount) { > + fprintf(stderr, "Please enable icount to use record/replay\n"); > + exit(1); > + } Can be checked in configure_icount and/or replay_configure. > /* clean up network at qemu process termination */ > atexit(&net_cleanup); > > @@ -4173,7 +4187,7 @@ int main(int argc, char **argv, char **envp) > } > > /* open the virtual block devices */ > - if (snapshot) > + if (snapshot || replay_mode != REPLAY_MODE_NONE) > qemu_opts_foreach(qemu_find_opts("drive"), drive_enable_snapshot, NULL, 0); Please add braces around "if" body, since you are at it. > if (qemu_opts_foreach(qemu_find_opts("drive"), drive_init_func, > &machine_class->block_default_type, 1) != 0) { > Otherwise looks good. Paolo