On 08/31/2018 07:33 AM, Yu-cheng Yu wrote: > Please use the form: > > pte_t new_pte, pte = READ_ONCE(*ptep); > do { > new_pte = /* ... */; > } while (!try_cmpxchg(ptep, &pte, new_pte); It's probably also worth doing some testing to see if you can detect the cost of the cmpxchg. It's definitely more than the old code. A loop that does mprotect(PROT_READ) followed by mprotect(PROT_READ|PROT_WRITE) should do it.