免费注册 查看新帖 |

Chinaunix

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

请教一个同步问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-29 23:45 |只看该作者 |倒序浏览
假设一段内核代码中有一个函数指针的调用,这个函数指针为p,它的初始值为NULL。指针调用的代码类似于:
if (p)
  (p)(.....);
另外有一个内核模块,在插入的时候可以对p进行赋值,卸载的时候可以把p变为NULL。(p已经被EXPORT)
那么在卸载模块的时候,是不是有可能出现这样的问题,即在if(p)的时候p还不是NULL,可接下来真正调用函数的时候p却被赋成NULL了?
那么该怎么解决这个问题呢?

论坛徽章:
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 [报告]
发表于 2008-11-29 23:55 |只看该作者
原帖由 iterator 于 2008-11-29 23:45 发表
假设一段内核代码中有一个函数指针的调用,这个函数指针为p,它的初始值为NULL。指针调用的代码类似于:
if (p)
  (p)(.....);
另外有一个内核模块,在插入的时候可以对p进行赋值,卸载的时候可以把p变为NUL ...


内核中常用引用计数来判断模块的使用状态,也可以考虑用在这个函数指针上。另外,就是使用锁来解决。

论坛徽章:
0
3 [报告]
发表于 2008-11-30 00:23 |只看该作者
假设这个函数是在非常重要的内核路径上呢?换句话说就是在需要被频繁调用的路径上,用引用计数和锁的方式是不是都对性能有影响?怎么能不在if(p)的一端加入任何限制呢?

论坛徽章:
0
4 [报告]
发表于 2008-12-01 09:18 |只看该作者
参考一下bridge的实现

它通过模块的引用计数来控制

论坛徽章:
0
5 [报告]
发表于 2008-12-01 22:52 |只看该作者

回复 #1 iterator 的帖子

首先明确你这个模块运行的环境,insmod, rmmod是进程上下文的,如果你的环境是中断上下文的,都不必担心同步问题,如果也是进程上下文的,是否禁止抢占就可以实现了。

论坛徽章:
0
6 [报告]
发表于 2008-12-05 13:15 |只看该作者
原帖由 lyl19 于 2008-12-1 22:52 发表
首先明确你这个模块运行的环境,insmod, rmmod是进程上下文的,如果你的环境是中断上下文的,都不必担心同步问题,如果也是进程上下文的,是否禁止抢占就可以实现了。


我觉得:
2.4内核中,应该不用考虑这个问题。
2.6内核中,在对P操作时增加preempt_disable/preempt_enable。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP