jrcu: introduce alternate implementation of rcu_cpu
PATCH 9/9 jrcu: introduce alternate implementation of rcu_cpu
jrcu: introduce an alternate implementation of rcu_cpu().
This new implementation is based on smp_processor_id(). It is for those architectures which do not have thread_info->cpu.
(We prefer the thread_info version as it works in early boot where smp_processor_id() has not yet been set up).
Signed-off-by Joe Korty <[email protected]>
kernel/jrcu.c +16 -0
@@ -140,11 +140,27 @@ static u64 rcu_timestamp;* know what that is. For RCU to work correctly, a cpu named '0' must * eventually be present (but need not ever be online). */ +#ifdef HAVE_THREAD_INFO_CPU static inline int rcu_cpu (void ) {return current_thread_info ()->cpu; } +#else + +static unsigned rcu_cpu_early_flag__read_mostly =1 ; + +static inline int rcu_cpu (void ) +{ +if (unlikely (rcu_cpu_early_flag)) { +if (!(rcu_scheduler_active && nr_cpu_ids >1 )) +return 0 ; + rcu_cpu_early_flag =0 ; + } +return raw_smp_processor_id (); +} +#endif /* HAVE_THREAD_INFO_CPU */ +/* * Invoke whenever the calling CPU consents to end-of-batch. All CPUs * must so consent before the batch is truly ended.
arch/x86/include/asm/thread_info.h +1 -0
@@ -29,6 +29,7 @@ struct thread_info {__u32 flags;/* low level flags */ __u32 status;/* thread synchronous flags */ __u32 cpu;/* current CPU */ +#define HAVE_THREAD_INFO_CPU 1int preempt_count;/* 0 => preemptable, <0 => BUG */ mm_segment_t addr_limit;