Message ID | 20230511132113.80196-2-ryan.roberts@arm.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp4371219vqo; Thu, 11 May 2023 06:28:10 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ5S3tRJFiR7lPClY9x24Kyz2QPNEQsUBjja/fVlFDXuc33AXbrmmLuakA6s8OBhWWQgMkuQ X-Received: by 2002:a17:903:1110:b0:1a6:8ed5:428a with SMTP id n16-20020a170903111000b001a68ed5428amr25603178plh.22.1683811689792; Thu, 11 May 2023 06:28:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1683811689; cv=none; d=google.com; s=arc-20160816; b=wN+4awCu86westwcbKLDNBM6X+DLEPIxYQktgZMZA6B67AvaRm15udeUHufBWLMFGD sNcTynKCasv7pDG486B5fY4jhl2nyv15COeBoOHxy11kZmIa64i00cna3t0lku7pTPIE m9uCyNlbqH7bwVRts47LTgtK/i5kLW13++bQWgL3IJkk2BdkhXIoK5MTpf8DKRhblx2e hfH3OEOo/CynglIxT4CrfqtzLbfqXJUAcXzrCJKc9R3x9yVJETa7r8wb5BASoHO/5pIq 0n8zXnzv8ewUrAEohXohy+1CjoL3XAqESJjIKzUJl+69ffrFylFLgbjdWArqaVVnNKZv RJ1Q== 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; bh=iJTCpwM3C7wRT8X7CgIcIwNcs7Jix29ply3bIuZCJeE=; b=AlDwpzjAdV/BBHMJpAUekGKfskk0YyLZN4pwBlZkJsYQJBCXOnFebW9hxrEJMiq2GW jiCUbimcQwtP6rF4kJSTFBRa2a1LSJgxiu+1GJlenqlCbPkNb0LaJPBcFhGuSr1alASj RCo202qDmrTej9rTwF3LsWDv4kD3RhMsXuNlvWekTwQ+bsPgSU1gn2PVSKfAD+fEnrSX S1ko8zmYFjR1atn9heKM1/eSLPRwhbPyjYeQ2SB1rnVSggbiSjLjUrWFBPidn3OmjNfL 8qpiRwKuKZO+u59CreG1bQ75adSAG5ezCItmBEbYwe7VCwRG5Cp58wmdVrPgmNeA26/Y 2Lig== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id j8-20020a17090aeb0800b0024c1ddfa1bfsi20014627pjz.92.2023.05.11.06.27.54; Thu, 11 May 2023 06:28:09 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238137AbjEKNXe (ORCPT <rfc822;peekingduck44@gmail.com> + 99 others); Thu, 11 May 2023 09:23:34 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40912 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238118AbjEKNXP (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Thu, 11 May 2023 09:23:15 -0400 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id D56A71157A for <linux-kernel@vger.kernel.org>; Thu, 11 May 2023 06:21:37 -0700 (PDT) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id BA32B165C; Thu, 11 May 2023 06:22:08 -0700 (PDT) Received: from e125769.cambridge.arm.com (e125769.cambridge.arm.com [10.1.196.26]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 1F4EA3F5A1; Thu, 11 May 2023 06:21:23 -0700 (PDT) From: Ryan Roberts <ryan.roberts@arm.com> To: Andrew Morton <akpm@linux-foundation.org>, "Matthew Wilcox (Oracle)" <willy@infradead.org>, "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>, SeongJae Park <sj@kernel.org> Cc: Ryan Roberts <ryan.roberts@arm.com>, linux-kernel@vger.kernel.org, linux-mm@kvack.org, damon@lists.linux.dev Subject: [RESEND PATCH v1 1/5] mm: vmalloc must set pte via arch code Date: Thu, 11 May 2023 14:21:09 +0100 Message-Id: <20230511132113.80196-2-ryan.roberts@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230511132113.80196-1-ryan.roberts@arm.com> References: <20230511132113.80196-1-ryan.roberts@arm.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_NONE,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1765604526288582739?= X-GMAIL-MSGID: =?utf-8?q?1765604526288582739?= |
Series |
Encapsulate PTE contents from non-arch code
|
|
Commit Message
Ryan Roberts
May 11, 2023, 1:21 p.m. UTC
It is bad practice to directly set pte entries within a pte table.
Instead all modifications must go through arch-provided helpers such as
set_pte_at() to give the arch code visibility and allow it to validate
(and potentially modify) the operation.
Fixes: 3e9a9e256b1e ("mm: add a vmap_pfn function")
Signed-off-by: Ryan Roberts <ryan.roberts@arm.com>
---
mm/vmalloc.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
--
2.25.1
Comments
On 11 May 2023, at 9:21, Ryan Roberts wrote: > It is bad practice to directly set pte entries within a pte table. > Instead all modifications must go through arch-provided helpers such as > set_pte_at() to give the arch code visibility and allow it to validate > (and potentially modify) the operation. > > Fixes: 3e9a9e256b1e ("mm: add a vmap_pfn function") > Signed-off-by: Ryan Roberts <ryan.roberts@arm.com> > --- > mm/vmalloc.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > LGTM. Reviewed-by: Zi Yan <ziy@nvidia.com> -- Best Regards, Yan, Zi
On 11/05/2023 16:00, Zi Yan wrote: > On 11 May 2023, at 9:21, Ryan Roberts wrote: > >> It is bad practice to directly set pte entries within a pte table. >> Instead all modifications must go through arch-provided helpers such as >> set_pte_at() to give the arch code visibility and allow it to validate >> (and potentially modify) the operation. >> >> Fixes: 3e9a9e256b1e ("mm: add a vmap_pfn function") >> Signed-off-by: Ryan Roberts <ryan.roberts@arm.com> >> --- >> mm/vmalloc.c | 5 ++++- >> 1 file changed, 4 insertions(+), 1 deletion(-) >> > LGTM. Reviewed-by: Zi Yan <ziy@nvidia.com> Thanks for the reviews!
You've not cc'd the vmalloc reviewers, including the author of 3e9a9e256b1e whose patch you purport to fix. Please remember to run get_maintainers.pl on all files you patch and cc them at least on relevant patches. Have added Christoph + Uladzislau as cc. You'll definitely want an ack from Christoph on this! On Thu, May 11, 2023 at 02:21:09PM +0100, Ryan Roberts wrote: > It is bad practice to directly set pte entries within a pte table. > Instead all modifications must go through arch-provided helpers such as > set_pte_at() to give the arch code visibility and allow it to validate > (and potentially modify) the operation. This does make sense, and I see for example in xtensa that an arch-specific instruction is issued under certain circumstances so I do suspect we should do this. As for validation, the function never indicates an error, so only in the sense that a WARN_ON() could _in theory_ trigger is it being validated. This might be quite a nitty point :) as set_pte_at() has no means of indicating an error. But maybe to be pedantic 'check' rather than 'validate'? > > Fixes: 3e9a9e256b1e ("mm: add a vmap_pfn function") Not sure if this is really 'fixing' anything, I mean ostensibly, but not sure if the tag is relevant here, that is more so for a bug being introduced, and unless an issue has arisen not sure if it's appropriate. But this might be a nit, again! > Signed-off-by: Ryan Roberts <ryan.roberts@arm.com> > --- > mm/vmalloc.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/mm/vmalloc.c b/mm/vmalloc.c > index 9683573f1225..d8d2fe797c55 100644 > --- a/mm/vmalloc.c > +++ b/mm/vmalloc.c > @@ -2899,10 +2899,13 @@ struct vmap_pfn_data { > static int vmap_pfn_apply(pte_t *pte, unsigned long addr, void *private) > { > struct vmap_pfn_data *data = private; > + pte_t ptent; > > if (WARN_ON_ONCE(pfn_valid(data->pfns[data->idx]))) > return -EINVAL; > - *pte = pte_mkspecial(pfn_pte(data->pfns[data->idx++], data->prot)); > + > + ptent = pte_mkspecial(pfn_pte(data->pfns[data->idx++], data->prot)); > + set_pte_at(&init_mm, addr, pte, ptent); While we're refactoring, it'd be nice to stash data->pfns[data->idx] into a local pfn variable. > return 0; > } > > -- > 2.25.1 >
Hi Lorenzo, Thanks for the review - I appreciate it! On 13/05/2023 14:14, Lorenzo Stoakes wrote: > You've not cc'd the vmalloc reviewers, including the author of 3e9a9e256b1e > whose patch you purport to fix. Please remember to run get_maintainers.pl > on all files you patch and cc them at least on relevant patches. > > Have added Christoph + Uladzislau as cc. I did run get_maintainers.pl, but it gave me 82 names. I assumed I wouldn't be making any friends by CCing everyone, so tried to choose what I thought was a sensible base. I guess I didn't quite get it right. Sorry about that. Thanks for noticing and adding the right people. > > You'll definitely want an ack from Christoph on this! > > On Thu, May 11, 2023 at 02:21:09PM +0100, Ryan Roberts wrote: >> It is bad practice to directly set pte entries within a pte table. >> Instead all modifications must go through arch-provided helpers such as >> set_pte_at() to give the arch code visibility and allow it to validate >> (and potentially modify) the operation. > > This does make sense, and I see for example in xtensa that an arch-specific > instruction is issued under certain circumstances so I do suspect we should > do this. arm64 provides another example, where barriers are required to ensure the page table walker sees the new pte and no fault is raised. See arch/arm64/include/asm/pgtable.h:set_pte() (which is called by its implementation of set_pte_at()). > > As for validation, the function never indicates an error, so only in the > sense that a WARN_ON() could _in theory_ trigger is it being > validated. This might be quite a nitty point :) as set_pte_at() has no > means of indicating an error. But maybe to be pedantic 'check' rather than > 'validate'? I'm sorry, I'm not sure what you are asking here? set_pte_at() forms part of the contract with he arch code and is defined never to return an error. Some implementations might have code enabled in debug configs to detect incorrect usage and emit warnings (see arm64's implementation). > >> >> Fixes: 3e9a9e256b1e ("mm: add a vmap_pfn function") > > Not sure if this is really 'fixing' anything, I mean ostensibly, but not > sure if the tag is relevant here, that is more so for a bug being > introduced, and unless an issue has arisen not sure if it's > appropriate. But this might be a nit, again! Well I'm happy to remove it if that's the concensus. But I do believe there is a real bug here. At least on arm64, the barriers are needed to prevent a race with the page table walker. That said, the only place in the tree I can see vmap_pfn() used, is in the i915 driver, which I guess has never been used on an arm64 platform. > >> Signed-off-by: Ryan Roberts <ryan.roberts@arm.com> >> --- >> mm/vmalloc.c | 5 ++++- >> 1 file changed, 4 insertions(+), 1 deletion(-) >> >> diff --git a/mm/vmalloc.c b/mm/vmalloc.c >> index 9683573f1225..d8d2fe797c55 100644 >> --- a/mm/vmalloc.c >> +++ b/mm/vmalloc.c >> @@ -2899,10 +2899,13 @@ struct vmap_pfn_data { >> static int vmap_pfn_apply(pte_t *pte, unsigned long addr, void *private) >> { >> struct vmap_pfn_data *data = private; >> + pte_t ptent; >> >> if (WARN_ON_ONCE(pfn_valid(data->pfns[data->idx]))) >> return -EINVAL; >> - *pte = pte_mkspecial(pfn_pte(data->pfns[data->idx++], data->prot)); >> + >> + ptent = pte_mkspecial(pfn_pte(data->pfns[data->idx++], data->prot)); >> + set_pte_at(&init_mm, addr, pte, ptent);> > While we're refactoring, it'd be nice to stash data->pfns[data->idx] into a > local pfn variable. OK, I'll do this for v2. Thanks, Ryan > >> return 0; >> } >> >> -- >> 2.25.1 >>
On Mon, May 15, 2023 at 09:29:16AM +0100, Ryan Roberts wrote: > Hi Lorenzo, > > Thanks for the review - I appreciate it! > > > On 13/05/2023 14:14, Lorenzo Stoakes wrote: > > You've not cc'd the vmalloc reviewers, including the author of 3e9a9e256b1e > > whose patch you purport to fix. Please remember to run get_maintainers.pl > > on all files you patch and cc them at least on relevant patches. > > > > Have added Christoph + Uladzislau as cc. > > I did run get_maintainers.pl, but it gave me 82 names. I assumed I wouldn't be > making any friends by CCing everyone, so tried to choose what I thought was a > sensible base. I guess I didn't quite get it right. Sorry about that. Thanks for > noticing and adding the right people. Right you mean across the whole of the patch set? Different people have different approaches as to how to cc patch sets as a whole, but it's not optional to include maintainers and reviewers on patches, so you should at least cc- them on individual patches. It's ok, it's really easy to mess this up, I have managed every variant of doing this the wrong way myself... :) > > > > > You'll definitely want an ack from Christoph on this! > > > > On Thu, May 11, 2023 at 02:21:09PM +0100, Ryan Roberts wrote: > >> It is bad practice to directly set pte entries within a pte table. > >> Instead all modifications must go through arch-provided helpers such as > >> set_pte_at() to give the arch code visibility and allow it to validate > >> (and potentially modify) the operation. > > > > This does make sense, and I see for example in xtensa that an arch-specific > > instruction is issued under certain circumstances so I do suspect we should > > do this. > > arm64 provides another example, where barriers are required to ensure the page > table walker sees the new pte and no fault is raised. See > arch/arm64/include/asm/pgtable.h:set_pte() (which is called by its > implementation of set_pte_at()). Ack, yeah I do think your patch is correct. > > > > > As for validation, the function never indicates an error, so only in the > > sense that a WARN_ON() could _in theory_ trigger is it being > > validated. This might be quite a nitty point :) as set_pte_at() has no > > means of indicating an error. But maybe to be pedantic 'check' rather than > > 'validate'? > > I'm sorry, I'm not sure what you are asking here? set_pte_at() forms part of the > contract with he arch code and is defined never to return an error. Some > implementations might have code enabled in debug configs to detect incorrect > usage and emit warnings (see arm64's implementation). I'm saying that 'validate' implies to me that you assess whether the value is correct and behave differently accordingly. It's something of a pedantic point, but perhaps 'check' is better here. > > > > >> > >> Fixes: 3e9a9e256b1e ("mm: add a vmap_pfn function") > > > > Not sure if this is really 'fixing' anything, I mean ostensibly, but not > > sure if the tag is relevant here, that is more so for a bug being > > introduced, and unless an issue has arisen not sure if it's > > appropriate. But this might be a nit, again! > > Well I'm happy to remove it if that's the concensus. But I do believe there is a > real bug here. At least on arm64, the barriers are needed to prevent a race with > the page table walker. That said, the only place in the tree I can see > vmap_pfn() used, is in the i915 driver, which I guess has never been used on an > arm64 platform. Yeah, again this might be a little too nitty! And I totally understand where you're coming from, I do agree this is appears to be an issue and your solution is right, it just feels less like an obvious 'bug' and more of an oversight. But I am being pedantic, and am not overly worried if you retain it :) > > > > >> Signed-off-by: Ryan Roberts <ryan.roberts@arm.com> > >> --- > >> mm/vmalloc.c | 5 ++++- > >> 1 file changed, 4 insertions(+), 1 deletion(-) > >> > >> diff --git a/mm/vmalloc.c b/mm/vmalloc.c > >> index 9683573f1225..d8d2fe797c55 100644 > >> --- a/mm/vmalloc.c > >> +++ b/mm/vmalloc.c > >> @@ -2899,10 +2899,13 @@ struct vmap_pfn_data { > >> static int vmap_pfn_apply(pte_t *pte, unsigned long addr, void *private) > >> { > >> struct vmap_pfn_data *data = private; > >> + pte_t ptent; > >> > >> if (WARN_ON_ONCE(pfn_valid(data->pfns[data->idx]))) > >> return -EINVAL; > >> - *pte = pte_mkspecial(pfn_pte(data->pfns[data->idx++], data->prot)); > >> + > >> + ptent = pte_mkspecial(pfn_pte(data->pfns[data->idx++], data->prot)); > >> + set_pte_at(&init_mm, addr, pte, ptent);> > > While we're refactoring, it'd be nice to stash data->pfns[data->idx] into a > > local pfn variable. > > OK, I'll do this for v2. Thanks! > > Thanks, > Ryan > > > > > >> return 0; > >> } > >> > >> -- > >> 2.25.1 > >> > Sorry to get into the weeds here a bit, overall I think this patch is fine, I would like Christoph to take a look given it's his code however.
On 15/05/2023 12:25, Lorenzo Stoakes wrote: > On Mon, May 15, 2023 at 09:29:16AM +0100, Ryan Roberts wrote: >> Hi Lorenzo, >> >> Thanks for the review - I appreciate it! >> >> >> On 13/05/2023 14:14, Lorenzo Stoakes wrote: >>> You've not cc'd the vmalloc reviewers, including the author of 3e9a9e256b1e >>> whose patch you purport to fix. Please remember to run get_maintainers.pl >>> on all files you patch and cc them at least on relevant patches. >>> >>> Have added Christoph + Uladzislau as cc. >> >> I did run get_maintainers.pl, but it gave me 82 names. I assumed I wouldn't be >> making any friends by CCing everyone, so tried to choose what I thought was a >> sensible base. I guess I didn't quite get it right. Sorry about that. Thanks for >> noticing and adding the right people. > > Right you mean across the whole of the patch set? Different people have > different approaches as to how to cc patch sets as a whole, but it's not > optional to include maintainers and reviewers on patches, so you should at least > cc- them on individual patches. > > It's ok, it's really easy to mess this up, I have managed every variant of doing > this the wrong way myself... :) Well I look forward to tripping over all the other variants in due course. ;-) > >> >>> >>> You'll definitely want an ack from Christoph on this! >>> >>> On Thu, May 11, 2023 at 02:21:09PM +0100, Ryan Roberts wrote: >>>> It is bad practice to directly set pte entries within a pte table. >>>> Instead all modifications must go through arch-provided helpers such as >>>> set_pte_at() to give the arch code visibility and allow it to validate >>>> (and potentially modify) the operation. >>> >>> This does make sense, and I see for example in xtensa that an arch-specific >>> instruction is issued under certain circumstances so I do suspect we should >>> do this. >> >> arm64 provides another example, where barriers are required to ensure the page >> table walker sees the new pte and no fault is raised. See >> arch/arm64/include/asm/pgtable.h:set_pte() (which is called by its >> implementation of set_pte_at()). > > Ack, yeah I do think your patch is correct. > >> >>> >>> As for validation, the function never indicates an error, so only in the >>> sense that a WARN_ON() could _in theory_ trigger is it being >>> validated. This might be quite a nitty point :) as set_pte_at() has no >>> means of indicating an error. But maybe to be pedantic 'check' rather than >>> 'validate'? >> >> I'm sorry, I'm not sure what you are asking here? set_pte_at() forms part of the >> contract with he arch code and is defined never to return an error. Some >> implementations might have code enabled in debug configs to detect incorrect >> usage and emit warnings (see arm64's implementation). > > I'm saying that 'validate' implies to me that you assess whether the value is > correct and behave differently accordingly. It's something of a pedantic point, > but perhaps 'check' is better here. Ahh, you were critiqing the commit message, sorry totally missed that. I'll change 'validate' to 'check' in v2. > >> >>> >>>> >>>> Fixes: 3e9a9e256b1e ("mm: add a vmap_pfn function") >>> >>> Not sure if this is really 'fixing' anything, I mean ostensibly, but not >>> sure if the tag is relevant here, that is more so for a bug being >>> introduced, and unless an issue has arisen not sure if it's >>> appropriate. But this might be a nit, again! >> >> Well I'm happy to remove it if that's the concensus. But I do believe there is a >> real bug here. At least on arm64, the barriers are needed to prevent a race with >> the page table walker. That said, the only place in the tree I can see >> vmap_pfn() used, is in the i915 driver, which I guess has never been used on an >> arm64 platform. > > Yeah, again this might be a little too nitty! And I totally understand where > you're coming from, I do agree this is appears to be an issue and your solution > is right, it just feels less like an obvious 'bug' and more of an oversight. But > I am being pedantic, and am not overly worried if you retain it :) OK, I'm going to retain it. > >> >>> >>>> Signed-off-by: Ryan Roberts <ryan.roberts@arm.com> >>>> --- >>>> mm/vmalloc.c | 5 ++++- >>>> 1 file changed, 4 insertions(+), 1 deletion(-) >>>> >>>> diff --git a/mm/vmalloc.c b/mm/vmalloc.c >>>> index 9683573f1225..d8d2fe797c55 100644 >>>> --- a/mm/vmalloc.c >>>> +++ b/mm/vmalloc.c >>>> @@ -2899,10 +2899,13 @@ struct vmap_pfn_data { >>>> static int vmap_pfn_apply(pte_t *pte, unsigned long addr, void *private) >>>> { >>>> struct vmap_pfn_data *data = private; >>>> + pte_t ptent; >>>> >>>> if (WARN_ON_ONCE(pfn_valid(data->pfns[data->idx]))) >>>> return -EINVAL; >>>> - *pte = pte_mkspecial(pfn_pte(data->pfns[data->idx++], data->prot)); >>>> + >>>> + ptent = pte_mkspecial(pfn_pte(data->pfns[data->idx++], data->prot)); >>>> + set_pte_at(&init_mm, addr, pte, ptent);> >>> While we're refactoring, it'd be nice to stash data->pfns[data->idx] into a >>> local pfn variable. >> >> OK, I'll do this for v2. > > Thanks! > >> >> Thanks, >> Ryan >> >> >>> >>>> return 0; >>>> } >>>> >>>> -- >>>> 2.25.1 >>>> >> > > Sorry to get into the weeds here a bit, overall I think this patch is fine, I > would like Christoph to take a look given it's his code however. No problem; I'm new here, so just having someone taking the time to respond with specific feedback, is a win as far as I'm concerned! Thanks, Ryan
On Thu, May 11, 2023 at 02:21:09PM +0100, Ryan Roberts wrote: > It is bad practice to directly set pte entries within a pte table. > Instead all modifications must go through arch-provided helpers such as > set_pte_at() to give the arch code visibility and allow it to validate > (and potentially modify) the operation. Looks good: Reviewed-by: Christoph Hellwig <hch@lst.de>
On Sat, May 13, 2023 at 02:14:18PM +0100, Lorenzo Stoakes wrote: > > Fixes: 3e9a9e256b1e ("mm: add a vmap_pfn function") > > Not sure if this is really 'fixing' anything, I mean ostensibly, but not > sure if the tag is relevant here, that is more so for a bug being > introduced, and unless an issue has arisen not sure if it's > appropriate. But this might be a nit, again! vmap_pfn was factored out of i915-specific code, which probably never ran on anything but x86 at that time. Now that intel builds plug in GPUs is probably could. But independent of that core mm code should use the proper APIs.
On Tue, May 16, 2023 at 11:20:07PM -0700, Christoph Hellwig wrote: > On Sat, May 13, 2023 at 02:14:18PM +0100, Lorenzo Stoakes wrote: > > > Fixes: 3e9a9e256b1e ("mm: add a vmap_pfn function") > > > > Not sure if this is really 'fixing' anything, I mean ostensibly, but not > > sure if the tag is relevant here, that is more so for a bug being > > introduced, and unless an issue has arisen not sure if it's > > appropriate. But this might be a nit, again! > > vmap_pfn was factored out of i915-specific code, which probably never > ran on anything but x86 at that time. Now that intel builds plug in > GPUs is probably could. But independent of that core mm code should use > the proper APIs. > Yeah indeed, I just wondered if the tag was quite right for this but it's not a big deal, fine to leave in. I agree the approach is correct, just wanted your ok so also adding my:- Acked-by: Lorenzo Stoakes <lstoakes@gmail.com>
diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 9683573f1225..d8d2fe797c55 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -2899,10 +2899,13 @@ struct vmap_pfn_data { static int vmap_pfn_apply(pte_t *pte, unsigned long addr, void *private) { struct vmap_pfn_data *data = private; + pte_t ptent; if (WARN_ON_ONCE(pfn_valid(data->pfns[data->idx]))) return -EINVAL; - *pte = pte_mkspecial(pfn_pte(data->pfns[data->idx++], data->prot)); + + ptent = pte_mkspecial(pfn_pte(data->pfns[data->idx++], data->prot)); + set_pte_at(&init_mm, addr, pte, ptent); return 0; }