1 /* 2 * lib/smp_processor_id.c 3 * 4 * DEBUG_PREEMPT variant of smp_processor_id(). 5 */ 6 #include <linux/export.h> 7 #include <linux/kallsyms.h> 8 #include <linux/sched.h> 9 10 notrace unsigned int debug_smp_processor_id(void) 11 { 12 int this_cpu = raw_smp_processor_id(); 13 14 if (likely(preempt_count())) 15 goto out; 16 17 if (irqs_disabled()) 18 goto out; 19 20 /* 21 * Kernel threads bound to a single CPU can safely use 22 * smp_processor_id(): 23 */ 24 if (cpumask_equal(tsk_cpus_allowed(current), cpumask_of(this_cpu))) 25 goto out; 26 27 /* 28 * It is valid to assume CPU-locality during early bootup: 29 */ 30 if (system_state != SYSTEM_RUNNING) 31 goto out; 32 33 /* 34 * Avoid recursion: 35 */ 36 preempt_disable_notrace(); 37 38 if (!printk_ratelimit()) 39 goto out_enable; 40 41 printk(KERN_ERR "BUG: using smp_processor_id() in preemptible [%08x] " 42 "code: %s/%d\n", 43 preempt_count() - 1, current->comm, current->pid); 44 print_symbol("caller is %s\n", (long)__builtin_return_address(0)); 45 dump_stack(); 46 47 out_enable: 48 preempt_enable_no_resched_notrace(); 49 out: 50 return this_cpu; 51 } 52 53 EXPORT_SYMBOL(debug_smp_processor_id); 54 55