Received: by 2002:ab2:7a55:0:b0:1f4:4a7d:290d with SMTP id u21csp38625lqp; Thu, 4 Apr 2024 06:39:05 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCVNuFQyVS8vjMOeqbmU7b2GRXymCa1UtZQNsDU+pEfBiPRXkyWppAlVive4oA18xSkXPzcnQt0FOtU/SIeCd2n6H5z28FRBA8ZEr77kRw== X-Google-Smtp-Source: AGHT+IEYqpEW/5A49hCi4NEiG5QFbOrHHsOU4TtOyi4Nu92I1eIaWYP2xEoRfMB15TQfWBJzbjos X-Received: by 2002:a50:d7d3:0:b0:56b:829a:38e3 with SMTP id m19-20020a50d7d3000000b0056b829a38e3mr2205466edj.16.1712237944929; Thu, 04 Apr 2024 06:39:04 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1712237944; cv=pass; d=google.com; s=arc-20160816; b=0cfLJ35/ZATuTiEWi9rP23axLqx0LlHVezU6rGwNupkvjG2WCx3EB/TYniy6claM3B V82dcBqt01j6Uxuq5epCHQw8ZQ5L+Xu3BQHmb2J7iujCBPsxjooBQqlDELaiTwUZD5/y o3rQWpBx6EhRvIsWHngPFWA6x3+4UzCE/CG5tKx/c4958eFvH1EgqM6TqMn62y0PjSBB ns1zDg/TCNgSJr+LW0bn1Uzb0rX3yhi1f/nmT7cFdT/oefjVUpGAqxOyB+Lr3vhmnpgp 3QstY47sFisdEa8F8b3gYTxLu3fWTKDgQyhUQ7X3kMa5FPb8F35DEgXjqIO3xsuwLrzi 4CRg== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from; bh=3f99SFlkVL5OOnE6U6HiiQqsAZsGzkWrHeOu0tQxUQ0=; fh=IOf3EjU/XMNy90FbzC2hUVpKBoD5Qv4vO33t+e6NQME=; b=wfpOPE0go6nsOHZ40kPUp/frwod4dWbgrZs6sYGsj56j/g/8B2eagn/ErTWCxAbSmL 3hEi9BWOvr65/phdf/4+WShbas1tS2EF0Ll12xC3abntSbwxNfJbpu7Hqfru7ry5B4f/ IBYjezDscm3SHCKcUnk1MfBrW3IRooIIixFoiTlztEyRKAwcfRTBt6XaRsN3310qf1uZ dkyK19T2dvVj+OAKUCaaXzjKypfABREl/lWbvIRTiJWksVQDCcxmpz5BcZKXwtKmASam xGKIp/A4MaT8mnzOwJLIidL8gAJn+52ZAqpKbcGkxRvfIu5vAN2wpA6N4uAQKdJklMxu PuCQ==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; arc=pass (i=1); spf=pass (google.com: domain of linux-kernel+bounces-131513-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) smtp.mailfrom="linux-kernel+bounces-131513-linux.lists.archive=gmail.com@vger.kernel.org" Return-Path: Received: from am.mirrors.kernel.org (am.mirrors.kernel.org. [2604:1380:4601:e00::3]) by mx.google.com with ESMTPS id y7-20020a056402358700b0056c53edb7b7si1335408edc.390.2024.04.04.06.39.04 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 04 Apr 2024 06:39:04 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-131513-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) client-ip=2604:1380:4601:e00::3; Authentication-Results: mx.google.com; arc=pass (i=1); spf=pass (google.com: domain of linux-kernel+bounces-131513-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) smtp.mailfrom="linux-kernel+bounces-131513-linux.lists.archive=gmail.com@vger.kernel.org" Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by am.mirrors.kernel.org (Postfix) with ESMTPS id 296A01F28FB5 for ; Thu, 4 Apr 2024 13:37:29 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 8E24012839F; Thu, 4 Apr 2024 13:37:16 +0000 (UTC) Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 00BE912838A; Thu, 4 Apr 2024 13:37:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712237836; cv=none; b=nIlFPX6+zDmL0vQ3yIkfRvoU0mV6ilC5Ka1Ph1PIqcMJw1GHcZ2b7uIv1H6UK63ZShWGSI3TTZc6pYuptQYBrvD4m83j8IJOcRvkHr/6bzHviqVawHdmD0ELDUyCpPy0jP6IUtfadNH49tiMklLtnLNopSGL0VLFeG1jh0Od5IE= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712237836; c=relaxed/simple; bh=ddqupzXUZSofI+WMDJou/va1wQCQQkBHUreBxZzCrko=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=m310uWQaTpqffO5D981dgI2oMILqTDwgSxn3sJfovLpLiJKwIu/KyjyWE8wsKFW1pms5E7D5hCwbtC/yIkEV9cVvut2nWfVc17t0ljEvL0/0U3rhBpiL1YaEJLleO0HaLgRxHb47Q8Z3WXv53gkMUgQQ8hhgiCoVnjgXC/Z6yOM= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3756EC433C7; Thu, 4 Apr 2024 13:37:13 +0000 (UTC) From: Huacai Chen To: Andrew Morton , Huacai Chen Cc: loongarch@lists.linux.dev, linux-mm@kvack.org, Xuefeng Li , Guo Ren , Xuerui Wang , Jiaxun Yang , linux-kernel@vger.kernel.org, loongson-kernel@lists.loongnix.cn, Huacai Chen Subject: [PATCH 2/3] LoongArch: Make {virt, phys, page, pfn} translation work with KFENCE Date: Thu, 4 Apr 2024 21:36:35 +0800 Message-ID: <20240404133642.971583-3-chenhuacai@loongson.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240404133642.971583-1-chenhuacai@loongson.cn> References: <20240404133642.971583-1-chenhuacai@loongson.cn> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit KFENCE changes virt_to_page() to be able to translate tlb mapped virtual addresses, but forget to change virt_to_phys()/phys_to_virt() and other translation functions as well. This patch fix it, otherwise some drivers (such as nvme and virtio-blk) cannot work with KFENCE. All {virt, phys, page, pfn} translation functions are updated: 1, virt_to_pfn()/pfn_to_virt(); 2, virt_to_page()/page_to_virt(); 3, virt_to_phys()/phys_to_virt(). DMW/TLB mapped addresses are distinguished by comparing the vaddress with vm_map_base in virt_to_xyz(), and we define WANT_PAGE_VIRTUAL in the KFENCE case for the reverse translations, xyz_to_virt(). Signed-off-by: Huacai Chen --- arch/loongarch/include/asm/io.h | 20 +++++++++++++++----- arch/loongarch/include/asm/kfence.h | 9 +++++++++ arch/loongarch/include/asm/page.h | 26 +++++++++++++++++++++++++- arch/loongarch/mm/pgtable.c | 4 ++-- 4 files changed, 51 insertions(+), 8 deletions(-) diff --git a/arch/loongarch/include/asm/io.h b/arch/loongarch/include/asm/io.h index 4a8adcca329b..c2f9979b2979 100644 --- a/arch/loongarch/include/asm/io.h +++ b/arch/loongarch/include/asm/io.h @@ -14,11 +14,6 @@ #include #include -/* - * Change "struct page" to physical address. - */ -#define page_to_phys(page) ((phys_addr_t)page_to_pfn(page) << PAGE_SHIFT) - extern void __init __iomem *early_ioremap(u64 phys_addr, unsigned long size); extern void __init early_iounmap(void __iomem *addr, unsigned long size); @@ -73,6 +68,21 @@ extern void __memcpy_fromio(void *to, const volatile void __iomem *from, size_t #define __io_aw() mmiowb() +#ifdef CONFIG_KFENCE +#define virt_to_phys(kaddr) \ +({ \ + (likely((unsigned long)kaddr < vm_map_base)) ? __pa((unsigned long)kaddr) : \ + page_to_phys(tlb_virt_to_page((unsigned long)kaddr)) + offset_in_page((unsigned long)kaddr);\ +}) + +#define phys_to_virt(paddr) \ +({ \ + extern char *__kfence_pool; \ + (unlikely(__kfence_pool == NULL)) ? __va((unsigned long)paddr) : \ + page_address(phys_to_page((unsigned long)paddr)) + offset_in_page((unsigned long)paddr);\ +}) +#endif + #include #define ARCH_HAS_VALID_PHYS_ADDR_RANGE diff --git a/arch/loongarch/include/asm/kfence.h b/arch/loongarch/include/asm/kfence.h index 6c82aea1c993..a6a5760da3a3 100644 --- a/arch/loongarch/include/asm/kfence.h +++ b/arch/loongarch/include/asm/kfence.h @@ -16,6 +16,7 @@ static inline bool arch_kfence_init_pool(void) { int err; + char *kaddr, *vaddr; char *kfence_pool = __kfence_pool; struct vm_struct *area; @@ -35,6 +36,14 @@ static inline bool arch_kfence_init_pool(void) return false; } + kaddr = kfence_pool; + vaddr = __kfence_pool; + while (kaddr < kfence_pool + KFENCE_POOL_SIZE) { + set_page_address(virt_to_page(kaddr), vaddr); + kaddr += PAGE_SIZE; + vaddr += PAGE_SIZE; + } + return true; } diff --git a/arch/loongarch/include/asm/page.h b/arch/loongarch/include/asm/page.h index 44027060c54a..e85df33f11c7 100644 --- a/arch/loongarch/include/asm/page.h +++ b/arch/loongarch/include/asm/page.h @@ -78,7 +78,26 @@ typedef struct { unsigned long pgprot; } pgprot_t; struct page *dmw_virt_to_page(unsigned long kaddr); struct page *tlb_virt_to_page(unsigned long kaddr); -#define virt_to_pfn(kaddr) PFN_DOWN(PHYSADDR(kaddr)) +#define pfn_to_phys(pfn) __pfn_to_phys(pfn) +#define phys_to_pfn(paddr) __phys_to_pfn(paddr) + +#define page_to_phys(page) pfn_to_phys(page_to_pfn(page)) +#define phys_to_page(paddr) pfn_to_page(phys_to_pfn(paddr)) + +#ifndef CONFIG_KFENCE + +#define page_to_virt(page) __va(page_to_phys(page)) +#define virt_to_page(kaddr) phys_to_page(__pa(kaddr)) + +#else + +#define WANT_PAGE_VIRTUAL + +#define page_to_virt(page) \ +({ \ + extern char *__kfence_pool; \ + (__kfence_pool == NULL) ? __va(page_to_phys(page)) : page_address(page); \ +}) #define virt_to_page(kaddr) \ ({ \ @@ -86,6 +105,11 @@ struct page *tlb_virt_to_page(unsigned long kaddr); dmw_virt_to_page((unsigned long)kaddr) : tlb_virt_to_page((unsigned long)kaddr);\ }) +#endif + +#define pfn_to_virt(pfn) page_to_virt(pfn_to_page(pfn)) +#define virt_to_pfn(kaddr) page_to_pfn(virt_to_page(kaddr)) + extern int __virt_addr_valid(volatile void *kaddr); #define virt_addr_valid(kaddr) __virt_addr_valid((volatile void *)(kaddr)) diff --git a/arch/loongarch/mm/pgtable.c b/arch/loongarch/mm/pgtable.c index 2aae72e63871..bda018150000 100644 --- a/arch/loongarch/mm/pgtable.c +++ b/arch/loongarch/mm/pgtable.c @@ -11,13 +11,13 @@ struct page *dmw_virt_to_page(unsigned long kaddr) { - return pfn_to_page(virt_to_pfn(kaddr)); + return phys_to_page(__pa(kaddr)); } EXPORT_SYMBOL(dmw_virt_to_page); struct page *tlb_virt_to_page(unsigned long kaddr) { - return pfn_to_page(pte_pfn(*virt_to_kpte(kaddr))); + return phys_to_page(pfn_to_phys(pte_pfn(*virt_to_kpte(kaddr)))); } EXPORT_SYMBOL(tlb_virt_to_page); -- 2.43.0