From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34510) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z8VAr-0003Gs-GU for qemu-devel@nongnu.org; Fri, 26 Jun 2015 11:04:20 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Z8VAj-0000Za-Go for qemu-devel@nongnu.org; Fri, 26 Jun 2015 11:04:13 -0400 Received: from mx1.redhat.com ([209.132.183.28]:48408) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z8VAj-0000ZD-9C for qemu-devel@nongnu.org; Fri, 26 Jun 2015 11:04:05 -0400 References: <1435330053-18733-1-git-send-email-fred.konrad@greensocs.com> <1435330053-18733-9-git-send-email-fred.konrad@greensocs.com> From: Paolo Bonzini Message-ID: <558D69DF.2030101@redhat.com> Date: Fri, 26 Jun 2015 17:03:59 +0200 MIME-Version: 1.0 In-Reply-To: <1435330053-18733-9-git-send-email-fred.konrad@greensocs.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [RFC PATCH V6 08/18] cpu: remove exit_request global. List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: fred.konrad@greensocs.com, qemu-devel@nongnu.org, mttcg@greensocs.com Cc: peter.maydell@linaro.org, a.spyridakis@virtualopensystems.com, mark.burton@greensocs.com, agraf@suse.de, alistair.francis@xilinx.com, guillaume.delbergue@greensocs.com, alex.bennee@linaro.org On 26/06/2015 16:47, fred.konrad@greensocs.com wrote: > From: KONRAD Frederic > > This removes exit_request global and adds a variable in CPUState for this. > Only the flag for the first cpu is used for the moment as we are still with one > TCG thread. I think this should also be added to CPUThread. Paolo > Signed-off-by: KONRAD Frederic > --- > cpu-exec.c | 15 --------------- > cpus.c | 17 ++++++++++++++--- > 2 files changed, 14 insertions(+), 18 deletions(-) > > diff --git a/cpu-exec.c b/cpu-exec.c > index 5d9b518..0644383 100644 > --- a/cpu-exec.c > +++ b/cpu-exec.c > @@ -364,8 +364,6 @@ static void cpu_handle_debug_exception(CPUArchState *env) > > /* main execution loop */ > > -volatile sig_atomic_t exit_request; > - > int cpu_exec(CPUArchState *env) > { > CPUState *cpu = ENV_GET_CPU(env); > @@ -394,20 +392,8 @@ int cpu_exec(CPUArchState *env) > > current_cpu = cpu; > > - /* As long as current_cpu is null, up to the assignment just above, > - * requests by other threads to exit the execution loop are expected to > - * be issued using the exit_request global. We must make sure that our > - * evaluation of the global value is performed past the current_cpu > - * value transition point, which requires a memory barrier as well as > - * an instruction scheduling constraint on modern architectures. */ > - smp_mb(); > - > rcu_read_lock(); > > - if (unlikely(exit_request)) { > - cpu->exit_request = 1; > - } > - > cc->cpu_exec_enter(cpu); > > /* Calculate difference between guest clock and host clock. > @@ -496,7 +482,6 @@ int cpu_exec(CPUArchState *env) > } > } > if (unlikely(cpu->exit_request)) { > - cpu->exit_request = 0; > cpu->exception_index = EXCP_INTERRUPT; > cpu_loop_exit(cpu); > } > diff --git a/cpus.c b/cpus.c > index 23c316c..2541c56 100644 > --- a/cpus.c > +++ b/cpus.c > @@ -137,6 +137,8 @@ typedef struct TimersState { > } TimersState; > > static TimersState timers_state; > +/* CPU associated to this thread. */ > +static __thread CPUState *tcg_thread_cpu; > > int64_t cpu_get_icount_raw(void) > { > @@ -661,12 +663,18 @@ static void cpu_handle_guest_debug(CPUState *cpu) > cpu->stopped = true; > } > > +/** > + * cpu_signal > + * Signal handler when using TCG. > + */ > static void cpu_signal(int sig) > { > if (current_cpu) { > cpu_exit(current_cpu); > } > - exit_request = 1; > + > + /* FIXME: We might want to check if the cpu is running? */ > + tcg_thread_cpu->exit_request = true; > } > > #ifdef CONFIG_LINUX > @@ -1031,6 +1039,7 @@ static void *qemu_tcg_cpu_thread_fn(void *arg) > { > CPUState *cpu = arg; > > + tcg_thread_cpu = cpu; > qemu_tcg_init_cpu_signals(); > qemu_thread_get_self(cpu->thread); > > @@ -1393,7 +1402,8 @@ static void tcg_exec_all(void) > if (next_cpu == NULL) { > next_cpu = first_cpu; > } > - for (; next_cpu != NULL && !exit_request; next_cpu = CPU_NEXT(next_cpu)) { > + for (; next_cpu != NULL && !first_cpu->exit_request; > + next_cpu = CPU_NEXT(next_cpu)) { > CPUState *cpu = next_cpu; > CPUArchState *env = cpu->env_ptr; > > @@ -1410,7 +1420,8 @@ static void tcg_exec_all(void) > break; > } > } > - exit_request = 0; > + > + first_cpu->exit_request = 0; > } > > void list_cpus(FILE *f, fprintf_function cpu_fprintf, const char *optarg) >