From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53737) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZCVAU-0000c0-Cc for qemu-devel@nongnu.org; Tue, 07 Jul 2015 11:52:23 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZCVAR-00055L-0S for qemu-devel@nongnu.org; Tue, 07 Jul 2015 11:52:22 -0400 Received: from mail-wg0-f54.google.com ([74.125.82.54]:34762) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZCVAQ-000554-Or for qemu-devel@nongnu.org; Tue, 07 Jul 2015 11:52:18 -0400 Received: by wgfr2 with SMTP id r2so16978008wgf.1 for ; Tue, 07 Jul 2015 08:52:18 -0700 (PDT) References: <1435330053-18733-1-git-send-email-fred.konrad@greensocs.com> <1435330053-18733-16-git-send-email-fred.konrad@greensocs.com> From: Alex =?utf-8?Q?Benn=C3=A9e?= In-reply-to: <1435330053-18733-16-git-send-email-fred.konrad@greensocs.com> Date: Tue, 07 Jul 2015 16:52:15 +0100 Message-ID: <87egkk9d8w.fsf@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Subject: Re: [Qemu-devel] [RFC PATCH V6 15/18] cpu: introduce tlb_flush*_all. List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: fred.konrad@greensocs.com Cc: mttcg@listserver.greensocs.com, peter.maydell@linaro.org, a.spyridakis@virtualopensystems.com, mark.burton@greensocs.com, agraf@suse.de, qemu-devel@nongnu.org, guillaume.delbergue@greensocs.com, pbonzini@redhat.com, alistair.francis@xilinx.com fred.konrad@greensocs.com writes: > From: KONRAD Frederic > > Some architectures allow to flush the tlb of other VCPUs. This is not a problem > when we have only one thread for all VCPUs but it definitely needs to be an > asynchronous work when we are in true multithreaded work. > > TODO: Some test case, I fear some bad results in case a VCPUs execute a barrier > or something like that. > > Signed-off-by: KONRAD Frederic > --- > cputlb.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++++ > include/exec/exec-all.h | 2 ++ > 2 files changed, 78 insertions(+) > > diff --git a/cputlb.c b/cputlb.c > index 79fff1c..e5853fd 100644 > --- a/cputlb.c > +++ b/cputlb.c > @@ -72,6 +72,45 @@ void tlb_flush(CPUState *cpu, int flush_global) > tlb_flush_count++; > } > > +struct TLBFlushParams { > + CPUState *cpu; > + int flush_global; > +}; > + > +static void tlb_flush_async_work(void *opaque) > +{ > + struct TLBFlushParams *params = opaque; > + > + tlb_flush(params->cpu, params->flush_global); > + g_free(params); > +} > + > +void tlb_flush_all(int flush_global) > +{ > + CPUState *cpu; > + struct TLBFlushParams *params; > + > +#if 0 /* MTTCG */ > + CPU_FOREACH(cpu) { > + tlb_flush(cpu, flush_global); > + } > +#else As before we might as well add the build machinery - for one thing I read that as the first leg being MTTCG ;-) > + CPU_FOREACH(cpu) { > + if (qemu_cpu_is_self(cpu)) { > + /* async_run_on_cpu handle this case but this just avoid a malloc > + * here. > + */ > + tlb_flush(cpu, flush_global); > + } else { > + params = g_malloc(sizeof(struct TLBFlushParams)); > + params->cpu = cpu; > + params->flush_global = flush_global; > + async_run_on_cpu(cpu, tlb_flush_async_work, params); > + } > + } > +#endif /* MTTCG */ > +} > + > static inline void tlb_flush_entry(CPUTLBEntry *tlb_entry, target_ulong addr) > { > if (addr == (tlb_entry->addr_read & > @@ -124,6 +163,43 @@ void tlb_flush_page(CPUState *cpu, target_ulong addr) > tb_flush_jmp_cache(cpu, addr); > } > > +struct TLBFlushPageParams { > + CPUState *cpu; > + target_ulong addr; > +}; > + > +static void tlb_flush_page_async_work(void *opaque) > +{ > + struct TLBFlushPageParams *params = opaque; > + > + tlb_flush_page(params->cpu, params->addr); > + g_free(params); > +} > + > +void tlb_flush_page_all(target_ulong addr) > +{ > + CPUState *cpu; > + struct TLBFlushPageParams *params; > + > + CPU_FOREACH(cpu) { > +#if 0 /* !MTTCG */ > + tlb_flush_page(cpu, addr); > +#else > + if (qemu_cpu_is_self(cpu)) { > + /* async_run_on_cpu handle this case but this just avoid a malloc > + * here. > + */ > + tlb_flush_page(cpu, addr); > + } else { > + params = g_malloc(sizeof(struct TLBFlushPageParams)); > + params->cpu = cpu; > + params->addr = addr; > + async_run_on_cpu(cpu, tlb_flush_page_async_work, params); > + } > +#endif /* MTTCG */ > + } > +} > + > /* update the TLBs so that writes to code in the virtual page 'addr' > can be detected */ > void tlb_protect_code(ram_addr_t ram_addr) > diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h > index 44f3336..484c351 100644 > --- a/include/exec/exec-all.h > +++ b/include/exec/exec-all.h > @@ -96,7 +96,9 @@ bool qemu_in_vcpu_thread(void); > void cpu_reload_memory_map(CPUState *cpu); > void tcg_cpu_address_space_init(CPUState *cpu, AddressSpace *as); > /* cputlb.c */ > +void tlb_flush_page_all(target_ulong addr); > void tlb_flush_page(CPUState *cpu, target_ulong addr); > +void tlb_flush_all(int flush_global); > void tlb_flush(CPUState *cpu, int flush_global); > void tlb_set_page(CPUState *cpu, target_ulong vaddr, > hwaddr paddr, int prot, -- Alex Bennée