• Paul E. McKenney's avatar
    rcutorture: Add trivial RCU implementation · c682db55
    Paul E. McKenney authored
    I have been showing off a trivial RCU implementation for non-preemptive
    environments for some time now:
    
    	#define rcu_read_lock()
    	#define rcu_read_unlock()
    	#define rcu_dereference(p) READ_ONCE(p)
    	#define rcu_assign_pointer(p, v) smp_store_release(&(p), (v))
    	void synchronize_rcu(void)
    	{
    	int cpu;
    		for_each_online_cpu(cpu)
    			sched_setaffinity(current->pid, cpumask_of(cpu));
    	}
    
    Trivial or not, as the old saying goes, "if it ain't tested, it don't
    work!".  This commit therefore adds a "trivial" flavor to rcutorture
    and a corresponding TRIVIAL test scenario.  This variant does not handle
    CPU hotplug, which is unconditionally enabled on x86 for post-v5.1-rc3
    kernels, which is why the TRIVIAL.boot says "rcutorture.onoff_interval=0".
    This commit actually does handle CONFIG_PREEMPT=y kernels, but only
    because it turns back the Linux-kernel clock in order to provide these
    alternative definitions (or the moral equivalent thereof):
    
    	#define rcu_read_lock() preempt_disable()
    	#define rcu_read_unlock() preempt_enable()
    
    In CONFIG_PREEMPT=n kernels without debugging, these are equivalent to
    empty macros give or take a compiler barrier.  However, the have been
    successfully tested with actual empty macros as well.
    Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.ibm.com>
    [ paulmck: Fix symbol issue reported by kbuild test robot <lkp@intel.com>. ]
    [ paulmck: Work around sched_setaffinity() issue noted by Andrea Parri. ]
    [ paulmck: Add rcutorture.shuffle_interval=0 to TRIVIAL.boot to fix
      interaction with shuffler task noted by Peter Zijlstra. ]
    Tested-by: default avatarAndrea Parri <andrea.parri@amarulasolutions.com>
    c682db55
rcu.h 15.9 KB