[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 07/11] cpus: don't credit executed instructions befor
From: |
Alex Bennée |
Subject: |
[Qemu-devel] [PULL 07/11] cpus: don't credit executed instructions before they have run |
Date: |
Mon, 10 Apr 2017 13:55:20 +0100 |
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 <address@hidden>
diff --git a/cpus.c b/cpus.c
index 6034b104c3..0ecb0b87f0 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,14 +1219,14 @@ 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);
/* Reset the counters */
cpu->icount_decr.u16.low = 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
- [Qemu-devel] [PULL 04/11] cpus: remove icount handling from qemu_tcg_cpu_thread_fn, (continued)
- [Qemu-devel] [PULL 04/11] cpus: remove icount handling from qemu_tcg_cpu_thread_fn, Alex Bennée, 2017/04/10
- [Qemu-devel] [PULL 02/11] cpus: fix wrong define name, Alex Bennée, 2017/04/10
- [Qemu-devel] [PULL 05/11] cpus: check cpu->running in cpu_get_icount_raw(), Alex Bennée, 2017/04/10
- [Qemu-devel] [PULL 06/11] cpus: move icount preparation out of tcg_exec_cpu, Alex Bennée, 2017/04/10
- [Qemu-devel] [PULL 03/11] target/i386/misc_helper: wrap BQL around another IRQ generator, Alex Bennée, 2017/04/10
- [Qemu-devel] [PULL 01/11] scripts/qemugdb/mtree.py: fix up mtree dump, Alex Bennée, 2017/04/10
- [Qemu-devel] [PULL 10/11] cpus: call cpu_update_icount on read, Alex Bennée, 2017/04/10
- [Qemu-devel] [PULL 08/11] cpus: introduce cpu_update_icount helper, Alex Bennée, 2017/04/10
- [Qemu-devel] [PULL 11/11] replay: assert time only goes forward, Alex Bennée, 2017/04/10
- [Qemu-devel] [PULL 09/11] cpu-exec: update icount after each TB_EXIT, Alex Bennée, 2017/04/10
- [Qemu-devel] [PULL 07/11] cpus: don't credit executed instructions before they have run,
Alex Bennée <=
- Re: [Qemu-devel] [PULL 00/11] Final icount and misc MTTCG fixes for 2.9, Peter Maydell, 2017/04/10