[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [RFC v9 02/32] accel/tcg: split tcg_start_vcpu_thread
From: |
Alex Bennée |
Subject: |
Re: [RFC v9 02/32] accel/tcg: split tcg_start_vcpu_thread |
Date: |
Wed, 09 Dec 2020 09:03:22 +0000 |
User-agent: |
mu4e 1.5.7; emacs 28.0.50 |
Claudio Fontana <cfontana@suse.de> writes:
> after the initial split into 3 tcg variants, we proceed to also
> split tcg_start_vcpu_thread.
>
> We actually split it in 2 this time, since the icount variant
> just uses the round robin function.
>
> Suggested-by: Richard Henderson <richard.henderson@linaro.org>
> Signed-off-by: Claudio Fontana <cfontana@suse.de>
> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
> ---
> accel/tcg/tcg-all.c | 5 ++++
> accel/tcg/tcg-cpus-icount.c | 2 +-
> accel/tcg/tcg-cpus-mttcg.c | 29 +++++++++++++++++--
> accel/tcg/tcg-cpus-mttcg.h | 21 --------------
> accel/tcg/tcg-cpus-rr.c | 39 +++++++++++++++++++++++--
> accel/tcg/tcg-cpus-rr.h | 3 +-
> accel/tcg/tcg-cpus.c | 58 -------------------------------------
> accel/tcg/tcg-cpus.h | 1 -
> 8 files changed, 71 insertions(+), 87 deletions(-)
> delete mode 100644 accel/tcg/tcg-cpus-mttcg.h
>
> diff --git a/accel/tcg/tcg-all.c b/accel/tcg/tcg-all.c
> index e42a028043..1ac0b76515 100644
> --- a/accel/tcg/tcg-all.c
> +++ b/accel/tcg/tcg-all.c
> @@ -105,6 +105,11 @@ static int tcg_init(MachineState *ms)
> tcg_exec_init(s->tb_size * 1024 * 1024);
> mttcg_enabled = s->mttcg_enabled;
>
> + /*
> + * Initialize TCG regions
> + */
> + tcg_region_init();
> +
It might be worth noting in the commit log this is OK because the
accelerator is now guaranteed to be initialised so you know the details
of MTTCG when initialising the regions.
> if (mttcg_enabled) {
> cpus_register_accel(&tcg_cpus_mttcg);
> } else if (icount_enabled()) {
> diff --git a/accel/tcg/tcg-cpus-icount.c b/accel/tcg/tcg-cpus-icount.c
> index d3af3afb6d..82dbe2cacf 100644
<snip>
> diff --git a/accel/tcg/tcg-cpus-mttcg.h b/accel/tcg/tcg-cpus-mttcg.h
> deleted file mode 100644
> index d1bd771f49..0000000000
> --- a/accel/tcg/tcg-cpus-mttcg.h
> +++ /dev/null
> @@ -1,21 +0,0 @@
> -/*
> - * QEMU TCG Multi Threaded vCPUs implementation
> - *
> - * Copyright 2020 SUSE LLC
> - *
> - * This work is licensed under the terms of the GNU GPL, version 2 or later.
> - * See the COPYING file in the top-level directory.
> - */
> -
> -#ifndef TCG_CPUS_MTTCG_H
> -#define TCG_CPUS_MTTCG_H
> -
> -/*
> - * In the multi-threaded case each vCPU has its own thread. The TLS
> - * variable current_cpu can be used deep in the code to find the
> - * current CPUState for a given thread.
> - */
Ahh gone now ;-)
> -
> -void *tcg_cpu_thread_fn(void *arg);
> -
> -#endif /* TCG_CPUS_MTTCG_H */
> diff --git a/accel/tcg/tcg-cpus-rr.c b/accel/tcg/tcg-cpus-rr.c
> index ad50a3765f..f3b262bec7 100644
> --- a/accel/tcg/tcg-cpus-rr.c
> +++ b/accel/tcg/tcg-cpus-rr.c
> @@ -144,7 +144,7 @@ static void deal_with_unplugged_cpus(void)
> * elsewhere.
> */
>
> -void *tcg_rr_cpu_thread_fn(void *arg)
> +static void *tcg_rr_cpu_thread_fn(void *arg)
> {
> CPUState *cpu = arg;
>
> @@ -262,8 +262,43 @@ void *tcg_rr_cpu_thread_fn(void *arg)
> return NULL;
> }
>
> +void rr_start_vcpu_thread(CPUState *cpu)
> +{
> + char thread_name[VCPU_THREAD_NAME_SIZE];
> + static QemuCond *single_tcg_halt_cond;
> + static QemuThread *single_tcg_cpu_thread;
> +
> + g_assert(tcg_enabled());
> + parallel_cpus = false;
> +
> + if (!single_tcg_cpu_thread) {
> + cpu->thread = g_malloc0(sizeof(QemuThread));
> + cpu->halt_cond = g_malloc0(sizeof(QemuCond));
> + qemu_cond_init(cpu->halt_cond);
> +
> + /* share a single thread for all cpus with TCG */
> + snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "ALL CPUs/TCG");
> + qemu_thread_create(cpu->thread, thread_name,
> + tcg_rr_cpu_thread_fn,
> + cpu, QEMU_THREAD_JOINABLE);
> +
> + single_tcg_halt_cond = cpu->halt_cond;
> + single_tcg_cpu_thread = cpu->thread;
> +#ifdef _WIN32
> + cpu->hThread = qemu_thread_get_handle(cpu->thread);
> +#endif
> + } else {
> + /* we share the thread */
> + cpu->thread = single_tcg_cpu_thread;
> + cpu->halt_cond = single_tcg_halt_cond;
> + cpu->thread_id = first_cpu->thread_id;
> + cpu->can_do_io = 1;
> + cpu->created = true;
I was wonder if we should be duplicating hThread here but on closer
examination it looks like it's only used by HAX/WHPX accelerators so
maybe this is a candidate for accelerator specific CPU data?
Otherwise LGTM:
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
--
Alex Bennée
- [RFC v9 00/22] i386 cleanup, Claudio Fontana, 2020/12/08
- [RFC v9 02/32] accel/tcg: split tcg_start_vcpu_thread, Claudio Fontana, 2020/12/08
- Re: [RFC v9 02/32] accel/tcg: split tcg_start_vcpu_thread,
Alex Bennée <=
- [RFC v9 03/32] accel/tcg: rename tcg-cpus functions to match module name, Claudio Fontana, 2020/12/08
- [RFC v9 04/32] i386: move kvm accel files into kvm/, Claudio Fontana, 2020/12/08
- [RFC v9 01/32] accel/tcg: split CpusAccel into three TCG variants, Claudio Fontana, 2020/12/08
- [RFC v9 05/32] i386: move whpx accel files into whpx/, Claudio Fontana, 2020/12/08
- [RFC v9 06/32] i386: move hax accel files into hax/, Claudio Fontana, 2020/12/08