Hi Paul, I have a side question out of curiosity:
How does synchronize_sched() work properly for sys_membarrier()? sys_membarrier() requires every other CPU does a smp_mb() before it returns, and I know synchronize_sched() will wait until all CPUs running a kernel thread do a context-switch, which has a smp_mb(). However, I believe sched flavor RCU treat CPU running a user thread as a quiesent state, so synchronize_sched() could return without that CPU does a context switch. So why could we use synchronize_sched() for sys_membarrier()? In particular, could the following happens? CPU 0: CPU 1: ========================= ========================== <in user space> <in user space> {read Y}(reordered) <------------------------------+ store Y; | read X; --------------------------------------+ | sys_membarrier(): <timer interrupt> | | synchronize_sched(); update_process_times(user): //user == true | | rcu_check_callbacks(usr): | | if (user || ..) { | | rcu_sched_qs() | | ... | | <report quesient state in softirq> | | <return to user space> | | read Y; --------------------------------------+----+ store X; | {read X}(reordered) <-------------------------+ I assume the timer interrupt handler, which interrupts a user space and reports a quiesent state for sched flavor RCU, may not have a smp_mb() in some code path. I may miss something subtle, but it just not very obvious how synchronize_sched() will guarantee a remote CPU running in userspace to do a smp_mb() before it returns, this is at least not in RCU requirements, right? Regards, Boqun
signature.asc
Description: PGP signature