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 10/19] tcg: cpus rm tcg_exec_all()
Date: Fri, 24 Jun 2016 20:09:59 +0300 [thread overview]
Message-ID: <576D6967.7090306@gmail.com> (raw)
In-Reply-To: <1464986428-6739-11-git-send-email-alex.bennee@linaro.org>
On 03/06/16 23:40, Alex Bennée wrote:
> In preparation for multi-threaded TCG we remove tcg_exec_all and move
> all the CPU cycling into the main thread function. When MTTCG is enabled
> we shall use a separate thread function which only handles one vCPU.
>
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Sergey Fedorov <sergey.fedorov@linaro.org>
>
> ---
> v2
> - update timer calls to new API on rebase
> v3
> - move tcg_cpu_exec above thread function, drop static fwd declaration
> ---
> cpus.c | 185 +++++++++++++++++++++++++++++++----------------------------------
> 1 file changed, 89 insertions(+), 96 deletions(-)
>
> diff --git a/cpus.c b/cpus.c
> index c404dd7..4cc2ce6 100644
> --- a/cpus.c
> +++ b/cpus.c
> @@ -69,7 +69,6 @@
>
> #endif /* CONFIG_LINUX */
>
> -static CPUState *next_cpu;
> int64_t max_delay;
> int64_t max_advance;
>
> @@ -1119,7 +1118,67 @@ static void *qemu_dummy_cpu_thread_fn(void *arg)
> #endif
> }
>
> -static void tcg_exec_all(void);
> +static int64_t tcg_get_icount_limit(void)
> +{
> + int64_t deadline;
> +
> + if (replay_mode != REPLAY_MODE_PLAY) {
> + deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL);
> +
> + /* Maintain prior (possibly buggy) behaviour where if no deadline
> + * was set (as there is no QEMU_CLOCK_VIRTUAL timer) or it is more than
> + * INT32_MAX nanoseconds ahead, we still use INT32_MAX
> + * nanoseconds.
> + */
> + if ((deadline < 0) || (deadline > INT32_MAX)) {
> + deadline = INT32_MAX;
> + }
> +
> + return qemu_icount_round(deadline);
> + } else {
> + return replay_get_instructions();
> + }
> +}
> +
> +static int tcg_cpu_exec(CPUState *cpu)
> +{
> + int ret;
> +#ifdef CONFIG_PROFILER
> + int64_t ti;
> +#endif
> +
> +#ifdef CONFIG_PROFILER
> + ti = profile_getclock();
> +#endif
> + if (use_icount) {
> + int64_t count;
> + int decr;
> + timers_state.qemu_icount -= (cpu->icount_decr.u16.low
> + + cpu->icount_extra);
> + cpu->icount_decr.u16.low = 0;
> + cpu->icount_extra = 0;
> + count = tcg_get_icount_limit();
> + timers_state.qemu_icount += count;
> + decr = (count > 0xffff) ? 0xffff : count;
> + count -= decr;
> + cpu->icount_decr.u16.low = decr;
> + cpu->icount_extra = count;
> + }
> + ret = cpu_exec(cpu);
> +#ifdef CONFIG_PROFILER
> + tcg_time += profile_getclock() - ti;
> +#endif
> + if (use_icount) {
> + /* Fold pending instructions back into the
> + instruction counter, and clear the interrupt flag. */
> + timers_state.qemu_icount -= (cpu->icount_decr.u16.low
> + + cpu->icount_extra);
> + cpu->icount_decr.u32 = 0;
> + cpu->icount_extra = 0;
> + replay_account_executed_instructions();
> + }
> + return ret;
> +}
>
> static void *qemu_tcg_cpu_thread_fn(void *arg)
> {
> @@ -1150,8 +1209,35 @@ static void *qemu_tcg_cpu_thread_fn(void *arg)
> /* process any pending work */
> atomic_mb_set(&exit_request, 1);
>
> + cpu = first_cpu;
> +
> while (1) {
> - tcg_exec_all();
> + /* Account partial waits to QEMU_CLOCK_VIRTUAL. */
> + qemu_account_warp_timer();
> +
> + if (!cpu) {
> + cpu = first_cpu;
> + }
> +
> + for (; cpu != NULL && !exit_request; cpu = CPU_NEXT(cpu)) {
> +
> + qemu_clock_enable(QEMU_CLOCK_VIRTUAL,
> + (cpu->singlestep_enabled & SSTEP_NOTIMER) == 0);
> +
> + if (cpu_can_run(cpu)) {
> + int r = tcg_cpu_exec(cpu);
> + if (r == EXCP_DEBUG) {
> + cpu_handle_guest_debug(cpu);
> + break;
> + }
> + } else if (cpu->stop || cpu->stopped) {
> + break;
> + }
> +
> + } /* for cpu.. */
> +
> + /* Pairs with smp_wmb in qemu_cpu_kick. */
> + atomic_mb_set(&exit_request, 0);
>
> if (use_icount) {
> int64_t deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL);
> @@ -1448,99 +1534,6 @@ int vm_stop_force_state(RunState state)
> }
> }
>
> -static int64_t tcg_get_icount_limit(void)
> -{
> - int64_t deadline;
> -
> - if (replay_mode != REPLAY_MODE_PLAY) {
> - deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL);
> -
> - /* Maintain prior (possibly buggy) behaviour where if no deadline
> - * was set (as there is no QEMU_CLOCK_VIRTUAL timer) or it is more than
> - * INT32_MAX nanoseconds ahead, we still use INT32_MAX
> - * nanoseconds.
> - */
> - if ((deadline < 0) || (deadline > INT32_MAX)) {
> - deadline = INT32_MAX;
> - }
> -
> - return qemu_icount_round(deadline);
> - } else {
> - return replay_get_instructions();
> - }
> -}
> -
> -static int tcg_cpu_exec(CPUState *cpu)
> -{
> - int ret;
> -#ifdef CONFIG_PROFILER
> - int64_t ti;
> -#endif
> -
> -#ifdef CONFIG_PROFILER
> - ti = profile_getclock();
> -#endif
> - if (use_icount) {
> - int64_t count;
> - int decr;
> - timers_state.qemu_icount -= (cpu->icount_decr.u16.low
> - + cpu->icount_extra);
> - cpu->icount_decr.u16.low = 0;
> - cpu->icount_extra = 0;
> - count = tcg_get_icount_limit();
> - timers_state.qemu_icount += count;
> - decr = (count > 0xffff) ? 0xffff : count;
> - count -= decr;
> - cpu->icount_decr.u16.low = decr;
> - cpu->icount_extra = count;
> - }
> - ret = cpu_exec(cpu);
> -#ifdef CONFIG_PROFILER
> - tcg_time += profile_getclock() - ti;
> -#endif
> - if (use_icount) {
> - /* Fold pending instructions back into the
> - instruction counter, and clear the interrupt flag. */
> - timers_state.qemu_icount -= (cpu->icount_decr.u16.low
> - + cpu->icount_extra);
> - cpu->icount_decr.u32 = 0;
> - cpu->icount_extra = 0;
> - replay_account_executed_instructions();
> - }
> - return ret;
> -}
> -
> -static void tcg_exec_all(void)
> -{
> - int r;
> -
> - /* Account partial waits to QEMU_CLOCK_VIRTUAL. */
> - qemu_account_warp_timer();
> -
> - if (next_cpu == NULL) {
> - next_cpu = first_cpu;
> - }
> - for (; next_cpu != NULL && !exit_request; next_cpu = CPU_NEXT(next_cpu)) {
> - CPUState *cpu = next_cpu;
> -
> - qemu_clock_enable(QEMU_CLOCK_VIRTUAL,
> - (cpu->singlestep_enabled & SSTEP_NOTIMER) == 0);
> -
> - if (cpu_can_run(cpu)) {
> - r = tcg_cpu_exec(cpu);
> - if (r == EXCP_DEBUG) {
> - cpu_handle_guest_debug(cpu);
> - break;
> - }
> - } else if (cpu->stop || cpu->stopped) {
> - break;
> - }
> - }
> -
> - /* Pairs with smp_wmb in qemu_cpu_kick. */
> - atomic_mb_set(&exit_request, 0);
> -}
> -
> void list_cpus(FILE *f, fprintf_function cpu_fprintf, const char *optarg)
> {
> /* XXX: implement xxx_cpu_list for targets that still miss it */
next prev parent reply other threads:[~2016-06-24 17:10 UTC|newest]
Thread overview: 63+ 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 ` [RFC v3 09/19] target-arm/arm-powerctl: wake up sleeping CPUs Alex Bennée
2016-06-03 20:40 ` [Qemu-devel] " 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 [this message]
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
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=576D6967.7090306@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.