免费注册 查看新帖 |

Chinaunix

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

请教vfree出错的原因 [复制链接]

论坛徽章:
0
发表于 2011-06-13 14:47 |显示全部楼层
本帖最后由 fly6 于 2011-06-13 15:10 编辑

3.jpg 我改写了流控的sch_tbf.c模块,以支持每IP限速,为了记录下每个IP的令牌使用情况,需要一个数组(>128K),数据结构如下:
struct tbf_node_data
{
        struct sk_buff_head skqueue;

        unsigned long last_time;

        long tokens;
        long up_tokens;

        psched_time_t t_c;
        psched_time_t up_t_c;
};
#define TBF_IP_POOL_SIZE 4096

在tbf_change中,q->varray= vmalloc(sizeof(struct tbf_node_data)*TBF_IP_POOL_SIZE);
在tbf_destroy中,使用vfree(q->varray),此时出错,虽然tbf的主要代码运行在bottom half下,但我用TC删除规则时应该不会在bottom half空间,
请教高手为何会出错

论坛徽章:
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
发表于 2011-06-13 14:57 |显示全部楼层
出错的信息是什么?

论坛徽章:
0
发表于 2011-06-13 15:11 |显示全部楼层
==我打个包

论坛徽章:
0
发表于 2011-06-13 15:12 |显示全部楼层
本帖最后由 fly6 于 2011-06-13 15:18 编辑

==我打个包 tbf.tar.gz (4.67 KB, 下载次数: 39)

论坛徽章:
0
发表于 2011-06-13 15:32 |显示全部楼层
是不是因为在中断的原因呢

论坛徽章:
0
发表于 2011-06-13 16:03 |显示全部楼层
没研究过 tc 和通过何种方法与 kernel 通信的,是 netlink 吗?
如果是,共享区域应该用 _bh 锁

因为 panic 信息不全,所以不是很清楚最后的函数调用栈是怎样的
从感觉上判断,还是锁的问题

论坛徽章:
0
发表于 2011-06-13 16:07 |显示全部楼层
/* Under dev->queue_lock and BH! */
void qdisc_destroy(struct Qdisc *qdisc)
------------------------------------------------------
这个函数运行在软件中断下,所以vfree会出错,但没弄明白为什么这个函数为什么一定要运行在软中断下

论坛徽章:
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
发表于 2011-06-13 18:06 |显示全部楼层
tc 好像用的是 netlink。
我也觉得 LZ 的 vfree 信息不全,会不会你free 的时候,那个指针已经指向别的位置了

论坛徽章:
0
发表于 2011-06-14 08:34 |显示全部楼层
我这里有个测试包,只在initialize中分配,在destroy中释放,就会出错.
原因可能如白金所说TC用的是netlink,接收包时在bh中执行(也就是软中断),所以vfree报错

论坛徽章:
0
发表于 2011-06-14 08:52 |显示全部楼层
我这里有个测试包,只在initialize中分配,在destroy中释放,就会出错.
原因可能如白金所说TC用的是netlin ...
fly6 发表于 2011-06-14 08:34


恩,因为我之前的一个项目里,动态进行 vmalloc 和 vfree 时就会出现问题(bh 环境)
但因为是个全局大 hash,我在整个模块 init 和 destroy 的位置使用就没有问题了

如果可能的话,不妨这样
1、在非 bh 位置尝试使用 v 系列函数
2、在 bh 位置尝试使用 k 系列函数

我对内存管理部分不熟悉,至于 v 系列函数是否真的不能用于 bh 环境,还有待验证

评分

参与人数 1可用积分 +6 收起 理由
Godbach + 6 感谢分享

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP