mirror of https://gitee.com/openkylin/qemu.git
tcg: Tidy tcg_n_regions
Compute the value using straight division and bounds, rather than a loop. Pass in tb_size rather than reading from tcg_init_ctx.code_gen_buffer_size, Reviewed-by: Luis Pires <luis.pires@eldorado.org.br> Reviewed-by: Alex Bennée <alex.bennee@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
c2471ca0de
commit
01afda9919
29
tcg/region.c
29
tcg/region.c
|
@ -364,38 +364,33 @@ void tcg_region_reset_all(void)
|
||||||
tcg_region_tree_reset_all();
|
tcg_region_tree_reset_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
static size_t tcg_n_regions(unsigned max_cpus)
|
static size_t tcg_n_regions(size_t tb_size, unsigned max_cpus)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_USER_ONLY
|
#ifdef CONFIG_USER_ONLY
|
||||||
return 1;
|
return 1;
|
||||||
#else
|
#else
|
||||||
|
size_t n_regions;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* It is likely that some vCPUs will translate more code than others,
|
* It is likely that some vCPUs will translate more code than others,
|
||||||
* so we first try to set more regions than max_cpus, with those regions
|
* so we first try to set more regions than max_cpus, with those regions
|
||||||
* being of reasonable size. If that's not possible we make do by evenly
|
* being of reasonable size. If that's not possible we make do by evenly
|
||||||
* dividing the code_gen_buffer among the vCPUs.
|
* dividing the code_gen_buffer among the vCPUs.
|
||||||
*/
|
*/
|
||||||
size_t i;
|
|
||||||
|
|
||||||
/* Use a single region if all we have is one vCPU thread */
|
/* Use a single region if all we have is one vCPU thread */
|
||||||
if (max_cpus == 1 || !qemu_tcg_mttcg_enabled()) {
|
if (max_cpus == 1 || !qemu_tcg_mttcg_enabled()) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Try to have more regions than max_cpus, with each region being >= 2 MB */
|
/*
|
||||||
for (i = 8; i > 0; i--) {
|
* Try to have more regions than max_cpus, with each region being >= 2 MB.
|
||||||
size_t regions_per_thread = i;
|
* If we can't, then just allocate one region per vCPU thread.
|
||||||
size_t region_size;
|
*/
|
||||||
|
n_regions = tb_size / (2 * MiB);
|
||||||
region_size = tcg_init_ctx.code_gen_buffer_size;
|
if (n_regions <= max_cpus) {
|
||||||
region_size /= max_cpus * regions_per_thread;
|
return max_cpus;
|
||||||
|
|
||||||
if (region_size >= 2 * 1024u * 1024) {
|
|
||||||
return max_cpus * regions_per_thread;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
/* If we can't, then just allocate one region per vCPU thread */
|
return MIN(n_regions, max_cpus * 8);
|
||||||
return max_cpus;
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -833,7 +828,7 @@ void tcg_region_init(size_t tb_size, int splitwx, unsigned max_cpus)
|
||||||
buf = tcg_init_ctx.code_gen_buffer;
|
buf = tcg_init_ctx.code_gen_buffer;
|
||||||
total_size = tcg_init_ctx.code_gen_buffer_size;
|
total_size = tcg_init_ctx.code_gen_buffer_size;
|
||||||
page_size = qemu_real_host_page_size;
|
page_size = qemu_real_host_page_size;
|
||||||
n_regions = tcg_n_regions(max_cpus);
|
n_regions = tcg_n_regions(total_size, max_cpus);
|
||||||
|
|
||||||
/* The first region will be 'aligned - buf' bytes larger than the others */
|
/* The first region will be 'aligned - buf' bytes larger than the others */
|
||||||
aligned = QEMU_ALIGN_PTR_UP(buf, page_size);
|
aligned = QEMU_ALIGN_PTR_UP(buf, page_size);
|
||||||
|
|
Loading…
Reference in New Issue