From: "Alex Bennée" <alex.bennee@linaro.org>
To: qemu-devel@nongnu.org
Cc: "Richard Henderson" <richard.henderson@linaro.org>,
"Alexandre Iooss" <erdnaxe@crans.org>,
"Beraldo Leal" <bleal@redhat.com>,
"Thomas Huth" <thuth@redhat.com>, "John Snow" <jsnow@redhat.com>,
"Eduardo Habkost" <eduardo@habkost.net>,
"Elena Ufimtseva" <elena.ufimtseva@oracle.com>,
"Ed Maste" <emaste@freebsd.org>,
"Yanan Wang" <wangyanan55@huawei.com>,
"Cleber Rosa" <crosa@redhat.com>,
"Marc-André Lureau" <marcandre.lureau@redhat.com>,
"Li-Wen Hsu" <lwhsu@freebsd.org>,
"Markus Armbruster" <armbru@redhat.com>,
"Jagannathan Raman" <jag.raman@oracle.com>,
"Daniel P. Berrangé" <berrange@redhat.com>,
"Philippe Mathieu-Daudé" <philmd@linaro.org>,
"Michael Roth" <michael.roth@amd.com>,
"Wainer dos Santos Moschetta" <wainersm@redhat.com>,
"Alex Bennée" <alex.bennee@linaro.org>,
qemu-arm@nongnu.org,
"Marcel Apfelbaum" <marcel.apfelbaum@gmail.com>,
"Peter Maydell" <peter.maydell@linaro.org>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Mahmoud Mandour" <ma.mandourr@gmail.com>,
"John G Johnson" <john.g.johnson@oracle.com>,
"Emilio Cota" <cota@braap.org>
Subject: [PATCH 23/26] plugins: fix optimization in plugin_gen_disable_mem_helpers
Date: Tue, 10 Jan 2023 17:39:19 +0000 [thread overview]
Message-ID: <20230110173922.265055-24-alex.bennee@linaro.org> (raw)
In-Reply-To: <20230110173922.265055-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>
---
include/qemu/plugin.h | 7 +++++++
accel/tcg/plugin-gen.c | 26 ++++++++++++++++++--------
2 files changed, 25 insertions(+), 8 deletions(-)
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
next prev parent reply other threads:[~2023-01-10 18:16 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-10 17:38 [PATCH 00/26] current maintainer trees (testing/semihosting/plugins) Alex Bennée
2023-01-10 17:38 ` [PATCH 01/26] scripts/ci: update gitlab-runner playbook to use latest runner Alex Bennée
2023-01-10 17:38 ` [PATCH 02/26] gitlab: add FF_SCRIPT_SECTIONS for timings Alex Bennée
2023-01-12 14:26 ` Thomas Huth
2023-01-10 17:38 ` [PATCH 03/26] gitlab: just use plain --cc=clang for custom runner build Alex Bennée
2023-01-11 18:50 ` Richard Henderson
2023-01-10 17:39 ` [PATCH 04/26] tests/unit: drop hacky race avoidance in test-io-channel-command Alex Bennée
2023-01-12 12:21 ` Thomas Huth
2023-01-13 16:10 ` Marc-André Lureau
2023-01-10 17:39 ` [PATCH 05/26] build-sys: fix crlf-ending C code Alex Bennée
2023-01-10 17:39 ` [PATCH 06/26] .gitlab-ci.d/windows: do not disable opengl Alex Bennée
2023-01-10 17:39 ` [PATCH 07/26] configure: replace Perl usage with sed Alex Bennée
2023-01-13 8:29 ` Paolo Bonzini
2023-01-10 17:39 ` [PATCH 08/26] meson: replace Perl usage with Python Alex Bennée
2023-01-10 17:39 ` [PATCH 09/26] docs: drop texinfo options Alex Bennée
2023-01-10 17:39 ` [PATCH 10/26] Update lcitool and fedora to 37 Alex Bennée
2023-01-10 17:39 ` [PATCH 11/26] lcitool: drop perl from QEMU project/dependencies Alex Bennée
2023-01-10 17:39 ` [PATCH 12/26] lcitool: drop texinfo " Alex Bennée
2023-01-10 17:39 ` [PATCH 13/26] semihosting: Write back semihosting data before completion callback Alex Bennée
2023-01-10 17:39 ` [PATCH 14/26] semihosting: add O_BINARY flag in host_open for NT compatibility Alex Bennée
2023-01-10 17:39 ` [PATCH 15/26] docs: add a proper feature overview in "About QEMU" Alex Bennée
2023-01-10 17:39 ` [PATCH 16/26] semihosting: add semihosting section to the docs Alex Bennée
2023-01-11 19:06 ` Richard Henderson
2023-01-10 17:39 ` [PATCH 17/26] tests/tcg: add memory-sve test for aarch64 Alex Bennée
2023-01-11 18:54 ` Richard Henderson
2023-01-10 17:39 ` [PATCH 18/26] cpu: free cpu->tb_jmp_cache with RCU Alex Bennée
2023-01-11 19:08 ` Richard Henderson
2023-01-10 17:39 ` [PATCH 19/26] util/qht: add missing atomic_set(hashes[i]) Alex Bennée
2023-01-10 17:39 ` [PATCH 20/26] thread: de-const qemu_spin_destroy Alex Bennée
2023-01-11 19:09 ` Richard Henderson
2023-01-10 17:39 ` [PATCH 21/26] util/qht: use striped locks under TSAN Alex Bennée
2023-01-11 19:10 ` Richard Henderson
2023-01-10 17:39 ` [PATCH 22/26] plugins: make qemu_plugin_user_exit's locking order consistent with fork_start's Alex Bennée
2023-01-10 17:39 ` Alex Bennée [this message]
2023-01-10 17:39 ` [PATCH 24/26] translator: always pair plugin_gen_insn_{start, end} calls Alex Bennée
2023-01-11 19:11 ` Richard Henderson
2023-01-10 17:39 ` [PATCH 25/26] tcg: exclude lookup_tb_ptr from helper instrumentation Alex Bennée
2023-01-11 19:15 ` Richard Henderson
2023-01-12 9:52 ` Alex Bennée
2023-01-12 11:59 ` Alex Bennée
2023-01-10 17:39 ` [PATCH 26/26] cpu-exec: assert that plugin_mem_cbs is NULL after execution 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=20230110173922.265055-24-alex.bennee@linaro.org \
--to=alex.bennee@linaro.org \
--cc=armbru@redhat.com \
--cc=berrange@redhat.com \
--cc=bleal@redhat.com \
--cc=cota@braap.org \
--cc=crosa@redhat.com \
--cc=eduardo@habkost.net \
--cc=elena.ufimtseva@oracle.com \
--cc=emaste@freebsd.org \
--cc=erdnaxe@crans.org \
--cc=jag.raman@oracle.com \
--cc=john.g.johnson@oracle.com \
--cc=jsnow@redhat.com \
--cc=lwhsu@freebsd.org \
--cc=ma.mandourr@gmail.com \
--cc=marcandre.lureau@redhat.com \
--cc=marcel.apfelbaum@gmail.com \
--cc=michael.roth@amd.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=philmd@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
--cc=thuth@redhat.com \
--cc=wainersm@redhat.com \
--cc=wangyanan55@huawei.com \
/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).