From nobody Thu Nov 6 06:18:24 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1539860937812612.4250836856282; Thu, 18 Oct 2018 04:08:57 -0700 (PDT) Received: from localhost ([::1]:41649 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gD6Ah-0003iO-Vd for importer@patchew.org; Thu, 18 Oct 2018 07:08:56 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35584) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gD69H-0002d8-SM for qemu-devel@nongnu.org; Thu, 18 Oct 2018 07:07:29 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gD69G-00006B-9M for qemu-devel@nongnu.org; Thu, 18 Oct 2018 07:07:27 -0400 Received: from mail-lj1-x244.google.com ([2a00:1450:4864:20::244]:36418) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gD69F-00005J-Vo for qemu-devel@nongnu.org; Thu, 18 Oct 2018 07:07:26 -0400 Received: by mail-lj1-x244.google.com with SMTP id p89-v6so27320152ljb.3 for ; Thu, 18 Oct 2018 04:07:25 -0700 (PDT) Received: from localhost.localdomain ([77.221.221.49]) by smtp.gmail.com with ESMTPSA id u77-v6sm4575811lja.37.2018.10.18.04.07.22 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 18 Oct 2018 04:07:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references; bh=4eCGmlouvi724H+D2HVuSLbDo32hSMqys1/wXarPzAQ=; b=YxMUkNK0RSadI3f6NNTV+uXQPHDfT9tAvlhVOaFK19sSysUc8vcd/fTBtr9TINKl/b AKpe0sgX3tVk1zVvE0umFFlFHTQlsb29ZBqKCGErQXZgfaF1mOywnhVLHrB+WJGqzJyZ WfYwucqPfRJehvAvXzPRdkW003M8Bb+v2WRkiDhoignqs+Ew9XKxhgnVZNhIB7EGpsqn pFe86W7qVzlHx5nr1+PD9ySk3vXJsKaFaowqaCozGpIfi36vIqnayNA/yMZWLCE3kQ/7 +5VyOnEoAbxjzOawCoumfGeMDrDBnBswpi3dxkFokVU3ikUtKgpRxL3kuCyEMd0Bk2Wa WjFg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:in-reply-to:references; bh=4eCGmlouvi724H+D2HVuSLbDo32hSMqys1/wXarPzAQ=; b=DPZVcE9eNLB47kLjWoOt9bS33P88YvOou4jCJz9M8tzxKabslXmWbcciws7Op2pFdQ N65xn9J0LNck9kFV6iYijMFHYXydp9MSikA5UwqYwAxDJFvhhoq2HelY4Ydi8sC4NpRD e6mmFxjojJy0Cv8hnAhTZeabAYO4EpxhFJNIM127P4TL5EJ30Uh9AfnAMWpE4mxo/cy3 uDpRHnI1DyK+BYjKyC7vnG13fsFxlT5AA87hueU5uemM9Gu29C1k+C9GMUqFyPEdkwUh IxSFbuZeMlu8odmLSZ9a/GzcW/cNwPzZNC7znjXde0g0rkO70xK9uR/1BLs+EOxB8TwH vQuQ== X-Gm-Message-State: ABuFfoicqPWowm1LPiGQxKwT09L4lM8q/fcZzppNquTC/23cqse+Imkx 9ZCQJu9pCpUn+q5Dmpb1kAWIxj8Ht88= X-Google-Smtp-Source: ACcGV63lon/HUwhn+r4bugEmewaSrIGOrnsgYmpFYqgw3k/0KzpD0bvWwwxSZykrwrE9asfcfldu+A== X-Received: by 2002:a2e:1b9c:: with SMTP id c28-v6mr19290501ljf.73.1539860844243; Thu, 18 Oct 2018 04:07:24 -0700 (PDT) From: Artem Pisarenko To: qemu-devel@nongnu.org Date: Thu, 18 Oct 2018 17:04:31 +0600 Message-Id: <3a396555c19468ce89788cc6deabbfef4ab56035.1539860473.git.artem.k.pisarenko@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: References: In-Reply-To: References: X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::244 Subject: [Qemu-devel] [PATCH v3 4/4] Optimize record/replay checkpointing for all clocks it applies to X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Paolo Bonzini , Artem Pisarenko , Pavel Dovgalyuk Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDMRC_1 RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Removes redundant checkpoints in replay log when there are no expired timer= s in timers list, associated with corresponding clock (i.e. no rr events as= sociated with current clock value). This also improves performance in rr mode. Signed-off-by: Artem Pisarenko --- Notes: v3: - fixed compiler warning caused non-debug build to fail include/qemu/timer.h | 2 +- util/qemu-timer.c | 62 +++++++++++++++++++++++++-----------------------= ---- 2 files changed, 31 insertions(+), 33 deletions(-) diff --git a/include/qemu/timer.h b/include/qemu/timer.h index dc0fd14..bff8dac 100644 --- a/include/qemu/timer.h +++ b/include/qemu/timer.h @@ -65,7 +65,7 @@ typedef enum { * QEMU_TIMER_ATTR_EXTERNAL: drives external subsystem * * Timers with this attribute do not recorded in rr mode, therefore it cou= ld be - * used for the subsystems that operate outside the guest core. Applicable= only + * used for the subsystems that operate outside the guest core. Relevant o= nly * with virtual clock type. */ =20 diff --git a/util/qemu-timer.c b/util/qemu-timer.c index e2746cf..216d107 100644 --- a/util/qemu-timer.c +++ b/util/qemu-timer.c @@ -490,6 +490,7 @@ bool timerlist_run_timers(QEMUTimerList *timer_list) QEMUTimerCB *cb; void *opaque; bool need_replay_checkpoint =3D false; + ReplayCheckpoint replay_checkpoint_id; =20 if (!atomic_read(&timer_list->active_timers)) { return false; @@ -500,43 +501,40 @@ bool timerlist_run_timers(QEMUTimerList *timer_list) goto out; } =20 - switch (timer_list->clock->type) { - case QEMU_CLOCK_REALTIME: - break; - default: - case QEMU_CLOCK_VIRTUAL: - if (replay_mode !=3D REPLAY_MODE_NONE) { - /* Checkpoint for virtual clock is redundant in cases where - * it's being triggered with only non-EXTERNAL timers, because - * these timers don't change guest state directly. - * Since it has conditional dependence on specific timers, it = is - * subject to race conditions and requires special handling. - * See below. - */ + if (replay_mode !=3D REPLAY_MODE_NONE) { + /* Postpone actual checkpointing to timer list processing + * to properly check if we actually need it. + */ + switch (timer_list->clock->type) { + case QEMU_CLOCK_VIRTUAL: need_replay_checkpoint =3D true; + replay_checkpoint_id =3D CHECKPOINT_CLOCK_VIRTUAL; + break; + case QEMU_CLOCK_HOST: + need_replay_checkpoint =3D true; + replay_checkpoint_id =3D CHECKPOINT_CLOCK_HOST; + break; + case QEMU_CLOCK_VIRTUAL_RT: + need_replay_checkpoint =3D true; + replay_checkpoint_id =3D CHECKPOINT_CLOCK_VIRTUAL_RT; + break; + default: + break; } - break; - case QEMU_CLOCK_HOST: - if (!replay_checkpoint(CHECKPOINT_CLOCK_HOST)) { - goto out; - } - break; - case QEMU_CLOCK_VIRTUAL_RT: - if (!replay_checkpoint(CHECKPOINT_CLOCK_VIRTUAL_RT)) { - goto out; - } - break; } =20 /* - * Extract expired timers from active timers list and and process them. + * Extract expired timers from active timers list and and process them, + * taking into account checkpointing required in rr mode. * - * In rr mode we need "filtered" checkpointing for virtual clock. - * Checkpoint must be replayed before any non-EXTERNAL timer has been - * processed and only one time (virtual clock value stays same). But t= hese - * timers may appear in the timers list while it being processed, so t= his - * must be checked until we finally decide that "no timers left - we a= re - * done". + * Checkpoint must be replayed before any timer has been processed + * and only one time. But new timers may appear in the timers list whi= le + * it's being processed, so this must be checked until we finally deci= de + * that "no timers left - we are done" (to avoid skipping checkpoint d= ue to + * possible races). + * Also checkpoint for virtual clock is redundant in cases where it's = being + * triggered with only non-EXTERNAL timers, because these timers don't + * change guest state directly. */ current_time =3D qemu_clock_get_ns(timer_list->clock->type); qemu_mutex_lock(&timer_list->active_timers_lock); @@ -552,7 +550,7 @@ bool timerlist_run_timers(QEMUTimerList *timer_list) /* once we got here, checkpoint clock only once */ need_replay_checkpoint =3D false; qemu_mutex_unlock(&timer_list->active_timers_lock); - if (!replay_checkpoint(CHECKPOINT_CLOCK_VIRTUAL)) { + if (!replay_checkpoint(replay_checkpoint_id)) { goto out; } qemu_mutex_lock(&timer_list->active_timers_lock); --=20 2.7.4