您的位置:首页 > 其它

get_cpu()/put_cpu()函数对

2017-05-23 12:05 344 查看
功能:通过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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: