From: Thomas Gleixner <tglx@linutronix.de>
To: Peter Xu <peterx@redhat.com>,
linux-kernel@vger.kernel.org, linux-mm@kvack.org
Cc: James Houghton <jthoughton@google.com>,
David Hildenbrand <david@redhat.com>,
Dave Hansen <dave.hansen@linux.intel.com>,
peterx@redhat.com, Christophe Leroy <christophe.leroy@csgroup.eu>,
Dave Jiang <dave.jiang@intel.com>,
"Aneesh Kumar K . V" <aneesh.kumar@linux.ibm.com>,
x86@kernel.org, Hugh Dickins <hughd@google.com>,
Matthew Wilcox <willy@infradead.org>,
Ingo Molnar <mingo@redhat.com>, Huang Ying <ying.huang@intel.com>,
Rik van Riel <riel@surriel.com>,
Nicholas Piggin <npiggin@gmail.com>,
Borislav Petkov <bp@alien8.de>,
"Kirill A . Shutemov" <kirill@shutemov.name>,
Dan Williams <dan.j.williams@intel.com>,
Vlastimil Babka <vbabka@suse.cz>,
Oscar Salvador <osalvador@suse.de>,
linuxppc-dev@lists.ozlabs.org,
Andrew Morton <akpm@linux-foundation.org>,
Rick P Edgecombe <rick.p.edgecombe@intel.com>,
Mel Gorman <mgorman@techsingularity.net>
Subject: Re: [PATCH v4 6/7] mm/x86: Add missing pud helpers
Date: Thu, 08 Aug 2024 00:37:21 +0200 [thread overview]
Message-ID: <875xsc0xjy.ffs@tglx> (raw)
In-Reply-To: <20240807194812.819412-7-peterx@redhat.com>
On Wed, Aug 07 2024 at 15:48, Peter Xu wrote:
> These new helpers will be needed for pud entry updates soon. Introduce
> these helpers by referencing the pmd ones. Namely:
>
> - pudp_invalidate()
> - pud_modify()
Zero content about what these helpers do and why they are needed. That's
not how it works, really.
> +static inline pud_t pud_mkinvalid(pud_t pud)
> +{
> + return pfn_pud(pud_pfn(pud),
> + __pgprot(pud_flags(pud) & ~(_PAGE_PRESENT|_PAGE_PROTNONE)));
100 characters...
> +}
> +
> static inline u64 flip_protnone_guard(u64 oldval, u64 val, u64 mask);
>
> static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
> @@ -834,14 +840,8 @@ static inline pmd_t pmd_modify(pmd_t pmd, pgprot_t newprot)
> pmd_result = __pmd(val);
>
> /*
> - * To avoid creating Write=0,Dirty=1 PMDs, pte_modify() needs to avoid:
> - * 1. Marking Write=0 PMDs Dirty=1
> - * 2. Marking Dirty=1 PMDs Write=0
> - *
> - * The first case cannot happen because the _PAGE_CHG_MASK will filter
> - * out any Dirty bit passed in newprot. Handle the second case by
> - * going through the mksaveddirty exercise. Only do this if the old
> - * value was Write=1 to avoid doing this on Shadow Stack PTEs.
> + * Avoid creating shadow stack PMD by accident. See comment in
> + * pte_modify().
The changelog is utterly silent about this comment update.
> */
> if (oldval & _PAGE_RW)
> pmd_result = pmd_mksaveddirty(pmd_result);
> @@ -851,6 +851,29 @@ static inline pmd_t pmd_modify(pmd_t pmd, pgprot_t newprot)
> return pmd_result;
> }
>
> +static inline pud_t pud_modify(pud_t pud, pgprot_t newprot)
> +{
> + pudval_t val = pud_val(pud), oldval = val;
> + pud_t pud_result;
> +
> + val &= _HPAGE_CHG_MASK;
> + val |= check_pgprot(newprot) & ~_HPAGE_CHG_MASK;
> + val = flip_protnone_guard(oldval, val, PHYSICAL_PUD_PAGE_MASK);
> +
> + pud_result = __pud(val);
> +
> + /*
> + * Avoid creating shadow stack PUD by accident. See comment in
> + * pte_modify().
> + */
> + if (oldval & _PAGE_RW)
> + pud_result = pud_mksaveddirty(pud_result);
> + else
> + pud_result = pud_clear_saveddirty(pud_result);
> +
> + return pud_result;
> +}
> +
> /*
> * mprotect needs to preserve PAT and encryption bits when updating
> * vm_page_prot
> @@ -1389,10 +1412,26 @@ static inline pmd_t pmdp_establish(struct vm_area_struct *vma,
> }
> #endif
>
> +static inline pud_t pudp_establish(struct vm_area_struct *vma,
> + unsigned long address, pud_t *pudp, pud_t pud)
Random line break alignment.... See documentation.
> +{
> + page_table_check_pud_set(vma->vm_mm, pudp, pud);
> + if (IS_ENABLED(CONFIG_SMP)) {
> + return xchg(pudp, pud);
> + } else {
> + pud_t old = *pudp;
> + WRITE_ONCE(*pudp, pud);
Lacks a newline between variable declaration and code.
But seriously, why optimizing for !SMP? That's a pointless exercise and
a guarantee for bitrot.
> + return old;
> + }
> +}
> +
> #define __HAVE_ARCH_PMDP_INVALIDATE_AD
> extern pmd_t pmdp_invalidate_ad(struct vm_area_struct *vma,
> unsigned long address, pmd_t *pmdp);
>
> +pud_t pudp_invalidate(struct vm_area_struct *vma, unsigned long address,
> + pud_t *pudp);
While 'extern' is not required, please keep the file style consistent
and use the 100 characters...
> --- a/arch/x86/mm/pgtable.c
> +++ b/arch/x86/mm/pgtable.c
> @@ -641,6 +641,18 @@ pmd_t pmdp_invalidate_ad(struct vm_area_struct *vma, unsigned long address,
> }
> #endif
>
> +#if defined(CONFIG_TRANSPARENT_HUGEPAGE) && \
> + defined(CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD)
> +pud_t pudp_invalidate(struct vm_area_struct *vma, unsigned long address,
> + pud_t *pudp)
> +{
> + VM_WARN_ON_ONCE(!pud_present(*pudp));
> + pud_t old = pudp_establish(vma, address, pudp, pud_mkinvalid(*pudp));
> + flush_pud_tlb_range(vma, address, address + HPAGE_PUD_SIZE);
> + return old;
Your keyboard clearly lacks a newline key ...
Thanks,
tglx
WARNING: multiple messages have this Message-ID (diff)
From: Thomas Gleixner <tglx@linutronix.de>
To: Peter Xu <peterx@redhat.com>,
linux-kernel@vger.kernel.org, linux-mm@kvack.org
Cc: "Aneesh Kumar K . V" <aneesh.kumar@linux.ibm.com>,
Michael Ellerman <mpe@ellerman.id.au>,
Oscar Salvador <osalvador@suse.de>,
Dan Williams <dan.j.williams@intel.com>,
James Houghton <jthoughton@google.com>,
Matthew Wilcox <willy@infradead.org>,
Nicholas Piggin <npiggin@gmail.com>,
Rik van Riel <riel@surriel.com>,
Dave Jiang <dave.jiang@intel.com>,
Andrew Morton <akpm@linux-foundation.org>,
x86@kernel.org, Ingo Molnar <mingo@redhat.com>,
Rick P Edgecombe <rick.p.edgecombe@intel.com>,
"Kirill A . Shutemov" <kirill@shutemov.name>,
peterx@redhat.com, linuxppc-dev@lists.ozlabs.org,
Mel Gorman <mgorman@techsingularity.net>,
Hugh Dickins <hughd@google.com>, Borislav Petkov <bp@alien8.de>,
David Hildenbrand <david@redhat.com>,
Vlastimil Babka <vbabka@suse.cz>,
Dave Hansen <dave.hansen@linux.intel.com>,
Christophe Leroy <christophe.leroy@csgroup.eu>,
Huang Ying <ying.huang@intel.com>
Subject: Re: [PATCH v4 6/7] mm/x86: Add missing pud helpers
Date: Thu, 08 Aug 2024 00:37:21 +0200 [thread overview]
Message-ID: <875xsc0xjy.ffs@tglx> (raw)
In-Reply-To: <20240807194812.819412-7-peterx@redhat.com>
On Wed, Aug 07 2024 at 15:48, Peter Xu wrote:
> These new helpers will be needed for pud entry updates soon. Introduce
> these helpers by referencing the pmd ones. Namely:
>
> - pudp_invalidate()
> - pud_modify()
Zero content about what these helpers do and why they are needed. That's
not how it works, really.
> +static inline pud_t pud_mkinvalid(pud_t pud)
> +{
> + return pfn_pud(pud_pfn(pud),
> + __pgprot(pud_flags(pud) & ~(_PAGE_PRESENT|_PAGE_PROTNONE)));
100 characters...
> +}
> +
> static inline u64 flip_protnone_guard(u64 oldval, u64 val, u64 mask);
>
> static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
> @@ -834,14 +840,8 @@ static inline pmd_t pmd_modify(pmd_t pmd, pgprot_t newprot)
> pmd_result = __pmd(val);
>
> /*
> - * To avoid creating Write=0,Dirty=1 PMDs, pte_modify() needs to avoid:
> - * 1. Marking Write=0 PMDs Dirty=1
> - * 2. Marking Dirty=1 PMDs Write=0
> - *
> - * The first case cannot happen because the _PAGE_CHG_MASK will filter
> - * out any Dirty bit passed in newprot. Handle the second case by
> - * going through the mksaveddirty exercise. Only do this if the old
> - * value was Write=1 to avoid doing this on Shadow Stack PTEs.
> + * Avoid creating shadow stack PMD by accident. See comment in
> + * pte_modify().
The changelog is utterly silent about this comment update.
> */
> if (oldval & _PAGE_RW)
> pmd_result = pmd_mksaveddirty(pmd_result);
> @@ -851,6 +851,29 @@ static inline pmd_t pmd_modify(pmd_t pmd, pgprot_t newprot)
> return pmd_result;
> }
>
> +static inline pud_t pud_modify(pud_t pud, pgprot_t newprot)
> +{
> + pudval_t val = pud_val(pud), oldval = val;
> + pud_t pud_result;
> +
> + val &= _HPAGE_CHG_MASK;
> + val |= check_pgprot(newprot) & ~_HPAGE_CHG_MASK;
> + val = flip_protnone_guard(oldval, val, PHYSICAL_PUD_PAGE_MASK);
> +
> + pud_result = __pud(val);
> +
> + /*
> + * Avoid creating shadow stack PUD by accident. See comment in
> + * pte_modify().
> + */
> + if (oldval & _PAGE_RW)
> + pud_result = pud_mksaveddirty(pud_result);
> + else
> + pud_result = pud_clear_saveddirty(pud_result);
> +
> + return pud_result;
> +}
> +
> /*
> * mprotect needs to preserve PAT and encryption bits when updating
> * vm_page_prot
> @@ -1389,10 +1412,26 @@ static inline pmd_t pmdp_establish(struct vm_area_struct *vma,
> }
> #endif
>
> +static inline pud_t pudp_establish(struct vm_area_struct *vma,
> + unsigned long address, pud_t *pudp, pud_t pud)
Random line break alignment.... See documentation.
> +{
> + page_table_check_pud_set(vma->vm_mm, pudp, pud);
> + if (IS_ENABLED(CONFIG_SMP)) {
> + return xchg(pudp, pud);
> + } else {
> + pud_t old = *pudp;
> + WRITE_ONCE(*pudp, pud);
Lacks a newline between variable declaration and code.
But seriously, why optimizing for !SMP? That's a pointless exercise and
a guarantee for bitrot.
> + return old;
> + }
> +}
> +
> #define __HAVE_ARCH_PMDP_INVALIDATE_AD
> extern pmd_t pmdp_invalidate_ad(struct vm_area_struct *vma,
> unsigned long address, pmd_t *pmdp);
>
> +pud_t pudp_invalidate(struct vm_area_struct *vma, unsigned long address,
> + pud_t *pudp);
While 'extern' is not required, please keep the file style consistent
and use the 100 characters...
> --- a/arch/x86/mm/pgtable.c
> +++ b/arch/x86/mm/pgtable.c
> @@ -641,6 +641,18 @@ pmd_t pmdp_invalidate_ad(struct vm_area_struct *vma, unsigned long address,
> }
> #endif
>
> +#if defined(CONFIG_TRANSPARENT_HUGEPAGE) && \
> + defined(CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD)
> +pud_t pudp_invalidate(struct vm_area_struct *vma, unsigned long address,
> + pud_t *pudp)
> +{
> + VM_WARN_ON_ONCE(!pud_present(*pudp));
> + pud_t old = pudp_establish(vma, address, pudp, pud_mkinvalid(*pudp));
> + flush_pud_tlb_range(vma, address, address + HPAGE_PUD_SIZE);
> + return old;
Your keyboard clearly lacks a newline key ...
Thanks,
tglx
next prev parent reply other threads:[~2024-08-07 22:38 UTC|newest]
Thread overview: 56+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-07 19:48 [PATCH v4 0/7] mm/mprotect: Fix dax puds Peter Xu
2024-08-07 19:48 ` Peter Xu
2024-08-07 19:48 ` [PATCH v4 1/7] mm/dax: Dump start address in fault handler Peter Xu
2024-08-07 19:48 ` Peter Xu
2024-08-07 19:48 ` [PATCH v4 2/7] mm/mprotect: Push mmu notifier to PUDs Peter Xu
2024-08-07 19:48 ` Peter Xu
2024-08-08 15:33 ` Sean Christopherson
2024-08-08 15:33 ` Sean Christopherson
2024-08-08 21:21 ` Peter Xu
2024-08-08 21:21 ` Peter Xu
2024-08-08 21:31 ` Sean Christopherson
2024-08-08 21:31 ` Sean Christopherson
2024-08-08 21:47 ` Peter Xu
2024-08-08 21:47 ` Peter Xu
2024-08-08 22:45 ` Sean Christopherson
2024-08-08 22:45 ` Sean Christopherson
2024-08-07 19:48 ` [PATCH v4 3/7] mm/powerpc: Add missing pud helpers Peter Xu
2024-08-07 19:48 ` Peter Xu
2024-08-07 19:48 ` [PATCH v4 4/7] mm/x86: Make pud_leaf() only care about PSE bit Peter Xu
2024-08-07 19:48 ` Peter Xu
2024-08-07 22:22 ` Thomas Gleixner
2024-08-07 22:22 ` Thomas Gleixner
2024-08-08 14:54 ` Peter Xu
2024-08-08 14:54 ` Peter Xu
2024-08-09 12:08 ` Thomas Gleixner
2024-08-09 12:08 ` Thomas Gleixner
2024-08-09 13:53 ` Peter Xu
2024-08-09 13:53 ` Peter Xu
2024-08-07 19:48 ` [PATCH v4 5/7] mm/x86: arch_check_zapped_pud() Peter Xu
2024-08-07 19:48 ` Peter Xu
2024-08-07 22:28 ` Thomas Gleixner
2024-08-07 22:28 ` Thomas Gleixner
2024-08-08 15:49 ` Peter Xu
2024-08-08 15:49 ` Peter Xu
2024-08-08 20:45 ` David Hildenbrand
2024-08-08 20:45 ` David Hildenbrand
2024-08-07 19:48 ` [PATCH v4 6/7] mm/x86: Add missing pud helpers Peter Xu
2024-08-07 19:48 ` Peter Xu
2024-08-07 22:37 ` Thomas Gleixner [this message]
2024-08-07 22:37 ` Thomas Gleixner
2024-08-08 20:25 ` Peter Xu
2024-08-08 20:25 ` Peter Xu
2024-08-07 19:48 ` [PATCH v4 7/7] mm/mprotect: fix dax pud handlings Peter Xu
2024-08-07 19:48 ` Peter Xu
2024-08-07 21:17 ` [PATCH v4 0/7] mm/mprotect: Fix dax puds Andrew Morton
2024-08-07 21:17 ` Andrew Morton
2024-08-07 21:34 ` Peter Xu
2024-08-07 21:34 ` Peter Xu
2024-08-07 21:44 ` Andrew Morton
2024-08-07 21:44 ` Andrew Morton
2024-08-08 14:34 ` Peter Xu
2024-08-08 14:34 ` Peter Xu
2024-08-07 21:23 ` Andrew Morton
2024-08-07 21:23 ` Andrew Morton
2024-08-07 21:47 ` Peter Xu
2024-08-07 21:47 ` Peter Xu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=875xsc0xjy.ffs@tglx \
--to=tglx@linutronix.de \
--cc=akpm@linux-foundation.org \
--cc=aneesh.kumar@linux.ibm.com \
--cc=bp@alien8.de \
--cc=christophe.leroy@csgroup.eu \
--cc=dan.j.williams@intel.com \
--cc=dave.hansen@linux.intel.com \
--cc=dave.jiang@intel.com \
--cc=david@redhat.com \
--cc=hughd@google.com \
--cc=jthoughton@google.com \
--cc=kirill@shutemov.name \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=mgorman@techsingularity.net \
--cc=mingo@redhat.com \
--cc=npiggin@gmail.com \
--cc=osalvador@suse.de \
--cc=peterx@redhat.com \
--cc=rick.p.edgecombe@intel.com \
--cc=riel@surriel.com \
--cc=vbabka@suse.cz \
--cc=willy@infradead.org \
--cc=x86@kernel.org \
--cc=ying.huang@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.