Received: by 2002:a05:7412:a9a2:b0:e2:908c:2ebd with SMTP id o34csp2743513rdh; Mon, 30 Oct 2023 06:35:42 -0700 (PDT) X-Google-Smtp-Source: AGHT+IE1YoX6km9EAX7NTTZfJ0tHE4j20DgV9XZDUvNh9cU3E42hncDAHBrEa6XciRtVYdfmKDX4 X-Received: by 2002:a05:6a00:814:b0:6b2:2a2d:7a26 with SMTP id m20-20020a056a00081400b006b22a2d7a26mr9184977pfk.28.1698672942395; Mon, 30 Oct 2023 06:35:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1698672942; cv=none; d=google.com; s=arc-20160816; b=YOniUNS0hSgSolmkYFHhu+oXl8R8Pra3tv37NhojoqDgHT6eAMhxFlhfKuvOR6nYhK +WwsfobfE6OkqQSFtnAlNeVsD2lWeoWYKIHCh4mYrI0ubbjA1pxg/tQELbafsdYdf6dk fDQvOo8QjgJAoYkdFJMZq2omKNTfOmNhB9ZCt3I/xdQVeQ30l4RGwrTMLLp7ARMt2rCz J0erJvsxbEusaR+CplJS4s1Sj/YjmvuCMTXi/r3gZqTqU2U68zFu0jVta11Q+uPeShKC p5wZuyqmpruYLqVdP1/72WaguDCNgJbrTirlHJxTkVUdpCmRiaX026FdyQMx5YoZrb6k mTKQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=Z+Voqb64JUu/S+my4bjKiePrsxn/AGTGcWHZA6URcLY=; fh=JCS5eZhPvDMz6ezwt4mGQzZkAPBTRXJhYRu+JPuV4Z4=; b=KoTOKsJ/oTYSa8iEBH0fLkbVlDTVY0o3lMFXnNEjVeIukL/ySUfS7tWD0U11KuO43r xAriaCDETtdGkMXtlxA/k9nOq1kLY3mtHJmmE+ujUAx0Mn2rSfmTXLIKgDwqlcgfss+m hWzzaLYNhnkOAF+kSFFWgpc3+99MvFg1MwHqLMXAkbDhBoulIGbGzlsFkdcp60ni4SW2 Zvbto+YmP9P+AZt4nl7QQVJUjJRc1OdHsIVbbgE/YVMpuz4CVA0mmIrIdhdzR0Z+1Ozu Dc0KUmpy3tEgRwgB/x3Jb9AgrubdKYwQeP2+ywjIO0BwbCX13JvWjtT2qlvDQq++aP4X 7NwQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@rivosinc-com.20230601.gappssmtp.com header.s=20230601 header.b=Qm7vCUUc; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:8 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from fry.vger.email (fry.vger.email. [2620:137:e000::3:8]) by mx.google.com with ESMTPS id z16-20020a634c10000000b00588fa0def2asi4823115pga.778.2023.10.30.06.35.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 30 Oct 2023 06:35:42 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:8 as permitted sender) client-ip=2620:137:e000::3:8; Authentication-Results: mx.google.com; dkim=pass header.i=@rivosinc-com.20230601.gappssmtp.com header.s=20230601 header.b=Qm7vCUUc; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:8 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by fry.vger.email (Postfix) with ESMTP id 253BA805E026; Mon, 30 Oct 2023 06:35:26 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at fry.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233499AbjJ3NfN (ORCPT + 99 others); Mon, 30 Oct 2023 09:35:13 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49776 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233436AbjJ3NfM (ORCPT ); Mon, 30 Oct 2023 09:35:12 -0400 Received: from mail-wr1-x42e.google.com (mail-wr1-x42e.google.com [IPv6:2a00:1450:4864:20::42e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 657D4D3 for ; Mon, 30 Oct 2023 06:35:09 -0700 (PDT) Received: by mail-wr1-x42e.google.com with SMTP id ffacd0b85a97d-32d849cc152so3092663f8f.1 for ; Mon, 30 Oct 2023 06:35:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20230601.gappssmtp.com; s=20230601; t=1698672908; x=1699277708; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Z+Voqb64JUu/S+my4bjKiePrsxn/AGTGcWHZA6URcLY=; b=Qm7vCUUc94Idnrp6qQfnhr/2sFdAuPC9lUVLPRh82z4Wn0NNwPqTLVIwWXvoXHXv7k vvt9LJU8qjpOeoTDpZsWDwNEUC9EVjl0fTDq67qFCkKbjYWN0Hf/rARptmeStCFeMnqo kbc5AafEU7JHXxmQC2UbMdoT4VRn4TI7JpPakT7W8iVs7chpe6Zz+4aJbFZVjm/Ig1FX r4MstO3ox06p+/BfLlQ2iA1azLsjlkZL91+XMJZp2OJHEgw2n8KVSYLJXDtX4oZ7mps6 N8QAURtEhes3xzggWVKcq47aSn7lRbVgsJx4iUc0OES1ePqC5SH7WhwIdgGpewH94/p3 lieg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1698672908; x=1699277708; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Z+Voqb64JUu/S+my4bjKiePrsxn/AGTGcWHZA6URcLY=; b=GeWI5lBpiWd+eILUKqvQm4vkttSG70PBLsn/pb5grGO+BhtRGTYdSqk7mrqKR7rHQR 9sncy5dbXqvKB/ljHnMCf7RD8IUGoV+HUqq8d5bwV9LGHlDT5TVcnRhAvJjUNk89XEg+ uC1itD9v2R7Fd/udRZmm5PzIE0sFvw6p94cYCRgmbC50o5fL/i+FbWWFVBnozsBTvQZO Z4aE1WuY5m/7N/k9SbiuGYm38cehcjPs9QQBfiP88xk8Dk4OkrPLnd83O37PrfsOZFKT /JAfYl/tmM1zbun9GMJAOfbFaHNJM0PoHSY0hA7hMemKi9fefVAaJabO54iEcPOFsAjw GRAg== X-Gm-Message-State: AOJu0YznToUzUAUPEpH2Jr8ybcC2yYrgSjiynsOp6JpC+rEVFsUEMPYi x4XMqIaaQRRSeSfyGrfSXUumrA== X-Received: by 2002:a05:6000:1882:b0:32f:7f03:9a with SMTP id a2-20020a056000188200b0032f7f03009amr4279324wri.55.1698672907709; Mon, 30 Oct 2023 06:35:07 -0700 (PDT) Received: from alex-rivos.ba.rivosinc.com (amontpellier-656-1-456-62.w92-145.abo.wanadoo.fr. [92.145.124.62]) by smtp.gmail.com with ESMTPSA id o12-20020a056000010c00b003232f167df5sm8252241wrx.108.2023.10.30.06.35.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 30 Oct 2023 06:35:07 -0700 (PDT) From: Alexandre Ghiti To: Will Deacon , "Aneesh Kumar K . V" , Andrew Morton , Nick Piggin , Peter Zijlstra , Mayuresh Chitale , Vincent Chen , Paul Walmsley , Palmer Dabbelt , Albert Ou , linux-arch@vger.kernel.org, linux-mm@kvack.org, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, Samuel Holland , Lad Prabhakar Cc: Alexandre Ghiti , Andrew Jones , Lad Prabhakar , Samuel Holland Subject: [PATCH v6 4/4] riscv: Improve flush_tlb_kernel_range() Date: Mon, 30 Oct 2023 14:30:28 +0100 Message-Id: <20231030133027.19542-5-alexghiti@rivosinc.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20231030133027.19542-1-alexghiti@rivosinc.com> References: <20231030133027.19542-1-alexghiti@rivosinc.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on fry.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (fry.vger.email [0.0.0.0]); Mon, 30 Oct 2023 06:35:26 -0700 (PDT) This function used to simply flush the whole tlb of all harts, be more subtile and try to only flush the range. The problem is that we can only use PAGE_SIZE as stride since we don't know the size of the underlying mapping and then this function will be improved only if the size of the region to flush is < threshold * PAGE_SIZE. Signed-off-by: Alexandre Ghiti Reviewed-by: Andrew Jones Tested-by: Lad Prabhakar # On RZ/Five SMARC Reviewed-by: Samuel Holland Tested-by: Samuel Holland --- arch/riscv/include/asm/tlbflush.h | 11 +++++----- arch/riscv/mm/tlbflush.c | 34 ++++++++++++++++++++++--------- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/arch/riscv/include/asm/tlbflush.h b/arch/riscv/include/asm/tlbflush.h index 170a49c531c6..8f3418c5f172 100644 --- a/arch/riscv/include/asm/tlbflush.h +++ b/arch/riscv/include/asm/tlbflush.h @@ -40,6 +40,7 @@ void flush_tlb_mm_range(struct mm_struct *mm, unsigned long start, void flush_tlb_page(struct vm_area_struct *vma, unsigned long addr); void flush_tlb_range(struct vm_area_struct *vma, unsigned long start, unsigned long end); +void flush_tlb_kernel_range(unsigned long start, unsigned long end); #ifdef CONFIG_TRANSPARENT_HUGEPAGE #define __HAVE_ARCH_FLUSH_PMD_TLB_RANGE void flush_pmd_tlb_range(struct vm_area_struct *vma, unsigned long start, @@ -56,15 +57,15 @@ static inline void flush_tlb_range(struct vm_area_struct *vma, local_flush_tlb_all(); } -#define flush_tlb_mm(mm) flush_tlb_all() -#define flush_tlb_mm_range(mm, start, end, page_size) flush_tlb_all() -#endif /* !CONFIG_SMP || !CONFIG_MMU */ - /* Flush a range of kernel pages */ static inline void flush_tlb_kernel_range(unsigned long start, unsigned long end) { - flush_tlb_all(); + local_flush_tlb_all(); } +#define flush_tlb_mm(mm) flush_tlb_all() +#define flush_tlb_mm_range(mm, start, end, page_size) flush_tlb_all() +#endif /* !CONFIG_SMP || !CONFIG_MMU */ + #endif /* _ASM_RISCV_TLBFLUSH_H */ diff --git a/arch/riscv/mm/tlbflush.c b/arch/riscv/mm/tlbflush.c index e46fefc70927..e6659d7368b3 100644 --- a/arch/riscv/mm/tlbflush.c +++ b/arch/riscv/mm/tlbflush.c @@ -97,20 +97,27 @@ static void __flush_tlb_range(struct mm_struct *mm, unsigned long start, unsigned long size, unsigned long stride) { struct flush_tlb_range_data ftd; - struct cpumask *cmask = mm_cpumask(mm); + const struct cpumask *cmask; unsigned long asid = FLUSH_TLB_NO_ASID; - unsigned int cpuid; bool broadcast; - if (cpumask_empty(cmask)) - return; + if (mm) { + unsigned int cpuid; + + cmask = mm_cpumask(mm); + if (cpumask_empty(cmask)) + return; - cpuid = get_cpu(); - /* check if the tlbflush needs to be sent to other CPUs */ - broadcast = cpumask_any_but(cmask, cpuid) < nr_cpu_ids; + cpuid = get_cpu(); + /* check if the tlbflush needs to be sent to other CPUs */ + broadcast = cpumask_any_but(cmask, cpuid) < nr_cpu_ids; - if (static_branch_unlikely(&use_asid_allocator)) - asid = atomic_long_read(&mm->context.id) & asid_mask; + if (static_branch_unlikely(&use_asid_allocator)) + asid = atomic_long_read(&mm->context.id) & asid_mask; + } else { + cmask = cpu_online_mask; + broadcast = true; + } if (broadcast) { if (riscv_use_ipi_for_rfence()) { @@ -128,7 +135,8 @@ static void __flush_tlb_range(struct mm_struct *mm, unsigned long start, local_flush_tlb_range_asid(start, size, stride, asid); } - put_cpu(); + if (mm) + put_cpu(); } void flush_tlb_mm(struct mm_struct *mm) @@ -179,6 +187,12 @@ void flush_tlb_range(struct vm_area_struct *vma, unsigned long start, __flush_tlb_range(vma->vm_mm, start, end - start, stride_size); } + +void flush_tlb_kernel_range(unsigned long start, unsigned long end) +{ + __flush_tlb_range(NULL, start, end - start, PAGE_SIZE); +} + #ifdef CONFIG_TRANSPARENT_HUGEPAGE void flush_pmd_tlb_range(struct vm_area_struct *vma, unsigned long start, unsigned long end) -- 2.39.2