From mboxrd@z Thu Jan 1 00:00:00 1970 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 BFF8FEB64D9 for ; Wed, 14 Jun 2023 14:59:59 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 3C9EA6B0074; Wed, 14 Jun 2023 10:59:59 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 37A5C8E0002; Wed, 14 Jun 2023 10:59:59 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 241D38E0001; Wed, 14 Jun 2023 10:59:59 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 128BA6B0074 for ; Wed, 14 Jun 2023 10:59:59 -0400 (EDT) Received: from smtpin29.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id DEDF61C80B1 for ; Wed, 14 Jun 2023 14:59:58 +0000 (UTC) X-FDA: 80901663276.29.5263CA2 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by imf06.hostedemail.com (Postfix) with ESMTP id E3B0C18001F for ; Wed, 14 Jun 2023 14:59:56 +0000 (UTC) Authentication-Results: imf06.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=Yb6roLWg; dmarc=pass (policy=none) header.from=kernel.org; spf=pass (imf06.hostedemail.com: domain of rppt@kernel.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=rppt@kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1686754797; 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-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=HrpvPtgiYKOO3quBjD1GdUYCj4nYWRWiaNuPT4oHeKo=; b=Fm+9XwVMljaH318g199nfBDL7ka3Cj+wiGFC7b8Kl6KmEc3euClDlN08+RLTgG+XHH6/Re w7xUVvQgNGFEjYW47HpkcstR+OjfbpQpL3KIUvrXpteKbZkF3DDDR6DtKZRobWJGeoT0pu SES879W+4m6BBBa4ul0nHvCGWtM46Sg= ARC-Authentication-Results: i=1; imf06.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=Yb6roLWg; dmarc=pass (policy=none) header.from=kernel.org; spf=pass (imf06.hostedemail.com: domain of rppt@kernel.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=rppt@kernel.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1686754797; a=rsa-sha256; cv=none; b=1dr0KJfq6bl9QlKAa+ir7OYNgKJ9YpV0/r3URnGnm9BmoNPlOXgJ5oyH99bepOZ7KwG9bJ EcadmoWEZmikx8pJbTH5FGCMQqAnmEkcB3yBo5yeJRdti2EvzrOhQelflgEbXXiHbuRDbh 7tA+UZbTC21POJmFJqmoNkm6bTs19CM= Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id CE70D63CDA; Wed, 14 Jun 2023 14:59:55 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4CD37C433C8; Wed, 14 Jun 2023 14:59:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1686754795; bh=Snf0vvy1ZfRMDrG2QV2GY/XXoVVQULhRbHTUN6/ozYs=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=Yb6roLWgU1FpArbgMhm3suW779Jdabd7l+H7dMd2zBGyrh0BOeY5wtdMql6biURZl v4iwBz/HuCXVMtg61KO5mBWTrhq69oDtUrOThilHfsnE8uTE2ZygL8lFanhWvJUrqE vMcJQ9egXs+J1/HmerJQneWZPIb7WwKm6eCArSImVwb+BZcAaye0RccD/lcNjLTILt TGcYSdafz5ds7jjw5qQKCC3YeIHWy3SRi7PvyD5uV8jIRQEF+KcbULtCXAQiLGBilE AxzTGwTNCf+5ligff90SIYQR5ysfy1RO+UiN0WBtTnV4rm3ThxZVJb9CHZkUcTgAgY VSYQ3btc5Uccg== Date: Wed, 14 Jun 2023 17:59:17 +0300 From: Mike Rapoport To: "Vishal Moola (Oracle)" Cc: Andrew Morton , Matthew Wilcox , linux-mm@kvack.org, linux-arch@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-csky@vger.kernel.org, linux-hexagon@vger.kernel.org, loongarch@lists.linux.dev, linux-m68k@lists.linux-m68k.org, linux-mips@vger.kernel.org, linux-openrisc@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, linux-riscv@lists.infradead.org, linux-s390@vger.kernel.org, linux-sh@vger.kernel.org, sparclinux@vger.kernel.org, linux-um@lists.infradead.org, xen-devel@lists.xenproject.org, kvm@vger.kernel.org, Hugh Dickins Subject: Re: [PATCH v4 19/34] pgalloc: Convert various functions to use ptdescs Message-ID: <20230614145917.GR52412@kernel.org> References: <20230612210423.18611-1-vishal.moola@gmail.com> <20230612210423.18611-20-vishal.moola@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20230612210423.18611-20-vishal.moola@gmail.com> X-Rspamd-Queue-Id: E3B0C18001F X-Rspam-User: X-Rspamd-Server: rspam05 X-Stat-Signature: dm7zd6bktpegrm5ukirdk55kbrqrbqt7 X-HE-Tag: 1686754796-703216 X-HE-Meta: U2FsdGVkX18mm0JUDmkTcFeCeIdMRDniXyvYVCJOuncg0m7PibzYdX5gNeUQfGKW0liu6zeNERjMZ00pjaP5uy00GrO3c0LZ+oPN4VeJIA9Y9H1RrFru1MV5IgCdc1P7WMiZAlOQpaQpbcmvAwfkx5NL8tivUA5KdYqrEBsLYtuET7fRpzBTsnd6QQ1HfSjAR2f4PQJ1/L+jm6qvZeXOJO5/lAS5BwtsQ9GV8nm0/l9yIWTOIoeszp/XADOsjfresybIdGbBqsLOq8JOQvdaPdyvdAUJ4Xu1MHf39M+Uio3HxYAAVRhSOsETkBQZpLiD0GKgl3VGwTrudazFqzhMxH5/PwN5LDGQcdI3nfbFbZix3wXRg1VX639qCn8BwUKKdM80pcT4PUh1wdbTM8sZe3d9Qe0OsccJJrcBCDAJ+4OOHNw7Y970MI12IKUUbobucI1cISlpFH8wM69QLZBDZVxPQ2LDlafHUbYC8juELNA6mwkeHXBFYkZIImx26nrcUDvTfWdAUcYjyinjklQIzQWm2pa9Op3KTEiCZ6Wa5H7wD5SSbCRmXMlL1dIcSqMB47AIgdeaZ2hz3ExEAmj6XVGU7Xste1wn1tUAieQjqyr85XjixAKkRpBvMw8B68oKZQC91Hz06bhgI0tok3oINfOz537ur4JoBvFH3RlCVaYYFXhB3lb8ZGrW9uPV3o0QdZWCi6kFipdQx0tfKQvdPg7RZvCttW7FyydsECai25n5zSBS0y7e6q6x6Kq2mGMniPmCPZ3lF90TwXz3QZs4tkYBlVoyduAWBRw9/pQqEOjVpwcPUPYoQVKMiu7vhPXsBUF34xb2rME6TSBWmDNw5+MVT6OL+kNelV7Na0RBNlyMEIYuahXMIn0KKjgqjA66MEvZvyP2gIZ6YhkqeVOX86+aOjOl0cSt/UuS3+u8OxfRh1a3HanUibIRyxrS7ltqQhaNCnLZgkBOI01A71+ ESv4ZMa2 oTuxlX3imnvXrpYRNNAVSGbwUgn7WYSMNpZFIF6mKBNx1FDzAK6dTlxTywHiVx1ByXriG9rGcdl/i4o52OHN5thCMeBvMUKcMZoJ6GNnDeGIA3IMnp1e/EyBxWxSfjVtxNH7X4TUKZ4PVkwMa/2bY57dCHEbPA+lJDuKCbEcmbF1agwEGWtxAUu6gGsoOC2x0KiGs/04aT8kYlzENV7MhsvBtPLjuEPuYQwbXVih/RKDXkhszDWwxjwBrkI9A16lyYJQuVVhrPUgykXi+z+xQFwmr1ORa8qlQFq845+sD+IfizJ/lZYXbtoZjHyNuIhRZMPkAqgkCDgqMRRl6Ku228D2zngnxm2WWWkzxWvJQ8/FQe2WaEs/WxTout6n+C5xRXlGR 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: On Mon, Jun 12, 2023 at 02:04:08PM -0700, Vishal Moola (Oracle) wrote: > As part of the conversions to replace pgtable constructor/destructors with > ptdesc equivalents, convert various page table functions to use ptdescs. > > Some of the functions use the *get*page*() helper functions. Convert > these to use pagetable_alloc() and ptdesc_address() instead to help > standardize page tables further. > > Signed-off-by: Vishal Moola (Oracle) > --- > include/asm-generic/pgalloc.h | 62 +++++++++++++++++++++-------------- > 1 file changed, 37 insertions(+), 25 deletions(-) > > diff --git a/include/asm-generic/pgalloc.h b/include/asm-generic/pgalloc.h > index a7cf825befae..3fd6ce79e654 100644 > --- a/include/asm-generic/pgalloc.h > +++ b/include/asm-generic/pgalloc.h > @@ -18,7 +18,11 @@ > */ > static inline pte_t *__pte_alloc_one_kernel(struct mm_struct *mm) > { > - return (pte_t *)__get_free_page(GFP_PGTABLE_KERNEL); > + struct ptdesc *ptdesc = pagetable_alloc(GFP_PGTABLE_KERNEL, 0); > + > + if (!ptdesc) > + return NULL; > + return ptdesc_address(ptdesc); > } > > #ifndef __HAVE_ARCH_PTE_ALLOC_ONE_KERNEL > @@ -41,7 +45,7 @@ static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm) > */ > static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) > { > - free_page((unsigned long)pte); > + pagetable_free(virt_to_ptdesc(pte)); > } > > /** > @@ -49,7 +53,7 @@ static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) > * @mm: the mm_struct of the current context > * @gfp: GFP flags to use for the allocation > * > - * Allocates a page and runs the pgtable_pte_page_ctor(). > + * Allocates a ptdesc and runs the pagetable_pte_ctor(). Allocates memory for page table and ptdesc > * > * This function is intended for architectures that need > * anything beyond simple page allocation or must have custom GFP flags. The Return: description here should be fixed up > @@ -58,17 +62,17 @@ static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) > */ > static inline pgtable_t __pte_alloc_one(struct mm_struct *mm, gfp_t gfp) > { > - struct page *pte; > + struct ptdesc *ptdesc; > > - pte = alloc_page(gfp); > - if (!pte) > + ptdesc = pagetable_alloc(gfp, 0); > + if (!ptdesc) > return NULL; > - if (!pgtable_pte_page_ctor(pte)) { > - __free_page(pte); > + if (!pagetable_pte_ctor(ptdesc)) { > + pagetable_free(ptdesc); > return NULL; > } > > - return pte; > + return ptdesc_page(ptdesc); > } > > #ifndef __HAVE_ARCH_PTE_ALLOC_ONE > @@ -76,7 +80,7 @@ static inline pgtable_t __pte_alloc_one(struct mm_struct *mm, gfp_t gfp) > * pte_alloc_one - allocate a page for PTE-level user page table > * @mm: the mm_struct of the current context > * > - * Allocates a page and runs the pgtable_pte_page_ctor(). > + * Allocates a ptdesc and runs the pagetable_pte_ctor(). Allocates memory for page table and ptdesc > * > * Return: `struct page` initialized as page table or %NULL on error Return: ptdesc ... > */ > @@ -98,8 +102,10 @@ static inline pgtable_t pte_alloc_one(struct mm_struct *mm) > */ > static inline void pte_free(struct mm_struct *mm, struct page *pte_page) > { > - pgtable_pte_page_dtor(pte_page); > - __free_page(pte_page); > + struct ptdesc *ptdesc = page_ptdesc(pte_page); > + > + pagetable_pte_dtor(ptdesc); > + pagetable_free(ptdesc); > } > > > @@ -110,7 +116,7 @@ static inline void pte_free(struct mm_struct *mm, struct page *pte_page) > * pmd_alloc_one - allocate a page for PMD-level page table > * @mm: the mm_struct of the current context > * > - * Allocates a page and runs the pgtable_pmd_page_ctor(). > + * Allocates a ptdesc and runs the pagetable_pmd_ctor(). Allocate memory for page table and ptdesc > * Allocations use %GFP_PGTABLE_USER in user context and > * %GFP_PGTABLE_KERNEL in kernel context. > * > @@ -118,28 +124,30 @@ static inline void pte_free(struct mm_struct *mm, struct page *pte_page) > */ > static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long addr) > { > - struct page *page; > + struct ptdesc *ptdesc; > gfp_t gfp = GFP_PGTABLE_USER; > > if (mm == &init_mm) > gfp = GFP_PGTABLE_KERNEL; > - page = alloc_page(gfp); > - if (!page) > + ptdesc = pagetable_alloc(gfp, 0); > + if (!ptdesc) > return NULL; > - if (!pgtable_pmd_page_ctor(page)) { > - __free_page(page); > + if (!pagetable_pmd_ctor(ptdesc)) { > + pagetable_free(ptdesc); > return NULL; > } > - return (pmd_t *)page_address(page); > + return ptdesc_address(ptdesc); > } > #endif > > #ifndef __HAVE_ARCH_PMD_FREE > static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd) > { > + struct ptdesc *ptdesc = virt_to_ptdesc(pmd); > + > BUG_ON((unsigned long)pmd & (PAGE_SIZE-1)); > - pgtable_pmd_page_dtor(virt_to_page(pmd)); > - free_page((unsigned long)pmd); > + pagetable_pmd_dtor(ptdesc); > + pagetable_free(ptdesc); > } > #endif > > @@ -149,11 +157,15 @@ static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd) > > static inline pud_t *__pud_alloc_one(struct mm_struct *mm, unsigned long addr) > { > - gfp_t gfp = GFP_PGTABLE_USER; > + gfp_t gfp = GFP_PGTABLE_USER | __GFP_ZERO; GFP_PGTABLE_USER already contains __GFP_ZERO > + struct ptdesc *ptdesc; > > if (mm == &init_mm) > gfp = GFP_PGTABLE_KERNEL; > - return (pud_t *)get_zeroed_page(gfp); > + ptdesc = pagetable_alloc(gfp, 0); > + if (!ptdesc) > + return NULL; > + return ptdesc_address(ptdesc); > } > > #ifndef __HAVE_ARCH_PUD_ALLOC_ONE > @@ -175,7 +187,7 @@ static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long addr) > static inline void __pud_free(struct mm_struct *mm, pud_t *pud) > { > BUG_ON((unsigned long)pud & (PAGE_SIZE-1)); > - free_page((unsigned long)pud); > + pagetable_free(virt_to_ptdesc(pud)); > } > > #ifndef __HAVE_ARCH_PUD_FREE > @@ -190,7 +202,7 @@ static inline void pud_free(struct mm_struct *mm, pud_t *pud) > #ifndef __HAVE_ARCH_PGD_FREE > static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd) > { > - free_page((unsigned long)pgd); > + pagetable_free(virt_to_ptdesc(pgd)); > } > #endif > > -- > 2.40.1 > > -- Sincerely yours, Mike.