From: Richard Henderson <richard.henderson@linaro.org>
To: qemu-devel@nongnu.org
Cc: peter.maydell@linaro.org, "Emilio G. Cota" <cota@braap.org>
Subject: [Qemu-devel] [PULL v2 01/20] cputlb: bring back tlb_flush_count under !TLB_DEBUG
Date: Tue, 10 Oct 2017 12:29:44 -0700 [thread overview]
Message-ID: <20171010193003.28857-2-richard.henderson@linaro.org> (raw)
In-Reply-To: <20171010193003.28857-1-richard.henderson@linaro.org>
From: "Emilio G. Cota" <cota@braap.org>
Commit f0aff0f124 ("cputlb: add assert_cpu_is_self checks") buried
the increment of tlb_flush_count under TLB_DEBUG. This results in
"info jit" always (mis)reporting 0 TLB flushes when !TLB_DEBUG.
Besides, under MTTCG tlb_flush_count is updated by several threads,
so in order not to lose counts we'd either have to use atomic ops
or distribute the counter, which is more scalable.
This patch does the latter by embedding tlb_flush_count in CPUArchState.
The global count is then easily obtained by iterating over the CPU list.
Note that this change also requires updating the accessors to
tlb_flush_count to use atomic_read/set whenever there may be conflicting
accesses (as defined in C11) to it.
Reviewed-by: Richard Henderson <rth@twiddle.net>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Signed-off-by: Emilio G. Cota <cota@braap.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
include/exec/cpu-defs.h | 1 +
include/exec/cputlb.h | 3 +--
accel/tcg/cputlb.c | 17 ++++++++++++++---
accel/tcg/translate-all.c | 2 +-
4 files changed, 17 insertions(+), 6 deletions(-)
diff --git a/include/exec/cpu-defs.h b/include/exec/cpu-defs.h
index bc8e7f848d..e43ff8346b 100644
--- a/include/exec/cpu-defs.h
+++ b/include/exec/cpu-defs.h
@@ -137,6 +137,7 @@ typedef struct CPUIOTLBEntry {
CPUTLBEntry tlb_v_table[NB_MMU_MODES][CPU_VTLB_SIZE]; \
CPUIOTLBEntry iotlb[NB_MMU_MODES][CPU_TLB_SIZE]; \
CPUIOTLBEntry iotlb_v[NB_MMU_MODES][CPU_VTLB_SIZE]; \
+ size_t tlb_flush_count; \
target_ulong tlb_flush_addr; \
target_ulong tlb_flush_mask; \
target_ulong vtlb_index; \
diff --git a/include/exec/cputlb.h b/include/exec/cputlb.h
index 3f941783c5..c91db211bc 100644
--- a/include/exec/cputlb.h
+++ b/include/exec/cputlb.h
@@ -23,7 +23,6 @@
/* cputlb.c */
void tlb_protect_code(ram_addr_t ram_addr);
void tlb_unprotect_code(ram_addr_t ram_addr);
-extern int tlb_flush_count;
-
+size_t tlb_flush_count(void);
#endif
#endif
diff --git a/accel/tcg/cputlb.c b/accel/tcg/cputlb.c
index bcbcc4db6c..5b1ef1442c 100644
--- a/accel/tcg/cputlb.c
+++ b/accel/tcg/cputlb.c
@@ -92,8 +92,18 @@ static void flush_all_helper(CPUState *src, run_on_cpu_func fn,
}
}
-/* statistics */
-int tlb_flush_count;
+size_t tlb_flush_count(void)
+{
+ CPUState *cpu;
+ size_t count = 0;
+
+ CPU_FOREACH(cpu) {
+ CPUArchState *env = cpu->env_ptr;
+
+ count += atomic_read(&env->tlb_flush_count);
+ }
+ return count;
+}
/* This is OK because CPU architectures generally permit an
* implementation to drop entries from the TLB at any time, so
@@ -112,7 +122,8 @@ static void tlb_flush_nocheck(CPUState *cpu)
}
assert_cpu_is_self(cpu);
- tlb_debug("(count: %d)\n", tlb_flush_count++);
+ atomic_set(&env->tlb_flush_count, env->tlb_flush_count + 1);
+ tlb_debug("(count: %zu)\n", tlb_flush_count());
tb_lock();
diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c
index 2d1ed06065..6b5d4bece2 100644
--- a/accel/tcg/translate-all.c
+++ b/accel/tcg/translate-all.c
@@ -1936,7 +1936,7 @@ void dump_exec_info(FILE *f, fprintf_function cpu_fprintf)
atomic_read(&tcg_ctx.tb_ctx.tb_flush_count));
cpu_fprintf(f, "TB invalidate count %d\n",
tcg_ctx.tb_ctx.tb_phys_invalidate_count);
- cpu_fprintf(f, "TLB flush count %d\n", tlb_flush_count);
+ cpu_fprintf(f, "TLB flush count %zu\n", tlb_flush_count());
tcg_dump_info(f, cpu_fprintf);
tb_unlock();
--
2.13.6
next prev parent reply other threads:[~2017-10-10 19:30 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-10-10 19:29 [Qemu-devel] [PULL v2 00/20] Queued TCG patches Richard Henderson
2017-10-10 19:29 ` Richard Henderson [this message]
2017-10-10 19:29 ` [Qemu-devel] [PULL v2 02/20] tcg: fix corruption of code_time profiling counter upon tb_flush Richard Henderson
2017-10-10 19:29 ` [Qemu-devel] [PULL v2 03/20] exec-all: fix typos in TranslationBlock's documentation Richard Henderson
2017-10-10 19:29 ` [Qemu-devel] [PULL v2 04/20] translate-all: make have_tb_lock static Richard Henderson
2017-10-10 19:29 ` [Qemu-devel] [PULL v2 05/20] cpu-exec: rename have_tb_lock to acquired_tb_lock in tb_find Richard Henderson
2017-10-10 19:29 ` [Qemu-devel] [PULL v2 06/20] tcg/i386: constify tcg_target_callee_save_regs Richard Henderson
2017-10-10 19:29 ` [Qemu-devel] [PULL v2 07/20] tcg/mips: " Richard Henderson
2017-10-10 19:29 ` [Qemu-devel] [PULL v2 08/20] tcg: remove addr argument from lookup_tb_ptr Richard Henderson
2017-10-10 19:29 ` [Qemu-devel] [PULL v2 09/20] tcg: consolidate TB lookups in tb_lookup__cpu_state Richard Henderson
2017-10-10 19:29 ` [Qemu-devel] [PULL v2 10/20] exec-all: bring tb->invalid into tb->cflags Richard Henderson
2017-10-10 19:29 ` [Qemu-devel] [PULL v2 11/20] translate-all: define and use DEBUG_TB_FLUSH_GATE Richard Henderson
2017-10-10 19:29 ` [Qemu-devel] [PULL v2 12/20] exec-all: introduce TB_PAGE_ADDR_FMT Richard Henderson
2017-10-10 19:29 ` [Qemu-devel] [PULL v2 13/20] translate-all: define and use DEBUG_TB_INVALIDATE_GATE Richard Henderson
2017-10-10 19:29 ` [Qemu-devel] [PULL v2 14/20] translate-all: define and use DEBUG_TB_CHECK_GATE Richard Henderson
2017-10-10 19:29 ` [Qemu-devel] [PULL v2 15/20] exec-all: extract tb->tc_* into a separate struct tc_tb Richard Henderson
2017-10-10 19:29 ` [Qemu-devel] [PULL v2 16/20] tci: move tci_regs to tcg_qemu_tb_exec's stack Richard Henderson
2017-10-10 19:30 ` [Qemu-devel] [PULL v2 17/20] tcg: take .helpers out of TCGContext Richard Henderson
2017-10-10 19:30 ` [Qemu-devel] [PULL v2 18/20] util: move qemu_real_host_page_size/mask to osdep.h Richard Henderson
2017-10-10 19:30 ` [Qemu-devel] [PULL v2 19/20] tcg: define TCG_HIGHWATER Richard Henderson
2017-10-10 19:30 ` [Qemu-devel] [PULL v2 20/20] tcg/mips: delete commented out extern keyword Richard Henderson
2017-10-11 0:22 ` [Qemu-devel] [PULL v2 00/20] Queued TCG patches no-reply
2017-10-11 12:06 ` Peter Maydell
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=20171010193003.28857-2-richard.henderson@linaro.org \
--to=richard.henderson@linaro.org \
--cc=cota@braap.org \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
/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).