Received: by 2002:a25:d7c1:0:0:0:0:0 with SMTP id o184csp3454432ybg; Mon, 28 Oct 2019 13:06:46 -0700 (PDT) X-Google-Smtp-Source: APXvYqyA/aQYCph0jXzKyG7wfecWAX2XI6NnrwPp6JC/KKhDS64I0Ls649eiBERwpJ+YWKeKY0zn X-Received: by 2002:a17:906:48c5:: with SMTP id d5mr11981768ejt.167.1572293205940; Mon, 28 Oct 2019 13:06:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1572293205; cv=none; d=google.com; s=arc-20160816; b=ZMWNft583hqgQ72Ryuk5oJFx8LEKT5WbmptQ8jhSgDf3ka0mQNjZ3XmMQ/2j1kw5mZ i1HwzIXLOKfa0IBM4kbrIAAnsEiDH5qnBtIWzgrvh/fk0mib7Z8/MBykCtzX7agvaHwi fdHQp+2mqnmeA+tVRpAg1BcV0E9juMOFadG8cMpHZoGS4pUbZkLDYIJBdPdDoFieYxaG FlOC40eAi5PZuipDo/O1Gk7irUqrqBVQSNghUAxiXFZl7dnm7k9pGS/uezm7q/j/bpps oOXEPXru+c8gGqqMLno+G9ZcnRxUuTrEDkrkfiT3kNwHrnyGyLfn5ckH3/q8GP0a6/fO 0/8w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=FfHTH2MzgCNMlB911N0xzbdycSELsFzQxnUpR37uB5E=; b=zXan2E9DS5v9A9P52HTOMQW3DPtYi/bOnhw5etmFK/U3XBWd7dYyNQXZubP+5WAYby d4qd45rOpSAd+jjbfJ4zQbuWxu/MdY/VOfgetORK15NSc/y8hGSk4FT/NVajXkvDFq7R GIHNVQG9fQI9SlRqJRB4qioib6DIBmKm/Lc6W3fMEn0/Y8A3w4GKjcZmrlr9xG/Hdu1f SsX3QdsB1b/RZ8cDlBqh6uKd8/jKLfVako/mtrTv8Db/l5AJFYVP4e+orJh8J77YbBlK 4TRPbzBHKOyCsFVRyfYHDM9pmLpiWES+hw6G0xc3tpLxsG7FWfue/t684IAZ48baX3p1 AL9Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@infradead.org header.s=bombadil.20170209 header.b="BqHa/HYY"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h52si8400056edb.77.2019.10.28.13.06.21; Mon, 28 Oct 2019 13:06:45 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=fail header.i=@infradead.org header.s=bombadil.20170209 header.b="BqHa/HYY"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388865AbfJ1MLD (ORCPT + 99 others); Mon, 28 Oct 2019 08:11:03 -0400 Received: from bombadil.infradead.org ([198.137.202.133]:51518 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2388833AbfJ1MLC (ORCPT ); Mon, 28 Oct 2019 08:11:02 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From :Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=FfHTH2MzgCNMlB911N0xzbdycSELsFzQxnUpR37uB5E=; b=BqHa/HYYU8hKVBJPG41y6F4nqW YinPjxgFg1YcCPurdSskPQgeokypK0qqENAVm6Uu0HLmyCe/zRi15vhNzeACnmnhShbsIwUQ52cgP Ev27azsmorlxDX4rWgfrL2Kq6jq3IcNMSMStprKyxBYFqGBJ9v9Jl2nrWNLwTPb+Or07MjSipVTVZ QrBYlDZ90YQR9fZKUKv6f3ulmAbIUsEAvNFgrUwDVAvKeLjvOhE1HaQAexoTQVu6fk+Xekc0k6gFh lBD7OyDLUEQoP65A1jOHLZCDxUth6+P4BeCW80eKB+O3nag6Spz8MrHhGNP6domEgmNeg1d8XBEUz TDiBfaog==; Received: from [2001:4bb8:18c:c7d:c70:4a89:bc61:2] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1iP3rP-0006kB-Ka; Mon, 28 Oct 2019 12:11:00 +0000 From: Christoph Hellwig To: Palmer Dabbelt , Paul Walmsley Cc: Damien Le Moal , linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, Anup Patel Subject: [PATCH 05/12] riscv: implement remote sfence.i using IPIs Date: Mon, 28 Oct 2019 13:10:36 +0100 Message-Id: <20191028121043.22934-6-hch@lst.de> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191028121043.22934-1-hch@lst.de> References: <20191028121043.22934-1-hch@lst.de> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The RISC-V ISA only supports flushing the instruction cache for the local CPU core. Currently we always offload the remote TLB flushing to the SBI, which then issues an IPI under the hoods. But with M-mode we do not have an SBI so we have to do it ourselves. IPI to the other nodes using the existing kernel helpers instead if we have native clint support and thus can IPI directly from the kernel. Signed-off-by: Christoph Hellwig Reviewed-by: Anup Patel --- arch/riscv/include/asm/sbi.h | 3 +++ arch/riscv/mm/cacheflush.c | 24 ++++++++++++++++++------ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/arch/riscv/include/asm/sbi.h b/arch/riscv/include/asm/sbi.h index b167af3e7470..0cb74eccc73f 100644 --- a/arch/riscv/include/asm/sbi.h +++ b/arch/riscv/include/asm/sbi.h @@ -94,5 +94,8 @@ static inline void sbi_remote_sfence_vma_asid(const unsigned long *hart_mask, { SBI_CALL_4(SBI_REMOTE_SFENCE_VMA_ASID, hart_mask, start, size, asid); } +#else /* CONFIG_RISCV_SBI */ +/* stub to for code is only reachable under IS_ENABLED(CONFIG_RISCV_SBI): */ +void sbi_remote_fence_i(const unsigned long *hart_mask); #endif /* CONFIG_RISCV_SBI */ #endif /* _ASM_RISCV_SBI_H */ diff --git a/arch/riscv/mm/cacheflush.c b/arch/riscv/mm/cacheflush.c index 3f15938dec89..794c9ab256eb 100644 --- a/arch/riscv/mm/cacheflush.c +++ b/arch/riscv/mm/cacheflush.c @@ -10,9 +10,17 @@ #include +static void ipi_remote_fence_i(void *info) +{ + return local_flush_icache_all(); +} + void flush_icache_all(void) { - sbi_remote_fence_i(NULL); + if (IS_ENABLED(CONFIG_RISCV_SBI)) + sbi_remote_fence_i(NULL); + else + on_each_cpu(ipi_remote_fence_i, NULL, 1); } /* @@ -28,7 +36,7 @@ void flush_icache_all(void) void flush_icache_mm(struct mm_struct *mm, bool local) { unsigned int cpu; - cpumask_t others, hmask, *mask; + cpumask_t others, *mask; preempt_disable(); @@ -46,10 +54,7 @@ void flush_icache_mm(struct mm_struct *mm, bool local) */ cpumask_andnot(&others, mm_cpumask(mm), cpumask_of(cpu)); local |= cpumask_empty(&others); - if (mm != current->active_mm || !local) { - riscv_cpuid_to_hartid_mask(&others, &hmask); - sbi_remote_fence_i(hmask.bits); - } else { + if (mm == current->active_mm && local) { /* * It's assumed that at least one strongly ordered operation is * performed on this hart between setting a hart's cpumask bit @@ -59,6 +64,13 @@ void flush_icache_mm(struct mm_struct *mm, bool local) * with flush_icache_deferred(). */ smp_mb(); + } else if (IS_ENABLED(CONFIG_RISCV_SBI)) { + cpumask_t hartid_mask; + + riscv_cpuid_to_hartid_mask(&others, &hartid_mask); + sbi_remote_fence_i(cpumask_bits(&hartid_mask)); + } else { + on_each_cpu_mask(&others, ipi_remote_fence_i, NULL, 1); } preempt_enable(); -- 2.20.1