From patchwork Mon Aug 10 15:27:12 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: fred.konrad@greensocs.com X-Patchwork-Id: 505686 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 8165014018C for ; Tue, 11 Aug 2015 01:35:15 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=greensocs.com header.i=@greensocs.com header.b=62iEUg4z; dkim=fail reason="signature verification failed" (1024-bit key) header.d=greensocs.com header.i=@greensocs.com header.b=sax7HCDY; dkim-atps=neutral Received: from localhost ([::1]:58904 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZOp6X-00029t-LD for incoming@patchwork.ozlabs.org; Mon, 10 Aug 2015 11:35:13 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39869) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZOozl-00070h-Rv for qemu-devel@nongnu.org; Mon, 10 Aug 2015 11:28:14 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZOozk-00006Q-Hl for qemu-devel@nongnu.org; Mon, 10 Aug 2015 11:28:13 -0400 Received: from greensocs.com ([193.104.36.180]:59326) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZOozk-00005E-8w for qemu-devel@nongnu.org; Mon, 10 Aug 2015 11:28:12 -0400 Received: from localhost (localhost [127.0.0.1]) by greensocs.com (Postfix) with ESMTP id 4DB9C18CE2D; Mon, 10 Aug 2015 17:28:11 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=greensocs.com; s=mail; t=1439220491; bh=WP3xFADBGSkadX98ibTDyD/QNaNzXtRgKs7N7qIX0Fs=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=62iEUg4zC0NVc5qMqKqiXpeGy2f37X+bSc+yDHbTgPZRG64ycUmGRVSruyGk0YdVb p1Wrh7ITh7rLVn1ex8L3+TLgXD6axbX559X6x0F/Qkc/ck+jOb8ojNBSDoalpNOWg3 kX+vn0olbZyVkNaArY5kYOepJa0OJVzqn/4k8IzM= X-Virus-Scanned: amavisd-new at greensocs.com Authentication-Results: gs-01.greensocs.com (amavisd-new); dkim=pass (1024-bit key) header.d=greensocs.com Received: from greensocs.com ([127.0.0.1]) by localhost (gs-01.greensocs.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 5fMKOfYW5vKW; Mon, 10 Aug 2015 17:28:06 +0200 (CEST) Received: from localhost.localdomain (AToulouse-555-1-147-173.w109-223.abo.wanadoo.fr [109.223.34.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: fred.konrad@greensocs.com) by greensocs.com (Postfix) with ESMTPSA id CDBD618B134; Mon, 10 Aug 2015 17:27:33 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=greensocs.com; s=mail; t=1439220454; bh=WP3xFADBGSkadX98ibTDyD/QNaNzXtRgKs7N7qIX0Fs=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=sax7HCDYEtjDvCwLyF/lLd2JEM0b6NWSY0eFhOKuyTsPwh1VK1r2Ig3z3BL4kq/Gp O+Vp5Gysc3Pyep1SkUDPJ1KMJwyibdDOtJD7jZKh387xbWT9Jt5WnsTqFNQ29AhICd H8F2Zy90lncU+tU5tqqmnWmVxnpJGKoPxoae1qvE= From: fred.konrad@greensocs.com To: qemu-devel@nongnu.org, mttcg@listserver.greensocs.com Date: Mon, 10 Aug 2015 17:27:12 +0200 Message-Id: <1439220437-23957-15-git-send-email-fred.konrad@greensocs.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1439220437-23957-1-git-send-email-fred.konrad@greensocs.com> References: <1439220437-23957-1-git-send-email-fred.konrad@greensocs.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 193.104.36.180 Cc: mark.burton@greensocs.com, a.rigo@virtualopensystems.com, guillaume.delbergue@greensocs.com, pbonzini@redhat.com, alex.bennee@linaro.org, fred.konrad@greensocs.com Subject: [Qemu-devel] [RFC PATCH V7 14/19] cpu: introduce tlb_flush*_all. X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org 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 + 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 9f1c1cb..e9512df 100644 --- a/include/exec/exec-all.h +++ b/include/exec/exec-all.h @@ -97,7 +97,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,