免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1383 | 回复: 2
打印 上一主题 下一主题

[内核同步] percpu变量和中断 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-10-10 14:13 |只看该作者 |倒序浏览
看书说per-cpu类型的变量在使用时禁止抢占即可,无需加锁保护,但是如果只是禁止抢占,在使用过程中有中断发生,如果在中断处理程序中使用到了该per-cpu变量不是又出现了竞争么?
这个问题该如何解决?

论坛徽章:
0
2 [报告]
发表于 2015-10-10 14:18 |只看该作者
我的理解是还要看这个变量的用途,如果中断内不会访问那么只禁止抢占就没有问题,如果要用还是要禁掉本地中断的

论坛徽章:
0
3 [报告]
发表于 2015-10-26 17:58 |只看该作者

  1. asmlinkage void __sched schedule(void)
  2. {
  3.         struct task_struct *prev, *next;
  4.         unsigned long *switch_count;
  5.         struct rq *rq;
  6.         int cpu;

  7. need_resched:
  8.         preempt_disable();
  9.         cpu = smp_processor_id();
  10.         rq = cpu_rq(cpu);
  11.         rcu_sched_qs(cpu);
  12.         prev = rq->curr;
  13.         switch_count = &prev->nivcsw;

  14.         release_kernel_lock(prev);
复制代码
这是linux2.6.32的schedule代码,在使用cpu_rq的时候使用了锁,因为在最后release_kernel_lock对内核进行了锁定,只有在获取的了锁的情况下才能进入此段代码,证明per_cpu也是需要锁保护的,如果你是内核的修改者你会用到percpu的锁,如果你只是写驱动,在你驱动中用到了中断访问的percpu那么你就需要重新设计下了,还有你在模块中访问/修改了中断的percpu,那么你需要加锁,而此时中断来了,他获取你加锁的percpu那么就死锁了,所以不要这样的编写代码,因为如果设计不好就死锁了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP