免费注册 查看新帖 |

Chinaunix

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

[网络子系统] netif_recieve_skb如何保护net_device? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-10-08 15:49 |只看该作者 |倒序浏览
内核版本2.6.32

int netif_receive_skb(struct sk_buff *skb)
{
        struct packet_type *ptype, *pt_prev;
        struct net_device *orig_dev;
        struct net_device *null_or_orig;
        int ret = NET_RX_DROP;
        __be16 type;

        if (!skb->tstamp.tv64)
                net_timestamp(skb);

        if (skb->vlan_tci && vlan_hwaccel_do_receive(skb))
                return NET_RX_SUCCESS;

        /* if we've gotten here through NAPI, check netpoll */
        if (netpoll_receive_skb(skb))
                return NET_RX_DROP;

        if (!skb->iif)
                skb->iif = skb->dev->ifindex; //这里不需要考虑dev的有效性吗

        null_or_orig = NULL;
        orig_dev = skb->dev;
        if (orig_dev->master) {
                if (skb_bond_should_drop(skb))
                        null_or_orig = orig_dev; /* deliver only exact match */
                else
                        skb->dev = orig_dev->master;
        }

        __get_cpu_var(netdev_rx_stat).total++;

        skb_reset_network_header(skb);
        skb_reset_transport_header(skb);
        skb->mac_len = skb->network_header - skb->mac_header;

        pt_prev = NULL;

        rcu_read_lock();
...

linux的报文投递函数netif_receieve_skb函数中,上面注释的地方没有考虑dev的保护问题吗?
比如cpu0的驱动正在投递报文,cpu1因为某种原因,触发了这个dev的unregister操作,最后会释放dev。有可能会导致cpu0访问失效的dev指针了,引起死机?



论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
2 [报告]
发表于 2016-10-10 23:31 |只看该作者
回复 1# zsxwz

你看下有木有引用计数的设置。
既然走到这个函数,外层的各种保护应该已经到位了。

论坛徽章:
0
3 [报告]
发表于 2016-10-11 13:22 |只看该作者
回复 2# Godbach

感觉不像是用引用计数器保护的。
后面有个rcu_read_lock,保护的是ptype链表。

论坛徽章:
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 [报告]
发表于 2016-10-11 21:19 |只看该作者
回复 3# zsxwz
应该是通过rcu来保证,skb->dev 在这个过程中,不会被unregister而导致为null

论坛徽章:
0
5 [报告]
发表于 2016-10-12 11:02 |只看该作者
回复 4# 瀚海书香

        if (!skb->iif)
                skb->iif = skb->dev->ifindex; //这里不需要考虑dev的有效性吗

        null_or_orig = NULL;
        orig_dev = skb->dev;
        if (orig_dev->master) {
                if (skb_bond_should_drop(skb))
                        null_or_orig = orig_dev; /* deliver only exact match */
                else
                        skb->dev = orig_dev->master;
        }

        __get_cpu_var(netdev_rx_stat).total++;

        skb_reset_network_header(skb);
        skb_reset_transport_header(skb);
        skb->mac_len = skb->network_header - skb->mac_header;

        pt_prev = NULL;

        rcu_read_lock();  //这里才开始rcu保护

兄好,看代码里头,后面才开始调用rcu_read_lock(),前面访问skb->dev->ifindex时,还没有进行rcu保护的。


论坛徽章:
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
6 [报告]
发表于 2016-10-12 13:52 |只看该作者
回复 5# zsxwz 我这边看了一下3.10的代码,rcu_read_lock是在前面的



而且后来,又将rcu_read_lock提前了,看一下这个patch,就是解决你提到skb->dev可能被错误释放的问题。


评分

参与人数 1可用积分 +6 收起 理由
Godbach + 6 赞一个!

查看全部评分

论坛徽章:
0
7 [报告]
发表于 2016-10-12 20:05 |只看该作者
回复 6# 瀚海书香

高手啊!太赞了~

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
8 [报告]
发表于 2016-10-17 22:25 |只看该作者
回复 7# zsxwz

赞一下 LZ 钻研问题的能力。虽然最新版被修复了,但是 LZ 确实是以自己的分析,发现了旧版内核的 BUG。

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
9 [报告]
发表于 2016-10-20 19:59 |只看该作者
非常厉害!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP