From: Hyeonggon Yoo <42.hyeyoo@gmail.com>
To: Dave Hansen <dave.hansen@intel.com>
Cc: Tom Lendacky <thomas.lendacky@amd.com>,
Rick Edgecombe <rick.p.edgecombe@intel.com>,
Dave Hansen <dave.hansen@linux.intel.com>,
Andy Lutomirski <luto@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
Thomas Gleixner <tglx@linutronix.de>,
Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>,
x86@kernel.org, "H. Peter Anvin" <hpa@zytor.com>,
"Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>,
Tianyu Lan <Tianyu.Lan@microsoft.com>,
"Aneesh Kumar K.V" <aneesh.kumar@linux.ibm.com>,
linux-kernel@vger.kernel.org, linux-mm@kvack.org, vbabka@suse.cz,
akpm@linux-foundation.org, mgorman@techsingularity.net,
willy@infradead.org
Subject: Is _PAGE_PROTNONE set only for user mappings?
Date: Wed, 11 May 2022 14:20:45 +0900 [thread overview]
Message-ID: <YntHrTX12TGp35aF@hyeyoo> (raw)
In-Reply-To: <8c2735ac-0335-6e2a-8341-8266d5d13c30@intel.com>
On Tue, May 10, 2022 at 07:39:30AM -0700, Dave Hansen wrote:
> On 5/10/22 06:35, Tom Lendacky wrote:
> > I'm wondering if adding a specific helper that takes a boolean to
> > indicate whether to set the global flag would be best. I'll let some of
> > the MM maintainers comment about that.
>
> First of all, I'm not positive that _PAGE_BIT_PROTNONE is ever used for
> kernel mappings. This would all get a lot easier if we decided that
> _PAGE_BIT_PROTNONE is only for userspace mappings and we don't have to
> worry about it when _PAGE_USER is clear.
After quickly skimming code it seems the place that actually sets _PAGE_PROTNONE
is via mm/mmap.c's protection_map:
> /* description of effects of mapping type and prot in current implementation.
> * this is due to the limited x86 page protection hardware. The expected
> * behavior is in parens:
> *
> * map_type prot
> * PROT_NONE PROT_READ PROT_WRITE PROT_EXEC
> * MAP_SHARED r: (no) no r: (yes) yes r: (no) yes r: (no) yes
> * w: (no) no w: (no) no w: (yes) yes w: (no) no
> * x: (no) no x: (no) yes x: (no) yes x: (yes) yes
> *
> * MAP_PRIVATE r: (no) no r: (yes) yes r: (no) yes r: (no) yes
> * w: (no) no w: (no) no w: (copy) copy w: (no) no
> * x: (no) no x: (no) yes x: (no) yes x: (yes) yes
> *
> */
> pgprot_t protection_map[16] = {
> __P000, __P001, __P010, __P011, __P100, __P101, __P110, __P111,
> __S000, __S001, __S010, __S011, __S100, __S101, __S110, __S111
> };
Where __P000, __S000 is PAGE_NONE (_PAGE_ACCESSED | _PAGE_PROTNONE).
And protection_map is accessed via:
> pgprot_t vm_get_page_prot(unsigned long vm_flags)
> {
> pgprot_t ret = __pgprot(pgprot_val(protection_map[vm_flags &
> (VM_READ|VM_WRITE|VM_EXEC|VM_SHARED)]) |
> pgprot_val(arch_vm_get_page_prot(vm_flags)));
>
> return arch_filter_pgprot(ret);
> }
> EXPORT_SYMBOL(vm_get_page_prot);
I guess it's only set for processes' VMA if no caller is abusing
vm_get_page_prot() for kernel mappings.
But yeah, just quick guessing does not make us convinced.
Let's Cc people working on mm.
If kernel never uses _PAGE_PROTNONE for kernel mappings, it's just okay
not to clear _PAGE_GLOBAL at first in __change_page_attr() if it's not user address,
because no user will confuse _PAGE_GLOBAL as _PAGE_PROTNONE if it's kernel
address. right?
>
> Second, the number of places that do these
> __set_pages_p()/__set_pages_np() pairs is pretty limited. Some of them
> are *quite* unambiguous over whether they are dealing with the direct map:
>
> > int set_direct_map_invalid_noflush(struct page *page)
> > {
> > return __set_pages_np(page, 1);
> > }
> >
> > int set_direct_map_default_noflush(struct page *page)
> > {
> > return __set_pages_p(page, 1);
> > }
>
> which would make it patently obvious whether __set_pages_p() should
> restore the global bit. That would have been a problem in the "old" PTI
> days where _some_ of the direct map was exposed to Meltdown. I don't
> think we have any of those mappings left, though. They're all aliases
> like text and cpu_entry_area.
>
> It would be nice if someone could look into unraveling
> _PAGE_BIT_PROTNONE. We could even probably move it to another bit for
> kernel mappings if we actually need it (I'm not convinced we do).
--
Thanks,
Hyeonggon
next prev parent reply other threads:[~2022-05-11 5:20 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-06 5:19 [PATCH] x86/mm/cpa: set PAGE_KERNEL in __set_pages_p() Hyeonggon Yoo
2022-05-09 16:06 ` Tom Lendacky
2022-05-10 11:57 ` Hyeonggon Yoo
2022-05-10 13:35 ` Tom Lendacky
2022-05-10 14:39 ` Dave Hansen
2022-05-11 5:20 ` Hyeonggon Yoo [this message]
2022-05-12 10:37 ` Is _PAGE_PROTNONE set only for user mappings? Mel Gorman
2022-05-13 5:33 ` Hyeonggon Yoo
2022-05-16 13:03 ` Mel Gorman
2022-05-16 14:04 ` Dave Hansen
2022-05-22 3:56 ` Hyeonggon Yoo
2022-05-24 20:22 ` Sean Christopherson
2022-05-26 10:33 ` Hyeonggon Yoo
2022-05-29 10:32 ` Hyeonggon Yoo
2022-06-02 16:47 ` Dave Hansen
2022-05-10 0:47 ` [PATCH] x86/mm/cpa: set PAGE_KERNEL in __set_pages_p() Edgecombe, Rick P
2022-05-10 11:50 ` Hyeonggon Yoo
2022-05-10 15:38 ` Edgecombe, Rick P
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=YntHrTX12TGp35aF@hyeyoo \
--to=42.hyeyoo@gmail.com \
--cc=Tianyu.Lan@microsoft.com \
--cc=akpm@linux-foundation.org \
--cc=aneesh.kumar@linux.ibm.com \
--cc=bp@alien8.de \
--cc=dave.hansen@intel.com \
--cc=dave.hansen@linux.intel.com \
--cc=hpa@zytor.com \
--cc=kirill.shutemov@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=luto@kernel.org \
--cc=mgorman@techsingularity.net \
--cc=mingo@redhat.com \
--cc=peterz@infradead.org \
--cc=rick.p.edgecombe@intel.com \
--cc=tglx@linutronix.de \
--cc=thomas.lendacky@amd.com \
--cc=vbabka@suse.cz \
--cc=willy@infradead.org \
--cc=x86@kernel.org \
/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.