From: Sergey Fedorov <serge.fdrv@gmail.com>
To: "Alex Bennée" <alex.bennee@linaro.org>,
mttcg@listserver.greensocs.com, qemu-devel@nongnu.org,
fred.konrad@greensocs.com, a.rigo@virtualopensystems.com,
cota@braap.org, bobby.prani@gmail.com
Cc: mark.burton@greensocs.com, pbonzini@redhat.com,
jan.kiszka@siemens.com, rth@twiddle.net,
peter.maydell@linaro.org, claudio.fontana@huawei.com,
Peter Crosthwaite <crosthwaite.peter@gmail.com>
Subject: Re: [Qemu-devel] [RFC v3 14/19] tcg: remove global exit_request
Date: Tue, 28 Jun 2016 19:20:14 +0300 [thread overview]
Message-ID: <5772A3BE.6050207@gmail.com> (raw)
In-Reply-To: <1464986428-6739-15-git-send-email-alex.bennee@linaro.org>
On 03/06/16 23:40, Alex Bennée wrote:
> The only remaining use of the global exit_request flag is now to ensure
> we exit the run_loop when we first start to process pending work. This
> is just as easily done by setting the first_cpu->exit_request flag.
>
> We lightly re-factor the main vCPU thread to ensure cpu->exit_requests
> cause us to exit the main loop and process any IO requests that might
> come along.
>
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
> ---
> cpu-exec-common.c | 2 --
> cpu-exec.c | 10 +++-------
> cpus.c | 35 +++++++++++++++++++++++------------
> include/exec/exec-all.h | 2 --
> 4 files changed, 26 insertions(+), 23 deletions(-)
>
> diff --git a/cpu-exec-common.c b/cpu-exec-common.c
> index f42d24a..1b4fb53 100644
> --- a/cpu-exec-common.c
> +++ b/cpu-exec-common.c
> @@ -23,8 +23,6 @@
> #include "exec/exec-all.h"
> #include "exec/memory-internal.h"
>
> -bool exit_request;
> -
> /* exit the current TB from a signal handler. The host registers are
> restored in a state compatible with the CPU emulator
> */
> diff --git a/cpu-exec.c b/cpu-exec.c
> index 68e804b..1613c63 100644
> --- a/cpu-exec.c
> +++ b/cpu-exec.c
> @@ -541,9 +541,8 @@ static inline void cpu_loop_exec_tb(CPUState *cpu, TranslationBlock *tb,
> /* Something asked us to stop executing
> * chained TBs; just continue round the main
> * loop. Whatever requested the exit will also
> - * have set something else (eg exit_request or
> - * interrupt_request) which we will handle
> - * next time around the loop. But we need to
> + * have set something else (eg interrupt_request) which we
> + * will handle next time around the loop. But we need to
> * ensure the tcg_exit_req read in generated code
> * comes before the next read of cpu->exit_request
> * or cpu->interrupt_request.
> @@ -594,15 +593,12 @@ int cpu_exec(CPUState *cpu)
> current_cpu = cpu;
>
> if (cpu_handle_halt(cpu)) {
> + cpu->exit_request = true;
Why do we need to do this here?
> return EXCP_HALTED;
> }
>
> rcu_read_lock();
>
> - if (unlikely(atomic_mb_read(&exit_request))) {
> - cpu->exit_request = 1;
> - }
> -
> cc->cpu_exec_enter(cpu);
>
> /* Calculate difference between guest clock and host clock.
> diff --git a/cpus.c b/cpus.c
> index a139ad3..a84f02c 100644
> --- a/cpus.c
> +++ b/cpus.c
> @@ -1169,6 +1169,18 @@ static int64_t tcg_get_icount_limit(void)
> }
> }
>
> +static void handle_icount_deadline(void)
> +{
> + if (use_icount) {
> + int64_t deadline =
> + qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL);
> +
> + if (deadline == 0) {
> + qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
> + }
> + }
> +}
> +
> static int tcg_cpu_exec(CPUState *cpu)
> {
> int ret;
> @@ -1276,11 +1288,11 @@ static void *qemu_tcg_cpu_thread_fn(void *arg)
> timer_mod(kick_timer, TCG_KICK_FREQ);
> }
>
> - /* process any pending work */
> - atomic_mb_set(&exit_request, 1);
> -
> cpu = first_cpu;
>
> + /* process any pending work */
> + atomic_mb_set(&cpu->exit_request, 1);
Sometimes we use atomic_*() to operate on 'cpu->exit_request', sometimes
not. I am wondering if there are some rules about that?
Kind regards,
Sergey
> +
> while (1) {
> /* Account partial waits to QEMU_CLOCK_VIRTUAL. */
> qemu_account_warp_timer();
> @@ -1289,7 +1301,7 @@ static void *qemu_tcg_cpu_thread_fn(void *arg)
> cpu = first_cpu;
> }
>
> - for (; cpu != NULL && !exit_request; cpu = CPU_NEXT(cpu)) {
> + while (cpu && !cpu->exit_request) {
> atomic_mb_set(&tcg_current_rr_cpu, cpu);
>
> qemu_clock_enable(QEMU_CLOCK_VIRTUAL,
> @@ -1303,22 +1315,21 @@ static void *qemu_tcg_cpu_thread_fn(void *arg)
> }
> } else if (cpu->stop || cpu->stopped) {
> break;
> + } else if (cpu->exit_request) {
> + break;
> }
>
> + cpu = CPU_NEXT(cpu);
> } /* for cpu.. */
> /* Does not need atomic_mb_set because a spurious wakeup is okay. */
> atomic_set(&tcg_current_rr_cpu, NULL);
>
> - /* Pairs with smp_wmb in qemu_cpu_kick. */
> - atomic_mb_set(&exit_request, 0);
> + if (cpu && cpu->exit_request) {
> + atomic_mb_set(&cpu->exit_request, 0);
> + }
>
> - if (use_icount) {
> - int64_t deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL);
> + handle_icount_deadline();
>
> - if (deadline == 0) {
> - qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
> - }
> - }
> qemu_tcg_wait_io_event(QTAILQ_FIRST(&cpus));
> }
>
> diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h
> index 31f4c38..7919aac 100644
> --- a/include/exec/exec-all.h
> +++ b/include/exec/exec-all.h
> @@ -405,6 +405,4 @@ bool memory_region_is_unassigned(MemoryRegion *mr);
> /* vl.c */
> extern int singlestep;
>
> -extern bool exit_request;
> -
> #endif
next prev parent reply other threads:[~2016-06-28 16:20 UTC|newest]
Thread overview: 62+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-06-03 20:40 [Qemu-devel] [RFC v3 00/19] Base enabling patches for MTTCG Alex Bennée
2016-06-03 20:40 ` [Qemu-devel] [RFC v3 01/19] cpus: make all_vcpus_paused() return bool Alex Bennée
2016-06-07 15:05 ` Richard Henderson
2016-06-03 20:40 ` [Qemu-devel] [RFC v3 02/19] translate_all: DEBUG_FLUSH -> DEBUG_TB_FLUSH Alex Bennée
2016-06-07 14:54 ` Richard Henderson
2016-06-03 20:40 ` [Qemu-devel] [RFC v3 03/19] translate-all: add DEBUG_LOCKING asserts Alex Bennée
2016-06-23 14:34 ` Sergey Fedorov
2016-06-23 17:14 ` Alex Bennée
2016-06-23 18:43 ` Sergey Fedorov
2016-07-01 23:21 ` Richard Henderson
2016-06-03 20:40 ` [Qemu-devel] [RFC v3 04/19] docs: new design document multi-thread-tcg.txt (DRAFTING) Alex Bennée
2016-06-23 21:33 ` Sergey Fedorov
2016-06-03 20:40 ` [Qemu-devel] [RFC v3 05/19] exec: add assert_debug_safe and notes on debug structures Alex Bennée
2016-06-24 15:28 ` Sergey Fedorov
2016-06-03 20:40 ` [Qemu-devel] [RFC v3 06/19] tcg: comment on which functions have to be called with tb_lock held Alex Bennée
2016-06-24 15:38 ` Sergey Fedorov
2016-06-03 20:40 ` [Qemu-devel] [RFC v3 07/19] translate-all: Add assert_memory_lock annotations Alex Bennée
2016-06-24 15:48 ` Sergey Fedorov
2016-06-03 20:40 ` [Qemu-devel] [RFC v3 08/19] tcg: protect TBContext with tb_lock Alex Bennée
2016-07-01 23:40 ` Richard Henderson
2016-06-03 20:40 ` [Qemu-devel] [RFC v3 09/19] target-arm/arm-powerctl: wake up sleeping CPUs Alex Bennée
2016-06-03 20:40 ` [Qemu-devel] [RFC v3 10/19] tcg: cpus rm tcg_exec_all() Alex Bennée
2016-06-24 17:09 ` Sergey Fedorov
2016-07-01 23:50 ` Richard Henderson
2016-06-03 20:40 ` [Qemu-devel] [RFC v3 11/19] tcg: add options for enabling MTTCG Alex Bennée
2016-06-27 21:07 ` Sergey Fedorov
2016-07-22 16:17 ` Alex Bennée
2016-07-01 23:53 ` Richard Henderson
2016-07-02 7:11 ` Alex Bennée
2016-07-02 7:38 ` Sergey Fedorov
2016-07-04 10:10 ` Paolo Bonzini
2016-06-03 20:40 ` [Qemu-devel] [RFC v3 12/19] tcg: add kick timer for single-threaded vCPU emulation Alex Bennée
2016-06-27 21:20 ` Sergey Fedorov
2016-07-02 0:17 ` Richard Henderson
2016-07-02 7:36 ` Sergey Fedorov
2016-06-03 20:40 ` [Qemu-devel] [RFC v3 13/19] tcg: rename tcg_current_cpu to tcg_current_rr_cpu Alex Bennée
2016-06-06 15:30 ` Paolo Bonzini
2016-06-06 16:05 ` Alex Bennée
2016-06-06 17:05 ` Paolo Bonzini
2016-06-06 17:26 ` Alex Bennée
2016-06-06 18:25 ` Paolo Bonzini
2016-06-07 12:59 ` Alex Bennée
2016-06-03 20:40 ` [Qemu-devel] [RFC v3 14/19] tcg: remove global exit_request Alex Bennée
2016-06-28 16:20 ` Sergey Fedorov [this message]
2016-08-03 11:42 ` Alex Bennée
2016-06-03 20:40 ` [Qemu-devel] [RFC v3 15/19] tcg: drop global lock during TCG code execution Alex Bennée
2016-06-28 16:54 ` Sergey Fedorov
2016-08-10 13:51 ` Alex Bennée
2016-06-03 20:40 ` [Qemu-devel] [RFC v3 16/19] tcg: move locking for tb_invalidate_phys_page_range up Alex Bennée
2016-06-28 19:43 ` Sergey Fedorov
2016-06-28 19:51 ` Sergey Fedorov
2016-06-03 20:40 ` [Qemu-devel] [RFC v3 17/19] tcg: enable thread-per-vCPU Alex Bennée
2016-06-29 14:09 ` Sergey Fedorov
2016-08-10 14:44 ` Alex Bennée
2016-06-03 20:40 ` [Qemu-devel] [RFC v3 18/19] tcg: Ensure safe TB lookup out of 'tb_lock' Alex Bennée
2016-06-03 20:40 ` [Qemu-devel] [RFC v3 19/19] cpu-exec: remove tb_lock from the hot-path Alex Bennée
2016-06-29 14:35 ` Sergey Fedorov
2016-06-29 14:47 ` Alex Bennée
2016-06-29 14:52 ` Sergey Fedorov
2016-06-29 16:08 ` Alex Bennée
2016-06-30 9:24 ` Sergey Fedorov
2016-06-04 14:40 ` [Qemu-devel] [RFC v3 00/19] Base enabling patches for MTTCG Pranith Kumar
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=5772A3BE.6050207@gmail.com \
--to=serge.fdrv@gmail.com \
--cc=a.rigo@virtualopensystems.com \
--cc=alex.bennee@linaro.org \
--cc=bobby.prani@gmail.com \
--cc=claudio.fontana@huawei.com \
--cc=cota@braap.org \
--cc=crosthwaite.peter@gmail.com \
--cc=fred.konrad@greensocs.com \
--cc=jan.kiszka@siemens.com \
--cc=mark.burton@greensocs.com \
--cc=mttcg@listserver.greensocs.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=rth@twiddle.net \
/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).