Skip to contentSkip to conversation

jrcu: introduce alternate implementation of rcu_cpu

PATCH In review Joe Korty 1 participant 1 message Mar 14, 2011 x86

lore
Share & tools
lore

Joe Korty

author
#0 lore raw

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).

kernel/jrcu.c +16 -0
Index: b/kernel/jrcu.c
===================================================================
@@ -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
Index: b/arch/x86/include/asm/thread_info.h
===================================================================
@@ -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	1
 	int			preempt_count;	/* 0 => preemptable,
 						   <0 => BUG */
 	mm_segment_t		addr_limit;