免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1292 | 回复: 3

[网络子系统] nf_conntrack_set_hashsize [复制链接]

论坛徽章:
5
处女座
日期:2014-10-15 11:57:302015年亚洲杯之中国
日期:2015-03-04 17:05:552015亚冠之西悉尼流浪者
日期:2015-07-31 12:14:2915-16赛季CBA联赛之同曦
日期:2015-12-10 18:14:0615-16赛季CBA联赛之北京
日期:2016-07-07 17:01:53
发表于 2016-08-31 11:15 |显示全部楼层
本帖最后由 zhanglin496 于 2016-08-31 11:20 编辑

int nf_conntrack_set_hashsize(const char *val, struct kernel_param *kp)
{
        int i, bucket, vmalloced, old_vmalloced;
        unsigned int hashsize, old_size;
        struct hlist_nulls_head *hash, *old_hash;
        struct nf_conntrack_tuple_hash *h;
        struct nf_conn *ct;

        if (current->nsproxy->net_ns != &init_net)
                return -EOPNOTSUPP;

        /* On boot, we can set this without any fancy locking. */
        if (!nf_conntrack_htable_size)
                return param_set_uint(val, kp);

        hashsize = simple_strtoul(val, NULL, 0);
        if (!hashsize)
                return -EINVAL;

        hash = nf_ct_alloc_hashtable(&hashsize, &vmalloced, 1);
        if (!hash)
                return -ENOMEM;

        /* Lookups in the old hash might happen in parallel, which means we
         * might get false negatives during connection lookup. New connections
         * created because of a false negative won't make it into the hash
         * though since that required taking the lock.
         */
        spin_lock_bh(&nf_conntrack_lock);
        for (i = 0; i < init_net.ct.htable_size; i++) {
                while (!hlist_nulls_empty(&init_net.ct.hash)) {
                        h = hlist_nulls_entry(init_net.ct.hash.first,
                                        struct nf_conntrack_tuple_hash, hnnode);
                        ct = nf_ct_tuplehash_to_ctrack(h);
                        hlist_nulls_del_rcu(&h->hnnode);
                        bucket = __hash_conntrack(&h->tuple, nf_ct_zone(ct),
                                                  hashsize,
                                                  nf_conntrack_hash_rnd);
                        hlist_nulls_add_head_rcu(&h->hnnode, &hash[bucket]);
                }
        }
        old_size = init_net.ct.htable_size;
        old_vmalloced = init_net.ct.hash_vmalloc;
        old_hash = init_net.ct.hash;

        init_net.ct.htable_size = nf_conntrack_htable_size = hashsize;
        init_net.ct.hash_vmalloc = vmalloced;
        init_net.ct.hash = hash;
        spin_unlock_bh(&nf_conntrack_lock);

        nf_ct_free_hashtable(old_hash, old_vmalloced, old_size);
        return 0;
}
EXPORT_SYMBOL_GPL(nf_conntrack_set_hashsize);

module_param_call(hashsize, nf_conntrack_set_hashsize, param_get_uint,
                  &nf_conntrack_htable_size, 0600);

1、conntrack hash桶可以通过用户命令重新分配,我有个疑问,在老的hash表释放时,如何保证没有其他的路径在引用老的hash表,我看代码迁移完成后直接调用nf_ct_free_hashtable就把老的hash表给释放了,为什么没有调用rcu来同步呢?
2、CPU A调用nf_ct_free_hashtable释放老的hash表时,CPU B正在引用老的hash表,感觉会出问题啊?
3、感觉应该在调用nf_ct_free_hashtable时插入synchronize_rcu, 但实际上没有,why?

论坛徽章:
5
处女座
日期:2014-10-15 11:57:302015年亚洲杯之中国
日期:2015-03-04 17:05:552015亚冠之西悉尼流浪者
日期:2015-07-31 12:14:2915-16赛季CBA联赛之同曦
日期:2015-12-10 18:14:0615-16赛季CBA联赛之北京
日期:2016-07-07 17:01:53
发表于 2016-08-31 11:27 |显示全部楼层
哈哈,好像是内核的BUG,在4.7.4 中修复了,我看了下4.0.5中也应该有这个问题
         synchronize_net();
         nf_ct_free_hashtable(old_hash, old_size);
         return 0;

论坛徽章:
5
处女座
日期:2014-10-15 11:57:302015年亚洲杯之中国
日期:2015-03-04 17:05:552015亚冠之西悉尼流浪者
日期:2015-07-31 12:14:2915-16赛季CBA联赛之同曦
日期:2015-12-10 18:14:0615-16赛季CBA联赛之北京
日期:2016-07-07 17:01:53
发表于 2016-08-31 14:01 |显示全部楼层
查看提交记录,在2016-05-05修复,同时patch也fix了另外一个bug,比如使用了新的hash表,却使用的旧的hash size,
我要是早点发现,说不定能给内核提交个patch,
http://git.kernel.org/cgit/linux ... 4e2c673121028449e35

论坛徽章:
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
发表于 2016-08-31 14:15 |显示全部楼层
的确有点震惊,赞楼上
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP