From patchwork Wed Jul 16 12:18:02 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Sebastian Tanase X-Patchwork-Id: 370735 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3D9CF1400AF for ; Wed, 16 Jul 2014 22:21:28 +1000 (EST) Received: from localhost ([::1]:39159 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X7OD8-0006sn-3Z for incoming@patchwork.ozlabs.org; Wed, 16 Jul 2014 08:21:26 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50008) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X7OAf-0002Sy-DO for qemu-devel@nongnu.org; Wed, 16 Jul 2014 08:18:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1X7OAQ-0003fA-Id for qemu-devel@nongnu.org; Wed, 16 Jul 2014 08:18:53 -0400 Received: from zimbra3.corp.accelance.fr ([2001:4080:204::2:8]:47337) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X7OAQ-0003et-7y for qemu-devel@nongnu.org; Wed, 16 Jul 2014 08:18:38 -0400 Received: from localhost (localhost [127.0.0.1]) by zimbra3.corp.accelance.fr (Postfix) with ESMTP id CBD5D73473; Wed, 16 Jul 2014 14:18:36 +0200 (CEST) X-Virus-Scanned: amavisd-new at zimbra3.corp.accelance.fr Received: from zimbra3.corp.accelance.fr ([127.0.0.1]) by localhost (zimbra3.corp.accelance.fr [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id j-zw9jp0vTWP; Wed, 16 Jul 2014 14:18:31 +0200 (CEST) Received: from debian-seb.daviel.openwide.fr. (unknown [193.56.60.161]) by zimbra3.corp.accelance.fr (Postfix) with ESMTPSA id B4DDC73474; Wed, 16 Jul 2014 14:18:30 +0200 (CEST) From: Sebastian Tanase To: qemu-devel@nongnu.org Date: Wed, 16 Jul 2014 14:18:02 +0200 Message-Id: <1405513086-31246-3-git-send-email-sebastian.tanase@openwide.fr> X-Mailer: git-send-email 2.0.0.rc2 In-Reply-To: <1405513086-31246-1-git-send-email-sebastian.tanase@openwide.fr> References: <1405513086-31246-1-git-send-email-sebastian.tanase@openwide.fr> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2001:4080:204::2:8 Cc: kwolf@redhat.com, peter.maydell@linaro.org, alex@alex.org.uk, wenchaoqemu@gmail.com, quintela@redhat.com, mst@redhat.com, stefanha@redhat.com, armbru@redhat.com, lcapitulino@redhat.com, michael@walle.cc, camille.begue@openwide.fr, aliguori@amazon.com, crobinso@redhat.com, pbonzini@redhat.com, Sebastian Tanase , afaerber@suse.de, rth@twiddle.net Subject: [Qemu-devel] [RFC PATCH V4 2/6] icount: Add align option to icount X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org The align option is used for activating the align algorithm in order to synchronise the host clock and the guest clock. Signed-off-by: Sebastian Tanase Tested-by: Camille Bégué --- cpus.c | 19 ++++++++++++------- include/qemu-common.h | 1 + qemu-options.hx | 15 +++++++++++++-- vl.c | 4 ++++ 4 files changed, 30 insertions(+), 9 deletions(-) diff --git a/cpus.c b/cpus.c index dcca96a..34cc4c8 100644 --- a/cpus.c +++ b/cpus.c @@ -443,25 +443,30 @@ static const VMStateDescription vmstate_timers = { void configure_icount(QemuOpts *opts, Error **errp) { const char *option; + char *rem_str = NULL; seqlock_init(&timers_state.vm_clock_seqlock, NULL); vmstate_register(NULL, 0, &vmstate_timers, &timers_state); option = qemu_opt_get(opts, "shift"); if (!option) { + if (qemu_opt_get(opts, "align") != NULL) { + error_setg(errp, "Please specify shift option when using align"); + } return; } - /* When using -icount shift, the shift option will be - misinterpreted as a boolean */ - if (strcmp(option, "on") == 0 || strcmp(option, "off") == 0) { - error_setg(errp, "The shift option must be a number or auto"); - } - + icount_align_option = qemu_opt_get_bool(opts, "align", false); icount_warp_timer = timer_new_ns(QEMU_CLOCK_REALTIME, icount_warp_rt, NULL); if (strcmp(option, "auto") != 0) { - icount_time_shift = strtol(option, NULL, 0); + errno = 0; + icount_time_shift = strtol(option, &rem_str, 0); + if (errno != 0 || *rem_str != '\0' || !strlen(option)) { + error_setg(errp, "icount: Invalid shift value"); + } use_icount = 1; return; + } else if (icount_align_option) { + error_setg(errp, "shift=auto and align=on are incompatible"); } use_icount = 2; diff --git a/include/qemu-common.h b/include/qemu-common.h index cc346ec..860bb15 100644 --- a/include/qemu-common.h +++ b/include/qemu-common.h @@ -108,6 +108,7 @@ static inline char *realpath(const char *path, char *resolved_path) /* icount */ void configure_icount(QemuOpts *opts, Error **errp); extern int use_icount; +extern int icount_align_option; #include "qemu/osdep.h" #include "qemu/bswap.h" diff --git a/qemu-options.hx b/qemu-options.hx index 143def4..379d932 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -3011,9 +3011,9 @@ re-inject them. ETEXI DEF("icount", HAS_ARG, QEMU_OPTION_icount, \ - "-icount [shift=N|auto]\n" \ + "-icount [shift=N|auto][,align=on|off]\n" \ " enable virtual instruction counter with 2^N clock ticks per\n" \ - " instruction\n", QEMU_ARCH_ALL) + " instruction and enable aligning the host and virtual clocks\n", QEMU_ARCH_ALL) STEXI @item -icount [shift=@var{N}|auto] @findex -icount @@ -3026,6 +3026,17 @@ Note that while this option can give deterministic behavior, it does not provide cycle accurate emulation. Modern CPUs contain superscalar out of order cores with complex cache hierarchies. The number of instructions executed often has little or no correlation with actual performance. + +@option{align=on} will activate the delay algorithm which will try to +to synchronise the host clock and the virtual clock. The goal is to +have a guest running at the real frequency imposed by the shift option. +Whenever the guest clock is behind the host clock and if +@option{align=on} is specified then we print a messsage to the user +to inform about the delay. +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). ETEXI DEF("watchdog", HAS_ARG, QEMU_OPTION_watchdog, \ diff --git a/vl.c b/vl.c index 103027f..d270070 100644 --- a/vl.c +++ b/vl.c @@ -183,6 +183,7 @@ uint8_t *boot_splash_filedata; size_t boot_splash_filedata_size; uint8_t qemu_extra_params_fw[2]; +int icount_align_option; typedef struct FWBootEntry FWBootEntry; struct FWBootEntry { @@ -546,6 +547,9 @@ static QemuOptsList qemu_icount_opts = { { .name = "shift", .type = QEMU_OPT_STRING, + }, { + .name = "align", + .type = QEMU_OPT_BOOL, }, { /* end of list */ } },