qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Alex Bennée" <alex.bennee@linaro.org>
To: dovgaluk@ispras.ru, rth@twiddle.net, pbonzini@redhat.com
Cc: peter.maydell@linaro.org, qemu-devel@nongnu.org,
	mttcg@listserver.greensocs.com, fred.konrad@greensocs.com,
	a.rigo@virtualopensystems.com, cota@braap.org,
	bobby.prani@gmail.com, nikunj@linux.vnet.ibm.com,
	"Alex Bennée" <alex.bennee@linaro.org>,
	"Peter Crosthwaite" <crosthwaite.peter@gmail.com>
Subject: [Qemu-devel] [RFC PATCH v1 8/9] cpus: don't credit executed instructions before they have run
Date: Mon,  3 Apr 2017 13:45:23 +0100	[thread overview]
Message-ID: <20170403124524.10824-9-alex.bennee@linaro.org> (raw)
In-Reply-To: <20170403124524.10824-1-alex.bennee@linaro.org>

Outside of the vCPU thread icount time will only be tracked against
timers_state.qemu_icount. We no longer credit cycles until they have
completed the run. Inside the vCPU thread we adjust for passage of
time by looking at how many have run so far. This is only valid inside
the vCPU thread while it is running.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
 cpus.c            | 27 +++++++++++++++++++++------
 include/qom/cpu.h |  1 +
 2 files changed, 22 insertions(+), 6 deletions(-)

diff --git a/cpus.c b/cpus.c
index 87638a75d2..3d18374b0e 100644
--- a/cpus.c
+++ b/cpus.c
@@ -223,6 +223,15 @@ void qemu_tcg_configure(QemuOpts *opts, Error **errp)
     }
 }
 
+/* The current number of executed instructions is based on what we
+ * originally budgeted minus the current state of the decrementing
+ * icount counters in extra/u16.low.
+ */
+static int64_t cpu_get_icount_executed(CPUState *cpu)
+{
+    return cpu->icount_budget - (cpu->icount_decr.u16.low + cpu->icount_extra);
+}
+
 int64_t cpu_get_icount_raw(void)
 {
     int64_t icount;
@@ -234,7 +243,8 @@ int64_t cpu_get_icount_raw(void)
             fprintf(stderr, "Bad icount read\n");
             exit(1);
         }
-        icount -= (cpu->icount_decr.u16.low + cpu->icount_extra);
+        /* Take into account what has run */
+        icount += cpu_get_icount_executed(cpu);
     }
     return icount;
 }
@@ -1195,7 +1205,10 @@ static void prepare_icount_for_run(CPUState *cpu)
 
         count = tcg_get_icount_limit();
 
-        timers_state.qemu_icount += count;
+        /* To calculate what we have executed so far we need to know
+         * what we originally budgeted to run this cycle */
+        cpu->icount_budget = count;
+
         decr = (count > 0xffff) ? 0xffff : count;
         count -= decr;
         cpu->icount_decr.u16.low = decr;
@@ -1206,16 +1219,18 @@ static void prepare_icount_for_run(CPUState *cpu)
 static void process_icount_data(CPUState *cpu)
 {
     if (use_icount) {
-        /* Fold pending instructions back into the
-           instruction counter, and clear the interrupt flag.  */
-        timers_state.qemu_icount -= (cpu->icount_decr.u16.low
-                        + cpu->icount_extra);
+        /* Account for executed instructions */
+        timers_state.qemu_icount += cpu_get_icount_executed(cpu);
 
         /* We must be under BQL here as cpu_exit can tweak
            icount_decr.u32 */
         g_assert(qemu_mutex_iothread_locked());
+
+        /* Reset the counters */
         cpu->icount_decr.u32 = 0;
         cpu->icount_extra = 0;
+        cpu->icount_budget = 0;
+
         replay_account_executed_instructions();
     }
 }
