- 论坛徽章:
- 0
|
- asmlinkage void __sched schedule(void)
- {
- struct task_struct *prev, *next;
- unsigned long *switch_count;
- struct rq *rq;
- int cpu;
- need_resched:
- preempt_disable();
- cpu = smp_processor_id();
- rq = cpu_rq(cpu);
- rcu_sched_qs(cpu);
- prev = rq->curr;
- switch_count = &prev->nivcsw;
- release_kernel_lock(prev);
复制代码 这是linux2.6.32的schedule代码,在使用cpu_rq的时候使用了锁,因为在最后release_kernel_lock对内核进行了锁定,只有在获取的了锁的情况下才能进入此段代码,证明per_cpu也是需要锁保护的,如果你是内核的修改者你会用到percpu的锁,如果你只是写驱动,在你驱动中用到了中断访问的percpu那么你就需要重新设计下了,还有你在模块中访问/修改了中断的percpu,那么你需要加锁,而此时中断来了,他获取你加锁的percpu那么就死锁了,所以不要这样的编写代码,因为如果设计不好就死锁了。 |
|