免费注册 查看新帖 |

Chinaunix

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

[网络子系统] 为什么在ip报文重组的时候要关闭中断? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-05 01:17 |只看该作者 |倒序浏览
2.6.28  nf_defrag_ipv4.c

/* Returns new sk_buff, or NULL */
static int nf_ct_ipv4_gather_frags(struct sk_buff *skb, u_int32_t user)
{
        int err;

        skb_orphan(skb);

        local_bh_disable();
        err = ip_defrag(skb, user);
        local_bh_enable();

        if (!err)
                ip_send_check(ip_hdr(skb));

        return err;
}

这段代码本来就运行在软中断上下文,这里调用local_bh_disable()没看明白,难道有定时器和相关资源互斥?

论坛徽章:
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
2 [报告]
发表于 2013-08-05 08:28 |只看该作者
回复 1# wangjun0629
2.6.28  nf_defrag_ipv4.c

/* Returns new sk_buff, or NULL */
static int nf_ct_ipv4_gather_frags(struct sk_buff *skb, u_int32_t user)
{
        int err;

        skb_orphan(skb);

        local_bh_disable();
        err = ip_defrag(skb, user);
        local_bh_enable();

        if (!err)
                ip_send_check(ip_hdr(skb));

        return err;
}

这段代码本来就运行在软中断上下文,这里调用local_bh_disable()没看明白,难道有定时器和相关资源互斥?


有可能运行在ksoftirqd的进程上下文中,所以需要local_bh_disable()

   

论坛徽章:
0
3 [报告]
发表于 2013-08-05 09:35 |只看该作者
哦,好像你说的是对的,但是如果是这样的话,网络协议栈里面的自旋锁,那不是都应该是 spin_lock_bh() , 但是
我看见链接跟踪的锁只是spin_lock(),没有关闭bh.

论坛徽章:
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
4 [报告]
发表于 2013-08-05 13:22 |只看该作者
回复 3# wangjun0629
哦,好像你说的是对的,但是如果是这样的话,网络协议栈里面的自旋锁,那不是都应该是 spin_lock_bh() , 但是
我看见链接跟踪的锁只是spin_lock(),没有关闭bh.


spin_lock和spin_lock_bh的区别是是否禁止软中断。

你所说的情况下,所包含的代码极可能永远运行在进程上下文中。比如发送数据包的系统调用、添加协议处理代码等等

   

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
5 [报告]
发表于 2013-08-05 14:22 |只看该作者
回复 2# 瀚海书香


    即使是ksoftirqd中软中断函数也应是运行在关闭local软中断下运行的。因为一个软中断函数如果要同时考虑2种情形实在太费事了。
asmlinkage void __do_softirq(void)
{
        struct softirq_action *h;
        __u32 pending;
        int max_restart = MAX_SOFTIRQ_RESTART;
        int cpu;

        pending = local_softirq_pending();

        local_bh_disable();

论坛徽章:
0
6 [报告]
发表于 2013-08-08 01:23 |只看该作者
本帖最后由 wangjun0629 于 2013-08-08 01:29 编辑

回复 4# 瀚海书香
不好意思,后面翻了一下内核的实现,发现内核中都是用的spin_lock_bh(),没有我说的情况。

但有一事不明。

如果资源在netfilter的框架中运行,正常情况下属于软中断。但如果忙的时候,开了softirqd时,处理报文的逻辑就运行在了
进程上下文。 这时就需要考虑软中断和内核线程的互斥。 那岂不是在netfilter框架中,随意加个链表,岂不是每次访问都要加 local_disable_bh().

   

论坛徽章:
0
7 [报告]
发表于 2013-08-08 01:27 |只看该作者
回复 5# smalloc

按照你的讲法,那这段代码就不应该调用  local_bh_disable();这段代码只可能运行在软中断和内核线程。

如果在内核线程,按照你的说法,调用前已经关闭了。


2.6.28  nf_defrag_ipv4.c

/* Returns new sk_buff, or NULL */
static int nf_ct_ipv4_gather_frags(struct sk_buff *skb, u_int32_t user)
{
        int err;

        skb_orphan(skb);

        local_bh_disable();
        err = ip_defrag(skb, user);
        local_bh_enable();

        if (!err)
                ip_send_check(ip_hdr(skb));

        return err;
}



   

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
8 [报告]
发表于 2013-08-08 09:40 |只看该作者
回复 7# wangjun0629


    瞎猜可能是段老代码。BH定义的机制不相同。

论坛徽章:
0
9 [报告]
发表于 2013-08-08 22:54 |只看该作者
求高手回答问题啊~~~~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP