功能:通过get_cpu()/put_cpu()函数禁止/启用任务的抢占,获取cpu id
kernel中的解释:
/*
* Even if we don’t have any preemption, we need preempt disable/enable
* to be barriers, so that we don’t have things like get_user/put_user
* that can cause faults and scheduling migrate into our preempt-protected
* region.
*/
即使当前没有任何的抢占,我们也需要对抢占进行disable/enable,这样的话就不会向get_user/put_user那样导致错误迁移进我们对抢占进行保护的区域。
1.get_cpu() :禁止任务抢占
#define get_cpu() ({ preempt_disable(); smp_processor_id(); })
#define smp_processor_id() raw_smp_processor_id()
2.put_cpu() : 启用任务抢占
#define put_cpu() preempt_enable()
例子:
get_cpu();
on_each_cpu(setup_broadcast_timer, (void *)true, 1);
put_cpu();
#define on_each_cpu(func,info,retry,wait) ({ local_irq_disable(); func(info); local_irq_enable(); 0; })
static void setup_broadcast_timer(void *arg)
{
unsigned long reason = (unsigned long)arg;
int cpu = raw_smp_processor_id();
reason = reason ?
CLOCK_EVT_NOTIFY_BROADCAST_ON : CLOCK_EVT_NOTIFY_BROADCAST_OFF;
clockevents_notify(reason, &cpu);
}