qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Alex Bennée" <alex.bennee@linaro.org>
To: qemu-devel@nongnu.org
Cc: peter.maydell@linaro.org, "Emilio Cota" <cota@braap.org>,
	"Alex Bennée" <alex.bennee@linaro.org>,
	"Richard Henderson" <richard.henderson@linaro.org>,
	"Paolo Bonzini" <pbonzini@redhat.com>
Subject: [PULL 31/35] plugins: fix optimization in plugin_gen_disable_mem_helpers
Date: Thu, 26 Jan 2023 11:22:46 +0000	[thread overview]
Message-ID: <20230126112250.2584701-32-alex.bennee@linaro.org> (raw)
In-Reply-To: <20230126112250.2584701-1-alex.bennee@linaro.org>

From: Emilio Cota <cota@braap.org>

We were mistakenly checking tcg_ctx->plugin_insn as a canary to know
whether the TB had emitted helpers that might have accessed memory.

The problem is that tcg_ctx->plugin_insn gets updated on every
instruction in the TB, which results in us wrongly performing the
optimization (i.e. not clearing cpu->plugin_mem_cbs) way too often,
since it's not rare that the last instruction in the TB doesn't
use helpers.

Fix it by tracking a per-TB canary.

While at it, expand documentation.

Related: #1381

Signed-off-by: Emilio Cota <cota@braap.org>
Message-Id: <20230108164731.61469-2-cota@braap.org>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20230124180127.1881110-32-alex.bennee@linaro.org>

diff --git a/include/qemu/plugin.h b/include/qemu/plugin.h
index a772e14193..e0ebedef84 100644
--- a/include/qemu/plugin.h
+++ b/include/qemu/plugin.h
@@ -118,7 +118,10 @@ struct qemu_plugin_insn {
     void *haddr;
     GArray *cbs[PLUGIN_N_CB_TYPES][PLUGIN_N_CB_SUBTYPES];
     bool calls_helpers;
+
+    /* if set, the instruction calls helpers that might access guest memory */
     bool mem_helper;
+
     bool mem_only;
 };
 
@@ -158,6 +161,10 @@ struct qemu_plugin_tb {
     void *haddr1;
     void *haddr2;
     bool mem_only;
+
+    /* if set, the TB calls helpers that might access guest memory */
+    bool mem_helper;
+
     GArray *cbs[PLUGIN_N_CB_SUBTYPES];
 };
 
diff --git a/accel/tcg/plugin-gen.c b/accel/tcg/plugin-gen.c
index c7d6514840..17a686bd9e 100644
--- a/accel/tcg/plugin-gen.c
+++ b/accel/tcg/plugin-gen.c
@@ -579,7 +579,8 @@ static void inject_mem_helper(TCGOp *begin_op, GArray *arr)
  * is possible that the code we generate after the instruction is
  * dead, we also add checks before generating tb_exit etc.
  */
