[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v2 16/21] accel/tcg: actually cache our partial icount TB
From: |
Philippe Mathieu-Daudé |
Subject: |
Re: [PATCH v2 16/21] accel/tcg: actually cache our partial icount TB |
Date: |
Thu, 11 Feb 2021 11:21:44 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.6.0 |
Hi Alex,
On 2/10/21 11:10 PM, Alex Bennée wrote:
> When we exit a block under icount with instructions left to execute we
> might need a shorter than normal block to take us to the next
> deterministic event. Instead of creating a throwaway block on demand
> we use the existing compile flags mechanism to ensure we fetch (or
> compile and fetch) a block with exactly the number of instructions we
> need.
>
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
> Message-Id: <20210209182749.31323-8-alex.bennee@linaro.org>
>
> ---
> v2
> - drop pointless assert
> ---
> accel/tcg/cpu-exec.c | 17 +++++++++--------
> 1 file changed, 9 insertions(+), 8 deletions(-)
>
> diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c
> index d9ef69121c..5b6a4fe84b 100644
> --- a/accel/tcg/cpu-exec.c
> +++ b/accel/tcg/cpu-exec.c
> @@ -730,16 +730,17 @@ static inline void cpu_loop_exec_tb(CPUState *cpu,
> TranslationBlock *tb,
> /* Ensure global icount has gone forward */
> icount_update(cpu);
> /* Refill decrementer and continue execution. */
> - insns_left = MIN(0xffff, cpu->icount_budget);
> + insns_left = MIN(CF_COUNT_MASK, cpu->icount_budget);
Can you describe this change a bit please?
> cpu_neg(cpu)->icount_decr.u16.low = insns_left;
> cpu->icount_extra = cpu->icount_budget - insns_left;
> - if (!cpu->icount_extra && insns_left < tb->icount) {
> - /* Execute any remaining instructions, then let the main loop
> - * handle the next event.
> - */
> - if (insns_left > 0) {
> - cpu_exec_nocache(cpu, insns_left, tb, false);
> - }
> +
> + /*
> + * If the next tb has more instructions than we have left to
> + * execute we need to ensure we find/generate a TB with exactly
> + * insns_left instructions in it.
> + */
> + if (!cpu->icount_extra && insns_left > 0 && insns_left < tb->icount) {
> + cpu->cflags_next_tb = (tb->cflags & ~CF_COUNT_MASK) | insns_left;
> }
> #endif
> }
>
[PATCH v2 14/21] tests/plugin: expand insn test to detect duplicate instructions, Alex Bennée, 2021/02/10
[PATCH v2 20/21] accel/tcg: allow plugin instrumentation to be disable via cflags, Alex Bennée, 2021/02/10