diff --git a/include/qom/cpu.h b/include/qom/cpu.h
index c3292efe1c..5d10359c8f 100644
--- a/include/qom/cpu.h
+++ b/include/qom/cpu.h
@@ -332,6 +332,7 @@ struct CPUState {
     /* updates protected by BQL */
     uint32_t interrupt_request;
     int singlestep_enabled;
+    int64_t icount_budget;
     int64_t icount_extra;
     sigjmp_buf jmp_env;
 
-- 
2.11.0

  parent reply	other threads:[~2017-04-03 12:45 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-04-03 12:45 [Qemu-devel] [RFC PATCH v1 0/9] MTTCG and record/replay fixes for rc3 Alex Bennée
2017-04-03 12:45 ` [Qemu-devel] [RFC PATCH v1 1/9] scripts/qemugdb/mtree.py: fix up mtree dump Alex Bennée
2017-04-03 12:45 ` [Qemu-devel] [RFC PATCH v1 2/9] scripts/qemu-gdb/timers.py: new helper to dump timer state Alex Bennée
2017-04-03 14:02   ` Philippe Mathieu-Daudé
2017-04-03 12:45 ` [Qemu-devel] [RFC PATCH v1 3/9] scripts/replay-dump.py: replay log dumper Alex Bennée
2017-04-03 12:45 ` [Qemu-devel] [RFC PATCH v1 4/9] target/i386/misc_helper: wrap BQL around another IRQ generator Alex Bennée
2017-04-04 16:53   ` Richard Henderson
2017-04-04 17:36     ` Eduardo Habkost
2017-04-03 12:45 ` [Qemu-devel] [RFC PATCH v1 5/9] cpus: remove icount handling from qemu_tcg_cpu_thread_fn Alex Bennée
2017-04-04 16:53   ` Richard Henderson
2017-04-03 12:45 ` [Qemu-devel] [RFC PATCH v1 6/9] cpus: check cpu->running in cpu_get_icount_raw() Alex Bennée
2017-04-03 14:00   ` Philippe Mathieu-Daudé
2017-04-04 16:54   ` Richard Henderson
2017-04-03 12:45 ` [Qemu-devel] [RFC PATCH v1 7/9] cpus: move icount preparation out of tcg_exec_cpu Alex Bennée
2017-04-04  5:39   ` Pavel Dovgalyuk
2017-04-04  8:56     ` Alex Bennée
2017-04-04 10:46       ` Alex Bennée
2017-04-04 10:53         ` Paolo Bonzini
2017-04-04 12:31           ` Alex Bennée
2017-04-04 12:37             ` Paolo Bonzini
2017-04-04 13:29               ` Alex Bennée
2017-04-05 10:44                 ` Pavel Dovgalyuk
2017-04-05 11:18                   ` Alex Bennée
2017-04-03 12:45 ` Alex Bennée [this message]
2017-04-03 17:04   ` [Qemu-devel] [RFC PATCH v1 8/9] cpus: don't credit executed instructions before they have run Paolo Bonzini
2017-04-04  5:37   ` Pavel Dovgalyuk
2017-04-04 10:13     ` Paolo Bonzini
2017-04-07 11:27       ` Pavel Dovgalyuk
2017-04-04 14:39   ` Paolo Bonzini
2017-04-03 12:45 ` [Qemu-devel] [RFC PATCH v1 9/9] replay: gracefully handle backward time events Alex Bennée
2017-04-03 17:03 ` [Qemu-devel] [RFC PATCH v1 0/9] MTTCG and record/replay fixes for rc3 Paolo Bonzini
2017-04-04  8:50   ` Alex Bennée

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170403124524.10824-9-alex.bennee@linaro.org \
    --to=alex.bennee@linaro.org \
    --cc=a.rigo@virtualopensystems.com \
    --cc=bobby.prani@gmail.com \
    --cc=cota@braap.org \
    --cc=crosthwaite.peter@gmail.com \
    --cc=dovgaluk@ispras.ru \
    --cc=fred.konrad@greensocs.com \
    --cc=mttcg@listserver.greensocs.com \
    --cc=nikunj@linux.vnet.ibm.com \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=rth@twiddle.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).