From: Richard Henderson <richard.henderson@linaro.org>
To: qemu-devel@nongnu.org
Cc: r.bolshakov@yadro.com, j@getutm.app
Subject: [PATCH 20/26] tcg: Allocate code_gen_buffer into struct tcg_region_state
Date: Wed, 10 Mar 2021 18:21:50 -0600 [thread overview]
Message-ID: <20210311002156.253711-21-richard.henderson@linaro.org> (raw)
In-Reply-To: <20210311002156.253711-1-richard.henderson@linaro.org>
Do not mess around with setting values within tcg_init_ctx.
Put the values into 'region' directly, which is where they
will live for the lifetime of the program.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
tcg/region.c | 61 ++++++++++++++++++++++------------------------------
1 file changed, 26 insertions(+), 35 deletions(-)
diff --git a/tcg/region.c b/tcg/region.c
index f719a3edf3..d7ad1be1f9 100644
--- a/tcg/region.c
+++ b/tcg/region.c
@@ -520,8 +520,8 @@ static bool alloc_code_gen_buffer(size_t tb_size, int splitwx, Error **errp)
}
qemu_madvise(buf, size, QEMU_MADV_HUGEPAGE);
- tcg_ctx->code_gen_buffer = buf;
- tcg_ctx->code_gen_buffer_size = size;
+ region.start_aligned = buf;
+ region.total_size = size;
return true;
}
#elif defined(_WIN32)
@@ -542,8 +542,8 @@ static bool alloc_code_gen_buffer(size_t size, int splitwx, Error **errp)
return false;
}
- tcg_ctx->code_gen_buffer = buf;
- tcg_ctx->code_gen_buffer_size = size;
+ region.start_aligned = buf;
+ region.total_size = size;
return true;
}
#else
@@ -558,7 +558,6 @@ static bool alloc_code_gen_buffer_anon(size_t size, int prot,
"allocate %zu bytes for jit buffer", size);
return false;
}
- tcg_ctx->code_gen_buffer_size = size;
#ifdef __mips__
if (cross_256mb(buf, size)) {
@@ -596,7 +595,8 @@ static bool alloc_code_gen_buffer_anon(size_t size, int prot,
/* Request large pages for the buffer. */
qemu_madvise(buf, size, QEMU_MADV_HUGEPAGE);
- tcg_ctx->code_gen_buffer = buf;
+ region.start_aligned = buf;
+ region.total_size = size;
return true;
}
@@ -617,8 +617,8 @@ static bool alloc_code_gen_buffer_splitwx_memfd(size_t size, Error **errp)
return false;
}
/* The size of the mapping may have been adjusted. */
- size = tcg_ctx->code_gen_buffer_size;
- buf_rx = tcg_ctx->code_gen_buffer;
+ buf_rx = region.start_aligned;
+ size = region.total_size;
#endif
buf_rw = qemu_memfd_alloc("tcg-jit", size, 0, &fd, errp);
@@ -640,8 +640,8 @@ static bool alloc_code_gen_buffer_splitwx_memfd(size_t size, Error **errp)
#endif
close(fd);
- tcg_ctx->code_gen_buffer = buf_rw;
- tcg_ctx->code_gen_buffer_size = size;
+ region.start_aligned = buf_rw;
+ region.total_size = size;
tcg_splitwx_diff = buf_rx - buf_rw;
/* Request large pages for the buffer and the splitwx. */
@@ -692,7 +692,7 @@ static bool alloc_code_gen_buffer_splitwx_vmremap(size_t size, Error **errp)
return false;
}
- buf_rw = (mach_vm_address_t)tcg_ctx->code_gen_buffer;
+ buf_rw = region.start_aligned;
buf_rx = 0;
ret = mach_vm_remap(mach_task_self(),
&buf_rx,
@@ -804,11 +804,8 @@ static bool alloc_code_gen_buffer(size_t size, int splitwx, Error **errp)
*/
void tcg_region_init(size_t tb_size, int splitwx, unsigned max_cpus)
{
- void *buf, *aligned, *end;
- size_t total_size;
size_t page_size;
size_t region_size;
- size_t n_regions;
size_t i;
uintptr_t splitwx_diff;
bool ok;
@@ -817,39 +814,33 @@ void tcg_region_init(size_t tb_size, int splitwx, unsigned max_cpus)
splitwx, &error_fatal);
assert(ok);
- buf = tcg_init_ctx.code_gen_buffer;
- total_size = tcg_init_ctx.code_gen_buffer_size;
- page_size = qemu_real_host_page_size;
- n_regions = tcg_n_regions(total_size, max_cpus);
-
- /* The first region will be 'aligned - buf' bytes larger than the others */
- aligned = QEMU_ALIGN_PTR_UP(buf, page_size);
- g_assert(aligned < tcg_init_ctx.code_gen_buffer + total_size);
-
/*
* Make region_size a multiple of page_size, using aligned as the start.
* As a result of this we might end up with a few extra pages at the end of
* the buffer; we will assign those to the last region.
*/
- region_size = (total_size - (aligned - buf)) / n_regions;
+ region.n = tcg_n_regions(region.total_size, max_cpus);
+ page_size = qemu_real_host_page_size;
+ region_size = region.total_size / region.n;
region_size = QEMU_ALIGN_DOWN(region_size, page_size);
/* A region must have at least 2 pages; one code, one guard */
g_assert(region_size >= 2 * page_size);
+ region.stride = region_size;
+
+ /* Reserve space for guard pages. */
+ region.size = region_size - page_size;
+ region.total_size -= page_size;
+
+ /*
+ * The first region will be smaller than the others, via the prologue,
+ * which has yet to be allocated. For now, the first region begins at
+ * the page boundary.
+ */
+ region.start = region.start_aligned;
/* init the region struct */
qemu_mutex_init(®ion.lock);
- region.n = n_regions;
- region.size = region_size - page_size;
- region.stride = region_size;
- region.start = buf;
- region.start_aligned = aligned;
- /* page-align the end, since its last page will be a guard page */
- end = QEMU_ALIGN_PTR_DOWN(buf + total_size, page_size);
- /* account for that last guard page */
- end -= page_size;
- total_size = end - aligned;
- region.total_size = total_size;
/* set guard pages */
splitwx_diff = tcg_splitwx_diff;
--
2.25.1
next prev parent reply other threads:[~2021-03-11 0:32 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-11 0:21 [PATCH 00/26] tcg: Workaround macOS 11.2 mprotect bug Richard Henderson
2021-03-11 0:21 ` [PATCH 01/26] meson: Split out tcg/meson.build Richard Henderson
2021-03-13 17:36 ` Philippe Mathieu-Daudé
2021-03-11 0:21 ` [PATCH 02/26] meson: Move disas/tci.c to disas/meson.build Richard Henderson
2021-03-13 17:36 ` Philippe Mathieu-Daudé
2021-03-13 18:46 ` Richard Henderson
2021-03-11 0:21 ` [PATCH 03/26] meson: Split out fpu/meson.build Richard Henderson
2021-03-13 17:37 ` Philippe Mathieu-Daudé
2021-03-11 0:21 ` [PATCH 04/26] tcg: Re-order tcg_region_init vs tcg_prologue_init Richard Henderson
2021-03-11 0:21 ` [PATCH 05/26] tcg: Remove error return from tcg_region_initial_alloc__locked Richard Henderson
2021-03-13 17:37 ` Philippe Mathieu-Daudé
2021-03-11 0:21 ` [PATCH 06/26] tcg: Split out tcg_region_initial_alloc Richard Henderson
2021-03-11 0:21 ` [PATCH 07/26] tcg: Split out tcg_region_prologue_set Richard Henderson
2021-03-11 0:21 ` [PATCH 08/26] tcg: Split out region.c Richard Henderson
2021-03-11 0:21 ` [PATCH 09/26] accel/tcg: Inline cpu_gen_init Richard Henderson
2021-03-13 17:38 ` Philippe Mathieu-Daudé
2021-03-11 0:21 ` [PATCH 10/26] accel/tcg: Move alloc_code_gen_buffer to tcg/region.c Richard Henderson
2021-03-13 18:48 ` Richard Henderson
2021-03-11 0:21 ` [PATCH 11/26] accel/tcg: Rename tcg_init to tcg_init_machine Richard Henderson
2021-03-13 17:39 ` Philippe Mathieu-Daudé
2021-03-11 0:21 ` [PATCH 12/26] tcg: Create tcg_init Richard Henderson
2021-03-13 19:27 ` Philippe Mathieu-Daudé
2021-03-13 19:28 ` Richard Henderson
2021-03-11 0:21 ` [PATCH 13/26] accel/tcg: Merge tcg_exec_init into tcg_init_machine Richard Henderson
2021-03-11 0:21 ` [PATCH 14/26] accel/tcg: Pass down max_cpus to tcg_init Richard Henderson
2021-03-13 17:45 ` Philippe Mathieu-Daudé
2021-03-11 0:21 ` [PATCH 15/26] tcg: Introduce tcg_max_ctxs Richard Henderson
2021-03-13 17:48 ` Philippe Mathieu-Daudé
2021-03-11 0:21 ` [PATCH 16/26] tcg: Move MAX_CODE_GEN_BUFFER_SIZE to tcg-target.h Richard Henderson
2021-03-11 0:42 ` BALATON Zoltan
2021-03-13 16:00 ` Richard Henderson
2021-03-11 0:21 ` [PATCH 17/26] tcg: Replace region.end with region.total_size Richard Henderson
2021-03-11 0:21 ` [PATCH 18/26] tcg: Tidy tcg_n_regions Richard Henderson
2021-03-11 0:21 ` [PATCH 19/26] tcg: Tidy split_cross_256mb Richard Henderson
2021-03-11 0:21 ` Richard Henderson [this message]
2021-03-11 0:21 ` [PATCH 21/26] tcg: Return the map protection from alloc_code_gen_buffer Richard Henderson
2021-03-11 0:21 ` [PATCH 22/26] tcg: Sink qemu_madvise call to common code Richard Henderson
2021-03-11 0:21 ` [PATCH 23/26] tcg: Do not set guard pages in the rx buffer Richard Henderson
2021-03-11 0:21 ` [PATCH 24/26] util/osdep: Add qemu_mprotect_rw Richard Henderson
2021-03-13 17:51 ` Philippe Mathieu-Daudé
2021-03-11 0:21 ` [PATCH 25/26] tcg: Merge buffer protection and guard page protection Richard Henderson
2021-03-11 0:21 ` [PATCH 26/26] tcg: When allocating for !splitwx, begin with PROT_NONE Richard Henderson
2021-03-11 0:52 ` [PATCH 00/26] tcg: Workaround macOS 11.2 mprotect bug no-reply
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=20210311002156.253711-21-richard.henderson@linaro.org \
--to=richard.henderson@linaro.org \
--cc=j@getutm.app \
--cc=qemu-devel@nongnu.org \
--cc=r.bolshakov@yadro.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).