Skip to content
  • Oleg Nesterov's avatar
    rcu: Create rcu_sync infrastructure · cc44ca84
    Oleg Nesterov authored
    
    
    The rcu_sync infrastructure can be thought of as infrastructure to be
    used to implement reader-writer primitives having extremely lightweight
    readers during times when there are no writers.  The first use is in
    the percpu_rwsem used by the VFS subsystem.
    
    This infrastructure is functionally equivalent to
    
            struct rcu_sync_struct {
                    atomic_t counter;
            };
    
    	/* Check possibility of fast-path read-side operations. */
            static inline bool rcu_sync_is_idle(struct rcu_sync_struct *rss)
            {
                    return atomic_read(&rss->counter) == 0;
            }
    
    	/* Tell readers to use slowpaths. */
            static inline void rcu_sync_enter(struct rcu_sync_struct *rss)
            {
                    atomic_inc(&rss->counter);
                    synchronize_sched();
            }
    
    	/* Allow readers to once again use fastpaths. */
            static inline void rcu_sync_exit(struct rcu_sync_struct *rss)
            {
                    synchronize_sched();
                    atomic_dec(&rss->counter);
            }
    
    The main difference is that it records the state and only calls
    synchronize_sched() if required.  At least some of the calls to
    synchronize_sched() will be optimized away when rcu_sync_enter() and
    rcu_sync_exit() are invoked repeatedly in quick succession.
    
    Signed-off-by: default avatarOleg Nesterov <oleg@redhat.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
    Reviewed-by: default avatarJosh Triplett <josh@joshtriplett.org>
    cc44ca84