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