On Fri, 2018-08-31 at 07:47 -0700, Dave Hansen wrote: > 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. I created the test, https://github.com/yyu168/cet-smoke-test/blob/quick/quick/mprotect_ben ch.c then realized this won't work. To trigger a race in ptep_set_wrprotect(), we need to fork from one of three pthread siblings. Or do we measure only how much this affects fork? If there is no racing, the effect should be minimal. Yu-cheng