-static void inject_mem_enable_helper(struct qemu_plugin_insn *plugin_insn,
+static void inject_mem_enable_helper(struct qemu_plugin_tb *ptb,
+                                     struct qemu_plugin_insn *plugin_insn,
                                      TCGOp *begin_op)
 {
     GArray *cbs[2];
@@ -599,6 +600,7 @@ static void inject_mem_enable_helper(struct qemu_plugin_insn *plugin_insn,
         rm_ops(begin_op);
         return;
     }
+    ptb->mem_helper = true;
 
     arr = g_array_sized_new(false, false,
                             sizeof(struct qemu_plugin_dyn_cb), n_cbs);
@@ -626,15 +628,22 @@ void plugin_gen_disable_mem_helpers(void)
 {
     TCGv_ptr ptr;
 
-    if (likely(tcg_ctx->plugin_insn == NULL ||
-               !tcg_ctx->plugin_insn->mem_helper)) {
+    /*
+     * We could emit the clearing unconditionally and be done. However, this can
+     * be wasteful if for instance plugins don't track memory accesses, or if
+     * most TBs don't use helpers. Instead, emit the clearing iff the TB calls
+     * helpers that might access guest memory.
+     *
+     * Note: we do not reset plugin_tb->mem_helper here; a TB might have several
+     * exit points, and we want to emit the clearing from all of them.
+     */
+    if (!tcg_ctx->plugin_tb->mem_helper) {
         return;
     }
     ptr = tcg_const_ptr(NULL);
     tcg_gen_st_ptr(ptr, cpu_env, offsetof(CPUState, plugin_mem_cbs) -
                                  offsetof(ArchCPU, env));
     tcg_temp_free_ptr(ptr);
-    tcg_ctx->plugin_insn->mem_helper = false;
 }
 
 static void plugin_gen_tb_udata(const struct qemu_plugin_tb *ptb,
@@ -682,14 +691,14 @@ static void plugin_gen_mem_inline(const struct qemu_plugin_tb *ptb,
     inject_inline_cb(cbs, begin_op, op_rw);
 }
 
-static void plugin_gen_enable_mem_helper(const struct qemu_plugin_tb *ptb,
+static void plugin_gen_enable_mem_helper(struct qemu_plugin_tb *ptb,
                                          TCGOp *begin_op, int insn_idx)
 {
     struct qemu_plugin_insn *insn = g_ptr_array_index(ptb->insns, insn_idx);
-    inject_mem_enable_helper(insn, begin_op);
+    inject_mem_enable_helper(ptb, insn, begin_op);
 }
 
-static void plugin_gen_disable_mem_helper(const struct qemu_plugin_tb *ptb,
+static void plugin_gen_disable_mem_helper(struct qemu_plugin_tb *ptb,
                                           TCGOp *begin_op, int insn_idx)
 {
     struct qemu_plugin_insn *insn = g_ptr_array_index(ptb->insns, insn_idx);
@@ -750,7 +759,7 @@ static void pr_ops(void)
 #endif
 }
 
-static void plugin_gen_inject(const struct qemu_plugin_tb *plugin_tb)
+static void plugin_gen_inject(struct qemu_plugin_tb *plugin_tb)
 {
     TCGOp *op;
     int insn_idx = -1;
@@ -870,6 +879,7 @@ bool plugin_gen_tb_start(CPUState *cpu, const DisasContextBase *db,
         ptb->haddr1 = db->host_addr[0];
         ptb->haddr2 = NULL;
         ptb->mem_only = mem_only;
+        ptb->mem_helper = false;
 
         plugin_gen_empty_callback(PLUGIN_GEN_FROM_TB);
     }
-- 
2.34.1



  parent reply	other threads:[~2023-01-26 11:28 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-01-26 11:22 [PULL 00/35] Testing, docs, semihosting and plugin updates Alex Bennée
2023-01-26 11:22 ` [PULL 01/35] scripts/ci: update gitlab-runner playbook to use latest runner Alex Bennée
2023-01-26 11:22 ` [PULL 02/35] gitlab: add FF_SCRIPT_SECTIONS for timings Alex Bennée
2023-01-26 11:22 ` [PULL 03/35] gitlab: just use plain --cc=clang for custom runner build Alex Bennée
2023-01-26 11:22 ` [PULL 04/35] tests/unit: drop hacky race avoidance in test-io-channel-command Alex Bennée
2023-02-06 12:27   ` Philippe Mathieu-Daudé
2023-02-06 13:11     ` Alex Bennée
2023-02-06 13:22       ` Philippe Mathieu-Daudé
2023-01-26 11:22 ` [PULL 05/35] build-sys: fix crlf-ending C code Alex Bennée
2023-01-26 11:22 ` [PULL 06/35] .gitlab-ci.d/windows: do not disable opengl Alex Bennée
2023-01-26 11:22 ` [PULL 07/35] meson: replace Perl usage with Python Alex Bennée
2023-01-26 11:22 ` [PULL 08/35] docs: drop texinfo options Alex Bennée
2023-01-26 11:22 ` [PULL 09/35] gitlab: add lsan suppression file to workaround tcmalloc issues Alex Bennée
2023-01-26 11:22 ` [PULL 10/35] Update lcitool and fedora to 37 Alex Bennée
2023-01-26 11:22 ` [PULL 11/35] lcitool: drop perl from QEMU project/dependencies Alex Bennée
2023-01-26 11:22 ` [PULL 12/35] lcitool: drop texinfo " Alex Bennée
2023-01-26 11:22 ` [PULL 13/35] tests/docker: Install flex in debian-tricore-cross Alex Bennée
2023-01-26 11:22 ` [PULL 14/35] tests/docker: drop debian-tricore-cross's partial status Alex Bennée
2023-01-26 11:22 ` [PULL 15/35] tests/tcg: skip the vma-pthread test on CI Alex Bennée
2023-01-26 11:22 ` [PULL 16/35] tests/tcg: Use SIGKILL for timeout Alex Bennée
2023-01-26 11:22 ` [PULL 17/35] gitlab: wrap up test results for custom runners Alex Bennée
2023-01-26 11:22 ` [PULL 18/35] MAINTAINERS: Fix the entry for tests/tcg/nios2 Alex Bennée
2023-01-26 11:22 ` [PULL 19/35] docs: add hotlinks to about preface text Alex Bennée
2023-01-26 11:22 ` [PULL 20/35] docs: add a new section to outline emulation support Alex Bennée
2023-01-26 11:22 ` [PULL 21/35] semihosting: add semihosting section to the docs Alex Bennée
2023-01-26 11:22 ` [PULL 22/35] docs: add an introduction to the system docs Alex Bennée
2023-01-26 11:22 ` [PULL 23/35] semihosting: Write back semihosting data before completion callback Alex Bennée
2023-01-26 11:22 ` [PULL 24/35] semihosting: add O_BINARY flag in host_open for NT compatibility Alex Bennée
2023-01-26 11:22 ` [PULL 25/35] tests/tcg: add memory-sve test for aarch64 Alex Bennée
2023-01-26 11:22 ` [PULL 26/35] cpu: free cpu->tb_jmp_cache with RCU Alex Bennée
2023-01-26 11:22 ` [PULL 27/35] util/qht: add missing atomic_set(hashes[i]) Alex Bennée
2023-01-26 11:22 ` [PULL 28/35] thread: de-const qemu_spin_destroy Alex Bennée
2023-01-26 11:22 ` [PULL 29/35] util/qht: use striped locks under TSAN Alex Bennée
2023-01-26 11:22 ` [PULL 30/35] plugins: make qemu_plugin_user_exit's locking order consistent with fork_start's Alex Bennée
2023-01-26 11:22 ` Alex Bennée [this message]
2023-01-26 11:22 ` [PULL 32/35] translator: always pair plugin_gen_insn_{start, end} calls Alex Bennée
2023-01-26 11:22 ` [PULL 33/35] tcg: exclude non-memory effecting helpers from instrumentation Alex Bennée
2023-01-26 11:22 ` [PULL 34/35] cpu-exec: assert that plugin_mem_cbs is NULL after execution Alex Bennée
2023-01-26 11:22 ` [PULL 35/35] plugins: Iterate on cb_lists in qemu_plugin_user_exit Alex Bennée
2023-02-01 16:15 ` [PULL 00/35] Testing, docs, semihosting and plugin updates Peter Maydell
2023-02-01 18:06   ` Alex Bennée
2023-02-02 10:50     ` Peter Maydell
2023-02-02 17:12       ` 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=20230126112250.2584701-32-alex.bennee@linaro.org \
    --to=alex.bennee@linaro.org \
    --cc=cota@braap.org \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=richard.henderson@linaro.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).