On Mon, 2019-09-23 at 12:58 -0700, John Hubbard wrote: > > CPU 0 CPU 1 > ------ -------------- > READ(pte) (re-ordered at run time) > atomic_inc(val) (no run-time memory barrier!) > > pmd_clear(pte) > if (val) > run_on_all_cpus(): IPI > local_irq_disable() (also not a mem barrier) > > if(pte) > walk page tables Let me see if I can understand, On most patches, it would be: CPU 0 CPU 1 ------ -------------- ptep = __find_linux_pte (re-ordered at run time) atomic_inc(val) pmd_clear(pte) smp_mb() if (val) run_on_all_cpus(): IPI local_irq_disable() if(ptep) pte = *ptep; Is that what you meant?