From: "Alex Bennée" <alex.bennee@linaro.org>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: mttcg@listserver.greensocs.com, mark.burton@greensocs.com,
a.rigo@virtualopensystems.com, qemu-devel@nongnu.org,
guillaume.delbergue@greensocs.com, fred.konrad@greensocs.com
Subject: Re: [Qemu-devel] [RFC PATCH V7 13/19] add a callback when tb_invalidate is called.
Date: Mon, 10 Aug 2015 19:41:13 +0100 [thread overview]
Message-ID: <877fp3gf5i.fsf@linaro.org> (raw)
In-Reply-To: <55C8D6D2.4030908@redhat.com>
Paolo Bonzini <pbonzini@redhat.com> writes:
> On 10/08/2015 17:27, fred.konrad@greensocs.com wrote:
>> From: KONRAD Frederic <fred.konrad@greensocs.com>
>>
>> Instead of doing the jump cache invalidation directly in tb_invalidate delay it
>> after the exit so we don't have an other CPU trying to execute the code being
>> invalidated.
>>
>> Signed-off-by: KONRAD Frederic <fred.konrad@greensocs.com>
>> ---
>> translate-all.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--
>> 1 file changed, 59 insertions(+), 2 deletions(-)
>
> If you take the easy way and avoid the optimizations in patch 7, this is
> not necessary: tb_find_fast and tb_add_jump are only called from within
> tb_lock, so all of tb_jmp_cache/jmp_first/jmp_next are protected by tb_lock.
>
> Let's get everything in and then optimize; the order should be:
>
> - Alvise's LL/SC implementation
>
> - conversion of atomics to LL/SC for all front-ends
>
> - the main MTTCG series, reusing the locking already in-place for
> user-mode emulation (with some audit...)
- including dropping the cmpxchg fix and including Alvise's MTTCG aware patches
that build on top of LL/SC work.
>
> - any further push-downs of tb_lock
>
> Paolo
>
>> diff --git a/translate-all.c b/translate-all.c
>> index 954c67a..fc5162a 100644
>> --- a/translate-all.c
>> +++ b/translate-all.c
>> @@ -62,6 +62,7 @@
>> #include "translate-all.h"
>> #include "qemu/bitmap.h"
>> #include "qemu/timer.h"
>> +#include "sysemu/cpus.h"
>>
>> //#define DEBUG_TB_INVALIDATE
>> //#define DEBUG_FLUSH
>> @@ -967,14 +968,58 @@ static inline void tb_reset_jump(TranslationBlock *tb, int n)
>> tb_set_jmp_target(tb, n, (uintptr_t)(tb->tc_ptr + tb->tb_next_offset[n]));
>> }
>>
>> +struct CPUDiscardTBParams {
>> + CPUState *cpu;
>> + TranslationBlock *tb;
>> +};
>> +
>> +static void cpu_discard_tb_from_jmp_cache(void *opaque)
>> +{
>> + unsigned int h;
>> + struct CPUDiscardTBParams *params = opaque;
>> +
>> + h = tb_jmp_cache_hash_func(params->tb->pc);
>> + if (params->cpu->tb_jmp_cache[h] == params->tb) {
>> + params->cpu->tb_jmp_cache[h] = NULL;
>> + }
>> +
>> + g_free(opaque);
>> +}
>> +
>> +static void tb_invalidate_jmp_remove(void *opaque)
>> +{
>> + TranslationBlock *tb = opaque;
>> + TranslationBlock *tb1, *tb2;
>> + unsigned int n1;
>> +
>> + /* suppress this TB from the two jump lists */
>> + tb_jmp_remove(tb, 0);
>> + tb_jmp_remove(tb, 1);
>> +
>> + /* suppress any remaining jumps to this TB */
>> + tb1 = tb->jmp_first;
>> + for (;;) {
>> + n1 = (uintptr_t)tb1 & 3;
>> + if (n1 == 2) {
>> + break;
>> + }
>> + tb1 = (TranslationBlock *)((uintptr_t)tb1 & ~3);
>> + tb2 = tb1->jmp_next[n1];
>> + tb_reset_jump(tb1, n1);
>> + tb1->jmp_next[n1] = NULL;
>> + tb1 = tb2;
>> + }
>> + tb->jmp_first = (TranslationBlock *)((uintptr_t)tb | 2); /* fail safe */
>> +}
>> +
>> /* invalidate one TB */
>> void tb_phys_invalidate(TranslationBlock *tb, tb_page_addr_t page_addr)
>> {
>> CPUState *cpu;
>> PageDesc *p;
>> - unsigned int h, n1;
>> + unsigned int h;
>> tb_page_addr_t phys_pc;
>> - TranslationBlock *tb1, *tb2;
>> + struct CPUDiscardTBParams *params;
>>
>> tb_lock();
>>
>> @@ -997,6 +1042,9 @@ void tb_phys_invalidate(TranslationBlock *tb, tb_page_addr_t page_addr)
>>
>> tcg_ctx.tb_ctx.tb_invalidated_flag = 1;
>>
>> +#if 0 /*MTTCG*/
>> + TranslationBlock *tb1, *tb2;
>> + unsigned int n1;
>> /* remove the TB from the hash list */
>> h = tb_jmp_cache_hash_func(tb->pc);
>> CPU_FOREACH(cpu) {
>> @@ -1023,6 +1071,15 @@ void tb_phys_invalidate(TranslationBlock *tb, tb_page_addr_t page_addr)
>> tb1 = tb2;
>> }
>> tb->jmp_first = (TranslationBlock *)((uintptr_t)tb | 2); /* fail safe */
>> +#else
>> + CPU_FOREACH(cpu) {
>> + params = g_malloc(sizeof(struct CPUDiscardTBParams));
>> + params->cpu = cpu;
>> + params->tb = tb;
>> + async_run_on_cpu(cpu, cpu_discard_tb_from_jmp_cache, params);
>> + }
>> + async_run_safe_work_on_cpu(first_cpu, tb_invalidate_jmp_remove, tb);
>> +#endif /* MTTCG */
>>
>> tcg_ctx.tb_ctx.tb_phys_invalidate_count++;
>> tb_unlock();
>>
--
Alex Bennée
next prev parent reply other threads:[~2015-08-10 18:41 UTC|newest]
Thread overview: 81+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-08-10 15:26 [Qemu-devel] [RFC PATCH V7 00/19] Multithread TCG fred.konrad
2015-08-10 15:26 ` [Qemu-devel] [RFC PATCH V7 01/19] cpus: protect queued_work_* with work_mutex fred.konrad
2015-08-10 15:59 ` Paolo Bonzini
2015-08-10 16:04 ` Frederic Konrad
2015-08-10 16:06 ` Paolo Bonzini
2015-08-10 15:27 ` [Qemu-devel] [RFC PATCH V7 02/19] cpus: add tcg_exec_flag fred.konrad
2015-08-11 10:53 ` Paolo Bonzini
2015-08-11 11:11 ` Frederic Konrad
2015-08-11 12:57 ` Paolo Bonzini
2015-08-10 15:27 ` [Qemu-devel] [RFC PATCH V7 03/19] cpus: introduce async_run_safe_work_on_cpu fred.konrad
2015-08-10 15:27 ` [Qemu-devel] [RFC PATCH V7 04/19] replace spinlock by QemuMutex fred.konrad
2015-08-10 16:09 ` Paolo Bonzini
2015-08-10 15:27 ` [Qemu-devel] [RFC PATCH V7 05/19] remove unused spinlock fred.konrad
2015-08-10 15:27 ` [Qemu-devel] [RFC PATCH V7 06/19] add support for spin lock on POSIX systems exclusively fred.konrad
2015-08-10 16:10 ` Paolo Bonzini
2015-08-10 15:27 ` [Qemu-devel] [RFC PATCH V7 07/19] protect TBContext with tb_lock fred.konrad
2015-08-10 16:36 ` Paolo Bonzini
2015-08-10 16:50 ` Paolo Bonzini
2015-08-10 18:39 ` Alex Bennée
2015-08-11 8:31 ` Paolo Bonzini
2015-08-11 6:46 ` Frederic Konrad
2015-08-11 8:34 ` Paolo Bonzini
2015-08-11 9:21 ` Peter Maydell
2015-08-11 9:59 ` Paolo Bonzini
2015-08-12 17:45 ` Frederic Konrad
2015-08-12 18:20 ` Alex Bennée
2015-08-12 18:22 ` Paolo Bonzini
2015-08-14 8:38 ` Frederic Konrad
2015-08-15 0:04 ` Paolo Bonzini
2015-08-10 15:27 ` [Qemu-devel] [RFC PATCH V7 08/19] tcg: remove tcg_halt_cond global variable fred.konrad
2015-08-10 16:12 ` Paolo Bonzini
2015-08-10 15:27 ` [Qemu-devel] [RFC PATCH V7 09/19] Drop global lock during TCG code execution fred.konrad
2015-08-10 16:15 ` Paolo Bonzini
2015-08-11 6:55 ` Frederic Konrad
2015-08-11 20:12 ` Alex Bennée
2015-08-11 21:34 ` Frederic Konrad
2015-08-12 9:58 ` Paolo Bonzini
2015-08-12 12:32 ` Frederic Konrad
2015-08-10 15:27 ` [Qemu-devel] [RFC PATCH V7 10/19] cpu: remove exit_request global fred.konrad
2015-08-10 15:51 ` Paolo Bonzini
2015-08-10 15:27 ` [Qemu-devel] [RFC PATCH V7 11/19] tcg: switch on multithread fred.konrad
2015-08-13 11:17 ` Paolo Bonzini
2015-08-13 14:41 ` Frederic Konrad
2015-08-13 14:58 ` Paolo Bonzini
2015-08-13 15:18 ` Frederic Konrad
2015-08-10 15:27 ` [Qemu-devel] [RFC PATCH V7 12/19] Use atomic cmpxchg to atomically check the exclusive value in a STREX fred.konrad
2015-08-10 15:27 ` [Qemu-devel] [RFC PATCH V7 13/19] add a callback when tb_invalidate is called fred.konrad
2015-08-10 16:52 ` Paolo Bonzini
2015-08-10 18:41 ` Alex Bennée [this message]
2015-08-10 15:27 ` [Qemu-devel] [RFC PATCH V7 14/19] cpu: introduce tlb_flush*_all fred.konrad
2015-08-10 15:54 ` Paolo Bonzini
2015-08-10 16:00 ` Peter Maydell
2015-08-10 15:27 ` [Qemu-devel] [RFC PATCH V7 15/19] arm: use tlb_flush*_all fred.konrad
2015-08-10 15:27 ` [Qemu-devel] [RFC PATCH V7 16/19] translate-all: introduces tb_flush_safe fred.konrad
2015-08-10 16:26 ` Paolo Bonzini
2015-08-12 14:09 ` Paolo Bonzini
2015-08-12 14:11 ` Frederic Konrad
2015-08-12 14:14 ` Paolo Bonzini
2015-08-10 15:27 ` [Qemu-devel] [RFC PATCH V7 17/19] translate-all: (wip) use tb_flush_safe when we can't alloc more tb fred.konrad
2015-08-10 15:27 ` [Qemu-devel] [RFC PATCH V7 18/19] mttcg: signal the associated cpu anyway fred.konrad
2015-08-10 15:51 ` Paolo Bonzini
2015-08-10 15:27 ` [Qemu-devel] [RFC PATCH V7 19/19] target-arm/psci.c: wake up sleeping CPUs (MTTCG) fred.konrad
2015-08-10 16:41 ` Paolo Bonzini
2015-08-10 18:38 ` Alex Bennée
2015-08-10 18:34 ` [Qemu-devel] [RFC PATCH V7 00/19] Multithread TCG Alex Bennée
2015-08-10 23:02 ` Frederic Konrad
2015-08-11 6:15 ` Benjamin Herrenschmidt
2015-08-11 6:27 ` Frederic Konrad
2015-10-07 12:46 ` Claudio Fontana
2015-10-07 14:52 ` Frederic Konrad
2015-10-21 15:09 ` Claudio Fontana
2015-08-11 7:54 ` Alex Bennée
2015-08-11 9:22 ` Benjamin Herrenschmidt
2015-08-11 9:29 ` Peter Maydell
2015-08-11 10:09 ` Benjamin Herrenschmidt
2015-08-11 19:22 ` Alex Bennée
2015-08-11 12:45 ` Paolo Bonzini
2015-08-11 13:59 ` Frederic Konrad
2015-08-11 14:10 ` Paolo Bonzini
2015-08-12 15:19 ` Frederic Konrad
2015-08-12 15:39 ` Paolo Bonzini
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=877fp3gf5i.fsf@linaro.org \
--to=alex.bennee@linaro.org \
--cc=a.rigo@virtualopensystems.com \
--cc=fred.konrad@greensocs.com \
--cc=guillaume.delbergue@greensocs.com \
--cc=mark.burton@greensocs.com \
--cc=mttcg@listserver.greensocs.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
/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.