On Tue, 2022-06-14 at 15:53 +0900, Hyeonggon Yoo wrote: > On Tue, Jun 14, 2022 at 03:39:33PM +0900, Hyeonggon Yoo wrote: > > commit a8aed3e0752b4 ("x86/mm/pageattr: Prevent PSE and GLOABL > > leftovers > > to confuse pmd/pte_present and pmd_huge") made CPA clear > > _PAGE_GLOBAL when > > _PAGE_PRESENT is not set. This prevents kernel crashing when kernel > > reads > > a page with !_PAGE_PRESENT and _PAGE_PROTNONE (_PAGE_GLOBAL). And > > then it > > set _PAGE_GLOBAL back when setting _PAGE_PRESENT again. > > > > After commit d1440b23c922d ("x86/mm: Factor out pageattr > > _PAGE_GLOBAL > > setting") made kernel not set unconditionally _PAGE_GLOBAL, pages > > lose > > global flag after _set_pages_np() and _set_pages_p() are called. > > > > But after commit 3166851142411 ("x86: skip check for spurious > > faults for > > non-present faults"), spurious_kernel_fault() does not confuse > > pte/pmd entries with _PAGE_PROTNONE as present anymore. So simply > > drop pgprot_clear_protnone_bits(). > > > Looks like I forgot to Cc: Andrea Arcangeli <aarcange@xxxxxxxxxx> > > Plus I did check that kernel does not crash when reading from/writing > to > non-present pages with this patch applied. Thanks for the history. I think we should still fix pte_present() to not check prot_none if the user bit is clear. The spurious fault handler infinite loop may no longer be a problem, but pte_present() still would return true for kernel NP pages, so be fragile. Today I see at least the oops message and memory hotunplug (see remove_pagetable()) that would get confused.