diff options
Diffstat (limited to 'lib/smp_processor_id.c')
| -rw-r--r-- | lib/smp_processor_id.c | 21 | 
1 files changed, 15 insertions, 6 deletions
diff --git a/lib/smp_processor_id.c b/lib/smp_processor_id.c index 4c0d0e51d49..1afec32de6f 100644 --- a/lib/smp_processor_id.c +++ b/lib/smp_processor_id.c @@ -7,12 +7,12 @@  #include <linux/kallsyms.h>  #include <linux/sched.h> -notrace unsigned int debug_smp_processor_id(void) +notrace static unsigned int check_preemption_disabled(const char *what1, +							const char *what2)  { -	unsigned long preempt_count = preempt_count();  	int this_cpu = raw_smp_processor_id(); -	if (likely(preempt_count)) +	if (likely(preempt_count()))  		goto out;  	if (irqs_disabled()) @@ -39,9 +39,9 @@ notrace unsigned int debug_smp_processor_id(void)  	if (!printk_ratelimit())  		goto out_enable; -	printk(KERN_ERR "BUG: using smp_processor_id() in preemptible [%08x] " -			"code: %s/%d\n", -			preempt_count() - 1, current->comm, current->pid); +	printk(KERN_ERR "BUG: using %s%s() in preemptible [%08x] code: %s/%d\n", +		what1, what2, preempt_count() - 1, current->comm, current->pid); +  	print_symbol("caller is %s\n", (long)__builtin_return_address(0));  	dump_stack(); @@ -51,5 +51,14 @@ out:  	return this_cpu;  } +notrace unsigned int debug_smp_processor_id(void) +{ +	return check_preemption_disabled("smp_processor_id", ""); +}  EXPORT_SYMBOL(debug_smp_processor_id); +notrace void __this_cpu_preempt_check(const char *op) +{ +	check_preemption_disabled("__this_cpu_", op); +} +EXPORT_SYMBOL(__this_cpu_preempt_check);  | 
