On Wed, 4 Apr 2018, Nadav Amit wrote: > Dave Hansen <dave.hansen@xxxxxxxxxxxxxxx> wrote: > > On 04/03/2018 09:45 PM, Nadav Amit wrote: > >> Dave Hansen <dave.hansen@xxxxxxxxxxxxxxx> wrote: > >>> void cea_set_pte(void *cea_vaddr, phys_addr_t pa, pgprot_t flags) > >>> { > >>> unsigned long va = (unsigned long) cea_vaddr; > >>> + pte_t pte = pfn_pte(pa >> PAGE_SHIFT, flags); > >>> > >>> - set_pte_vaddr(va, pfn_pte(pa >> PAGE_SHIFT, flags)); > >>> + /* > >>> + * The cpu_entry_area is shared between the user and kernel > >>> + * page tables. All of its ptes can safely be global. > >>> + */ > >>> + if (boot_cpu_has(X86_FEATURE_PGE)) > >>> + pte = pte_set_flags(pte, _PAGE_GLOBAL); > >> > >> I think it would be safer to check that the PTE is indeed present before > >> setting _PAGE_GLOBAL. For example, percpu_setup_debug_store() sets PAGE_NONE > >> for non-present entries. In this case, since PAGE_NONE and PAGE_GLOBAL use > >> the same bit, everything would be fine, but it might cause bugs one day. > > > > That's a reasonable safety thing to add, I think. > > > > But, looking at it, I am wondering why we did this in > > percpu_setup_debug_store(): > > > > for (; npages; npages--, cea += PAGE_SIZE) > > cea_set_pte(cea, 0, PAGE_NONE); > > > > Did we really want that to be PAGE_NONE, or was it supposed to create a > > PTE that returns true for pte_none()? > > I yield it to others to answer... My bad. I should have used pgprot(0). Thanks, tglx