免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: new_learner

为什么我的spin_lock_irqsave()没有锁住时钟中断? [复制链接]

论坛徽章:
0
发表于 2009-04-27 16:08 |显示全部楼层
原帖由 liuweni 于 2009-4-27 16:05 发表
请问楼主你的spin_lock_irqsave(&my_spinlock, flags);究竟锁住的是什么资源呢??CPU??timer??

什么资源都没锁,仅仅是把中断禁了。。。。
做个小实验而已。。。

论坛徽章:
0
发表于 2009-04-27 16:20 |显示全部楼层
你写的代码禁用了中断,那么是否有这么一种情况:内核依然会继续执行,只是没有了抢占,在之后的内核执行过程中某一段代码再次将打开中断的。

论坛徽章:
0
发表于 2009-04-27 16:23 |显示全部楼层
原帖由 liuweni 于 2009-4-27 16:20 发表
你写的代码禁用了中断,那么是否有这么一种情况:内核依然会继续执行,只是没有了抢占,在之后的内核执行过程中某一段代码再次将打开中断的。

19楼已经给出了答案

论坛徽章:
0
发表于 2009-04-27 16:33 |显示全部楼层
module加载的过程没研究……

论坛徽章:
0
发表于 2009-04-27 16:39 |显示全部楼层
原帖由 liuweni 于 2009-4-27 16:33 发表
module加载的过程没研究……

跟module加载过程无关
而是X86中对待exception处理的原因(具体到这里就是0x80异常)

论坛徽章:
0
发表于 2009-04-28 19:17 |显示全部楼层
那么对于多处理器系统,如果我只想让其中一个cpu响应外设中断,该如何屏蔽另一个cpu呢?
我遇到一个问题,在驱动模块中触发中断后,总是两个cpu同时响应这个中断,就等于中断处理函数被执行了两次,而我只需要执行一次就可以了。尝试过在中断处理函数中使用spin_lock_irqsave,但中断就有点乱了,有时候是cpu0执行,有时候是cpu1执行,甚至有时候cpu0执行两次。我的内核是:2.6.27.7-9

[ 本帖最后由 sam58123 于 2009-4-28 19:34 编辑 ]

论坛徽章:
0
发表于 2009-04-29 00:45 |显示全部楼层
原帖由 sam58123 于 2009-4-28 19:17 发表
那么对于多处理器系统,如果我只想让其中一个cpu响应外设中断,该如何屏蔽另一个cpu呢?
我遇到一个问题,在驱动模块中触发中断后,总是两个cpu同时响应这个中断,就等于中断处理函数被执行了两次,而我只需要执行一次就可以了。尝试过在中断处理函数中使用spin_lock_irqsave,但中断就有点乱了,有时候是cpu0执行,有时候是cpu1执行,甚至有时候cpu0执行两次。我的内核是:2.6.27.7-9

X86中,外部中断经过APIC分发以后,应该只有一个cpu会去处理某个中断吧。
可能这个问题还是需要找到root cause:为什么两个cpu会同时响应一个中断?

论坛徽章:
0
发表于 2009-04-29 09:42 |显示全部楼层

回复 #47 new_learner 的帖子

http://linux.chinaunix.net/bbs/viewthread.php?tid=988356  我看到本论坛也有人讨论类似的问题。
"在SMP情况,其它CPU的中断不是关闭的,当IOAPIC轮询到没有被mask的这条线时,可能再产生一个中断并route到其它CPU,这个时候另一个CPU就会产生一个PENDING。" 但他说的是在老版本的linux才有该问题。 我的外设使用的是INTx类型的中断,不是SMI

论坛徽章:
0
发表于 2009-04-29 14:23 |显示全部楼层
原帖由 sam58123 于 2009-4-28 19:17 发表
那么对于多处理器系统,如果我只想让其中一个cpu响应外设中断,该如何屏蔽另一个cpu呢?
我遇到一个问题,在驱动模块中触发中断后,总是两个cpu同时响应这个中断,就等于中断处理函数被执行了两次,而我只需要执行一次就可以了。尝试过在中断处理函数中使用spin_lock_irqsave,但中断就有点乱了,有时候是cpu0执行,有时候是cpu1执行,甚至有时候cpu0执行两次。我的内核是:2.6.27.7-9


如果是这样的话,那实际上两个处理器还是会执行中断处理函数啊。
你在这里只是用同一个spinlock来防止两个cpu同时运行中断处理函数而已。。。一旦一个cpu执行完了spinlock保护的区域,执行spin_unlock_irqrestore以后,另一个cpu也会进到临界区中运行这个中断处理函数。

试试用spin_trylock_irq()呢? 如果try failed,那么中断处理函数就直接return。这样应该能确保只有一个cpu会运行中断处理函数吧。。。

以上只是我自己的理解,可能有问题,你可以试一下。
可能还需要考虑同一个中断route到两个cpu时的时间差之类的情况。。。

论坛徽章:
0
发表于 2009-04-29 14:25 |显示全部楼层
原帖由 sam58123 于 2009-4-29 09:42 发表 http://linux.chinaunix.net/bbs/viewthread.php?tid=988356  我看到本论坛也有人讨论类似的问题。
"在SMP情况,其它CPU的中断不是关闭的,当IOAPIC轮询到没有被mask的这条线时,可能再产生一个中断并route到其它CPU,这个时候另一个CPU就会产生一个PENDING。" 但他说的是在老版本的linux才有该问题。 我的外设使用的是INTx类型的中断,不是SMI

学习了~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP