免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3759 | 回复: 12

(已解决)对一个主机来说,关闭了主机的硬中断,这个主机的软中断还是有效的吗? [复制链接]

论坛徽章:
0
发表于 2012-02-13 17:12 |显示全部楼层
本帖最后由 yehua911 于 2012-02-14 13:24 编辑

UP 如题

另外,这个问题是否和CPU的结构有关

恳请知道这个问题的人,引出文档或者代码来源

我菜鸟,关于这个概念比较迷糊.谢谢!

论坛徽章:
0
发表于 2012-02-13 17:16 |显示全部楼层
瀚海书香 对 您 说 : 没有硬中断了,哪来的软中断啊。

以上是瀚海大人的答复

~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我的疑问?那为什么linux的内核代码中,还要细分软中断和硬中断呢,求瀚海大人详细指点

论坛徽章:
0
发表于 2012-02-13 17:47 |显示全部楼层
硬中断关闭了CPU响应外部中断能力,所以要求最短时间退出,余下的工作自然交个软中断了。

论坛徽章:
0
发表于 2012-02-13 17:48 |显示全部楼层
再补充下,书上的资料说,软中断是基于CPU调度的,那是不是硬中断关闭以后,软中断的调度,CPU就直接不处理了?

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
发表于 2012-02-13 19:24 |显示全部楼层
这是你自己想的问题还是实际碰到的?如果是关闭了CPU的中断,那么CPU不再响应中断。那么没有定时器中断,你的系统基本就挂在那了。(如果你的是单核的)
LZ可能指的是把外部中断给mask了吧。这样的话,软中断应该是可以被调度的(如果存在的话)。可以看看置顶帖里的讨论

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
发表于 2012-02-14 08:18 |显示全部楼层
回复 2# yehua911
关闭主机的硬中断有两种理解:
1.外部中断接口全部禁掉,那么软中断肯定无效的。
2.内核临时mask硬中断,在这种情况下,软中断还是有效的。以NET_RX_SOFTIRQ为例,开启NAPI模式的时候,网卡说到数据包,然后禁止网卡rx中断,poll接收数据包,并且调用相应的软中断处理数据包。这种情况下,软中断是有效的。

   

论坛徽章:
0
发表于 2012-02-14 09:53 |显示全部楼层
本帖最后由 yehua911 于 2012-02-14 09:56 编辑

回复 5# amarant

  1.     实际遇到的问题,一边是驱动的tx发送函数:

  2. xxx_tx( )
  3. {
  4.     printk("start xxx_tx() spin_lock");
  5.         spin_lock_irqsave(&mac->mac_lock, flags);
  6.         // other code
  7.     printk("xxx_tx() in spin_lock mode ");
  8.         // other code
  9.         spin_unlock_irqrestore(&mac->mac_lock, flags);
  10.     printk("end xxx_tx() spin_lock");
  11. }

  12. 另外一边是netfilter的标准destroy_conntrack(struct nf_conntrack *nfct);
  13. {
  14.         printk("ip conntrack start write_lock_bh ^^^^ \n");

  15.              write_lock_bh(&ip_conntrack_lock);
  16.              // other code
  17.         printk("ip conntrack  ==== in write_lock_bh ==== \n");
  18.              write_unlock_bh(&ip_conntrack_lock);

  19.         printk("ip conntrack end write_unlock_bh VVVV \n");

  20. }
复制代码
实际打印如下:
start xxx_tx() spin_lock
xxx_tx() in spin_lock mode
xxx_tx() in spin_lock mode
xxx_tx() in spin_lock mode
xxx_tx() in spin_lock mode
xxx_tx() in spin_lock mode

Badness in local_bh_enable at kernel/softirq.c:140
Call Trace:
[<8008b844>] local_bh_enable+0x74/0x9c
[<c01f2804>] ag7100_buffer_free+0x0/0xfc [ag7100_mod]
[<80203a74>] destroy_conntrack+0x134/0x178
[<8029f380>] kmem_cache_init+0x294/0x47c
[<8029f380>] kmem_cache_init+0x294/0x47c
[<801aaafc>] __kfree_skb+0xb4/0x130
[<80086654>] printk+0x1c/0x28
[<c01f2a7c>] ag7100_tx_reap+0x17c/0x35c [ag7100_mod]
[<c01f2a7c>] ag7100_tx_reap+0x17c/0x35c [ag7100_mod]
其余无效信息省略

ip conntrack start write_lock_bh ^^^^
ip conntrack  ==== in write_lock_bh ====
ip conntrack end write_unlock_bh VVVV

end xxx_tx() spin_lock

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
以上是大致遇到的一个问题流程,我自己也在持续分析中

论坛徽章:
0
发表于 2012-02-14 10:05 |显示全部楼层
回复 5# amarant


    回复版主,确实是MIPSR2的单核CPU

论坛徽章:
0
发表于 2012-02-14 10:10 |显示全部楼层
软中断softirqs 处于中断的Bottom Halves阶段。

在《linux kernel development》3rd 版本中说到 softirqs执行的地方:
  • In the return from hardware interrupt code path
  • In the ksoftirqd kernel thread
  • In any code that explicitly checks for and executes pending softirqs, such as the networking subsystem


  • 硬中断处理函数调softirqs. (关闭硬中断后,没有硬中断处理函数,此路不通。)
  • 由内核进程ksoftirqd来调softirqs. (关闭硬中断后,没有timer中断,这样不会切换到进程ksoftirqd,此路不通。除非关闭硬中断时的,当前running的进程就是ksoftirqd.)
  • 某些代码直接调用softirqs。(除非关闭硬中断时,正好就处于这种情况,否则此路不通。)

论坛徽章:
0
发表于 2012-02-14 10:50 |显示全部楼层
回复 9# ant艾草


    我这边的环境下,确实一直运行在netfilter子系统下,

    然后,硬件那边tx发送函数接到中断请求后,开启spin_lock_irqsave(&mac->mac_lock, flags);关闭硬件中断

进行数据操作,但是设备在没有启用spin_unlock_irqrestore(&mac->mac_lock, flags);开启硬件中断的时候

进程已经重新切回netfilter子系统.内核版本2.6.15

所以,对这个问题有疑问
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP