From patchwork Tue Jul 25 06:14:48 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Enze Li X-Patchwork-Id: 13325911 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id E9219EB64DD for ; Tue, 25 Jul 2023 06:15:31 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id EB29B8E0003; Tue, 25 Jul 2023 02:15:29 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id E63F8900003; Tue, 25 Jul 2023 02:15:29 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id CDE8D8E0005; Tue, 25 Jul 2023 02:15:29 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id BA72D8E0003 for ; Tue, 25 Jul 2023 02:15:29 -0400 (EDT) Received: from smtpin30.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id 80B1040CEA for ; Tue, 25 Jul 2023 06:15:29 +0000 (UTC) X-FDA: 81049122378.30.9FB14B0 Received: from mailgw.kylinos.cn (mailgw.kylinos.cn [124.126.103.232]) by imf07.hostedemail.com (Postfix) with ESMTP id 4613340003 for ; Tue, 25 Jul 2023 06:15:22 +0000 (UTC) Authentication-Results: imf07.hostedemail.com; dkim=none; spf=pass (imf07.hostedemail.com: domain of lienze@kylinos.cn designates 124.126.103.232 as permitted sender) smtp.mailfrom=lienze@kylinos.cn; dmarc=none ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1690265727; a=rsa-sha256; cv=none; b=bBji6qJAjZAPsYwoD9giO3cvKi/DZ1gcNF0hH/wPvSVr1gZAVwlRZlwe3cpmsdhb6yNqGN H0u+M8vXVEL0P/fl8vzMvYT/RGzeftCnZKOarkBZk7iZ8KSnHcWzbr/zmPzEYUGaGdfC3b yfdYPWYWcWY5IZLty57plldK2yqyn9w= ARC-Authentication-Results: i=1; imf07.hostedemail.com; dkim=none; spf=pass (imf07.hostedemail.com: domain of lienze@kylinos.cn designates 124.126.103.232 as permitted sender) smtp.mailfrom=lienze@kylinos.cn; dmarc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1690265727; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=IhGnxe2P5+ULV3kw8CSrg/6QSRV8cYfR7e12dyv3j8E=; b=6oq+5OuV33/gOnOUvmOWPA5m9cyUeXoRfuwZ8BueBDOBQNfnKiwC+0NgX/P9yEbqYi15d8 pdhmlxCn+7xpZqmbFIj+SzwrBLOCKHTVhwKeygoLjCQCHeDdA4tXU9JoMFJbWkoTPVB9Gr LmLdTaoPhTkpscfRJhy/U4VTS21bAJA= X-UUID: 06f546de48c44ad099634202a5a5558d-20230725 X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.1.28,REQID:5ca60565-7f43-4364-9457-75cadd98427e,IP:15, URL:0,TC:0,Content:0,EDM:0,RT:0,SF:-15,FILE:0,BULK:0,RULE:Release_Ham,ACTI ON:release,TS:0 X-CID-INFO: VERSION:1.1.28,REQID:5ca60565-7f43-4364-9457-75cadd98427e,IP:15,UR L:0,TC:0,Content:0,EDM:0,RT:0,SF:-15,FILE:0,BULK:0,RULE:Release_Ham,ACTION :release,TS:0 X-CID-META: VersionHash:176cd25,CLOUDID:cebc4ad2-cd77-4e67-bbfd-aa4eaace762f,B ulkID:230725141514N0X3POC0,BulkQuantity:0,Recheck:0,SF:44|38|24|17|19|102, TC:nil,Content:0,EDM:-3,IP:-2,URL:1,File:nil,Bulk:nil,QS:nil,BEC:nil,COL:0 ,OSI:0,OSA:0,AV:0,LES:1,SPR:NO,DKR:0,DKP:0 X-CID-BVR: 0 X-CID-BAS: 0,_,0,_ X-CID-FACTOR: TF_CID_SPAM_SNR,TF_CID_SPAM_FAS,TF_CID_SPAM_FSD,TF_CID_SPAM_FSI, TF_CID_SPAM_ULS X-UUID: 06f546de48c44ad099634202a5a5558d-20230725 X-User: lienze@kylinos.cn Received: from ubuntu.. [(39.156.73.12)] by mailgw (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 256/256) with ESMTP id 1695958714; Tue, 25 Jul 2023 14:15:11 +0800 From: Enze Li To: chenhuacai@kernel.org, kernel@xen0n.name, loongarch@lists.linux.dev, glider@google.com, elver@google.com, akpm@linux-foundation.org, kasan-dev@googlegroups.com, linux-mm@kvack.org Cc: zhangqing@loongson.cn, yangtiezhu@loongson.cn, dvyukov@google.com, Enze Li Subject: [PATCH 1/4 v2] LoongArch: mm: Add page table mapped mode support Date: Tue, 25 Jul 2023 14:14:48 +0800 Message-Id: <20230725061451.1231480-2-lienze@kylinos.cn> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230725061451.1231480-1-lienze@kylinos.cn> References: <20230725061451.1231480-1-lienze@kylinos.cn> MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Server: rspam06 X-Rspamd-Queue-Id: 4613340003 X-Stat-Signature: r81emse4ax65j6jwh4ixfofsfzpkuu34 X-HE-Tag: 1690265722-681277 X-HE-Meta: U2FsdGVkX1+s8179J8OTt5LQAAFY1iKLwVVyQezHyQrQ6mqBK413V76nTp/S9QBt5PjmKWcMzhbIFu+myp6bUV4Sej44OK9uQCUkgYYhYpGRMmECi24bi26Z2HJBv1ATyMK8kuM1A8JEJDtO0jfgl22Th0GSp81F+E9+EeQ34ZVf+RFl+ER3zW7TViDmOJ93gCUyOk22y0EYIBJeZKxmX8UaF7daSd6zxCo3QZsEFPcYzRyxIgxJvwrWthGxdyG7zs03GGtx5pgNeNHae1Nnh7RJJjI86BLvZthzaUv2bKo+Iq1WDPno+K9uQKoxhiwV5gTIwxlkqPXB6vCVf1Tbqsy8D9pgou8C25nrJlIL4MEsg06adKs2Rc/7o2UXXqtD9PgSqABMETiTvSHvs8YY0SdxEZytesEI9KMO/mO870ozrYF6Ej7VjeNjLlyuQX1kaJ9cpn3wEvZ1Q1M/usKBAbM9A2ZUpsVXHutFrL0x0XotC6NgUNQ2nn8HhmFLJ6JqiTLAZhbmJedlm/yBBe1yj0xvqmL808obyKx5XfqUzfD1/9pAgvsyUFtlbnzoBN42VWhRLPkypea6f3qoNDmfhEmoNlR9XGkEVyiihrdSN9coCGSkCAs6rdzpqAjwyNY3Nkj9CCJUPjG2NV952qWznWZMx5WZgzqng/aE8+QAuZIH9mgGBZRZ8k5QG8fwQ506t2ULkHsYvIqVZub64z0Por37Nf46Pn2/iJ6rycrLr2DP3eXeeEvobCEZtEo2wz4ZdA2JjkYQZIzIoNcrXp5KLv8zypbOXbQ7rSM8/Dlrf3WFFG9I68JCAKjmLGi8NSZI95+/5gITfXXZ6oXaQA/ltwR2Wz96EElOhbpOo6ezU52fYeV0q8VSNTDiHPdGQEEQwZMrK/PvxRjkH4LnUo3X38TYZmBDWBX5B9QSYJjdNgC+8l5MgzW8+3WuvTBdKuUsXWbW+A79RJwE8U5HFse +sQajrBI L+aR/lNnh9bE+yP7tCXmQYEHnB0LKZG9i7q0rDvcHUeKYYO6X1o1K9Y0wo0laSNp8c+cEzNUjRCwRLdkVOJprBdiN8ZOqeD+H6Y5D1pxzk03ODsfm7AIEaNI0YPhrI4+t0FK4 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: According to LoongArch documentation online, there are two types of address translation modes: direct mapped address translation mode (direct mapped mode) and page table mapped address translation mode (page table mapped mode). Currently, the upstream kernel only supports direct mapped mode. This patch adds a function that determines whether page table mapped mode should be used, and also adds the corresponding handler functions for both modes. For more details on the two modes, see [1]. [1] https://loongson.github.io/LoongArch-Documentation/LoongArch-Vol1-EN.html#virtual-address-space-and-address-translation-mode Signed-off-by: Enze Li --- arch/loongarch/include/asm/page.h | 19 ++++++++++++++++++- arch/loongarch/include/asm/pgtable.h | 2 ++ arch/loongarch/mm/pgtable.c | 6 ++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/arch/loongarch/include/asm/page.h b/arch/loongarch/include/asm/page.h index 26e8dccb6619..e43a2385b2cd 100644 --- a/arch/loongarch/include/asm/page.h +++ b/arch/loongarch/include/asm/page.h @@ -32,6 +32,7 @@ #include #include +#include /* * It's normally defined only for FLATMEM config but it's @@ -84,7 +85,23 @@ typedef struct { unsigned long pgprot; } pgprot_t; #define sym_to_pfn(x) __phys_to_pfn(__pa_symbol(x)) #define virt_to_pfn(kaddr) PFN_DOWN(PHYSADDR(kaddr)) -#define virt_to_page(kaddr) pfn_to_page(virt_to_pfn(kaddr)) + +static inline bool is_tlb_addr(unsigned long kaddr) +{ + if (unlikely((kaddr & GENMASK(BITS_PER_LONG - 1, cpu_vabits)) == + GENMASK(BITS_PER_LONG - 1, cpu_vabits))) + return true; + return false; +} + +#define dwm_virt_to_page(kaddr) pfn_to_page(virt_to_pfn(kaddr)) + +#define virt_to_page(kaddr) \ +({ \ + is_tlb_addr((unsigned long)kaddr) ? \ + tlb_virt_to_page((unsigned long)kaddr) : \ + dwm_virt_to_page((unsigned long)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/include/asm/pgtable.h b/arch/loongarch/include/asm/pgtable.h index 38afeb7dd58b..98a0c98de9d1 100644 --- a/arch/loongarch/include/asm/pgtable.h +++ b/arch/loongarch/include/asm/pgtable.h @@ -353,6 +353,8 @@ static inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *pt #define PMD_T_LOG2 (__builtin_ffs(sizeof(pmd_t)) - 1) #define PTE_T_LOG2 (__builtin_ffs(sizeof(pte_t)) - 1) +inline struct page *tlb_virt_to_page(unsigned long kaddr); + extern pgd_t swapper_pg_dir[]; extern pgd_t invalid_pg_dir[]; diff --git a/arch/loongarch/mm/pgtable.c b/arch/loongarch/mm/pgtable.c index 36a6dc0148ae..20e7425d235d 100644 --- a/arch/loongarch/mm/pgtable.c +++ b/arch/loongarch/mm/pgtable.c @@ -9,6 +9,12 @@ #include #include +inline struct page *tlb_virt_to_page(unsigned long kaddr) +{ + return pte_page(*virt_to_kpte(kaddr)); +} +EXPORT_SYMBOL_GPL(tlb_virt_to_page); + pgd_t *pgd_alloc(struct mm_struct *mm) { pgd_t *ret, *init;