免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-20 00:56 |只看该作者 |正序浏览
尝试用spin_lock_irqsave(),发现没有禁掉时钟中断,不知道我哪里理解错了?
kernel版本:

  1. uname -a 结果:

  2. Linux localhost.localdomain 2.6.18 #1 Sat Jul 19 13:06:00 EDT 2008 i686 i686 i386 GNU/Linux
复制代码


我的代码:

  1. #include <linux/kernel.h>
  2. #include <linux/init.h>
  3. #include <linux/module.h>
  4. #include <linux/spinlock.h>

  5. static spinlock_t my_spinlock;

  6. static int __init init_test()
  7. {
  8.         unsigned long flags;

  9.         spin_lock_init(&my_spinlock);

  10.         spin_lock_irqsave(&my_spinlock, flags);
  11.         return 0;
  12. }

  13. static void __exit init_exit()
  14. {
  15.         return;
  16. }

  17. module_init(init_test);
  18. module_exit(init_exit);
复制代码


加载module以后,通过这样的命令查看墙上时钟:

  1. #date; sleep 2; date

  2. 输出结果:
  3. Sun Apr 19 12:59:42 EDT 2009
  4. Sun Apr 19 12:59:44 EDT 2009
复制代码

墙上时钟仍然在变化,说明时钟中断没有被禁掉。
但我理解的spin_lock_irqsave()会通过cli关掉所有IRQ,并且我在module中也没有spin_unlock_irqrestore(),所以按理说在加载了这个module之后,系统就不会响应任何外部可屏蔽中断了。但实际结果却不是这样。

我哪里理解错了呢?请各位指点,多谢!

[ 本帖最后由 new_learner 于 2009-4-20 01:03 编辑 ]

论坛徽章:
0
54 [报告]
发表于 2009-11-09 17:30 |只看该作者

回复 #35 wxc200 的帖子

make

论坛徽章:
0
53 [报告]
发表于 2009-05-04 08:45 |只看该作者
原帖由 new_learner 于 2009-4-27 14:56 发表

看了下你的帖子,有一点不太明白,请指教


这里,"schedule()会打开中断"是什么意思?
你是指这段代码吗?,在schedule()中, 我的内核版本是2.6.18

        if (likely(prev != next)) {
                next->timestamp ...

可能看得代码版本不一致吧.我再仔细确认下schedule(),呵呵

从测试情况看,禁中断再调schedule(),会把中断又打开了   我是这么理解的

论坛徽章:
0
52 [报告]
发表于 2009-04-30 14:26 |只看该作者

回复 #51 new_learner 的帖子

恩,再仔细看了那个帖子,情况真的与我的不一样,多谢提醒!
现在我在中断处理函数里加上一个“下半部”,没有用任何锁,每次中断就就只要一个cpu响应了。虽然问题解决了,但原因还是不清楚啊。

论坛徽章:
0
51 [报告]
发表于 2009-04-29 16:07 |只看该作者
原帖由 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


看了一下这个帖子,那里说的情况应该跟你的情况是不一样的。

你的情况是:同一个中断(同一次中断)被route到了两个cpu,两个cpu同时去运行这次中断处理函数。这里外设只产生了一次中断。

而那个帖子的意思是:第一次中断处理程序被cpu A运行的同时,外设又产生了同样的中断,然后被route到cpu B了。这里外设产生了两次中断。

论坛徽章:
0
50 [报告]
发表于 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

学习了~

论坛徽章:
0
49 [报告]
发表于 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
48 [报告]
发表于 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
47 [报告]
发表于 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
46 [报告]
发表于 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 编辑 ]
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP