免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: gqbfree
打印 上一主题 下一主题

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

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
11 [报告]
发表于 2011-04-27 12:03 |只看该作者
回复 10# azzurris


    也就是说,忙等待一定不能被中断,如果这么写就是程序员的错误是吗。。但是我觉得就如我前面说的,自旋锁就算被中断打断也没有什么严重后果吧。。

论坛徽章:
0
12 [报告]
发表于 2011-04-27 12:11 |只看该作者
回复 9# amarant


    我的意思是非SMP环境下且非中断上下文,这个时候你要用spin_lock也可以,但是之前要关中断,这么一来简单点就直接spin_lock_irqsave就ok了。但是您刚才提到的例子里他还要去操作rcu锁,而在这个rcu操作内已经关了中断了,所以后面的自旋锁就不用关本地中断了。

简单的列举一下我的总结,格式比较乱:

                            UP单处理器                                                                                         SMP多处理器

中断上下文             不用自旋锁                                                                                            spin_lock
进程上下文            local_irq_save或spin_lock_irqsave(内核抢占开启的情况)                         spin_lock_irqsave

评分

参与人数 1可用积分 +2 收起 理由
amarant + 2 我很赞同

查看全部评分

论坛徽章:
0
13 [报告]
发表于 2011-04-27 12:14 |只看该作者
回复 11# amarant


    自旋锁被中断打断,就有可能出现两种情况:
1.ISR中未使用自旋锁获取操作受保护数据的权限,那么受保护数据就乱掉了
2.ISR是使用了自旋锁来获取操作受保护数据的权限,那么因为这个权限还在你被中断的自旋锁那里hold着,所以这里就会死锁

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
14 [报告]
发表于 2011-04-27 13:18 |只看该作者
回复 13# azzurris


    我是说如果ISR中不会对保护的数据访问(也不会尝试去获得锁)就如LZ说的情况,那么在进程上下文不关中断直接spin_lock不会有什么问题吧。

(刚睡醒,小憩了下)

论坛徽章:
0
15 [报告]
发表于 2011-04-27 13:37 |只看该作者
我个人感觉是不会有问题。
但这玩意防不胜防啊,你现在是知道ISR不会动到受保护的数据,6个月后修修改改,谁还记得这里不能动那个数据啊。直接用spin_lock_irqsave,简单方便不会给后续代码留漏洞。

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
16 [报告]
发表于 2011-04-27 13:42 |只看该作者
呵呵,受教了!大侠以后多来cu逛逛阿。

论坛徽章:
0
17 [报告]
发表于 2011-04-27 13:44 |只看该作者
这个函数在kernel/rcupreempt.c里面实现为__rcu_read_lock,在该函数内会去关本地中断                local_irq_save(flags);
azzurris 发表于 2011-04-27 12:00


__rcu_read_lock没有这么暴力吧,为什么需要关本地中断呢? 貌似是这样的吧:

  1.         local_irq_save(flags);
  2.         /* some update */
  3.         local_irq_restore(flags);
复制代码

论坛徽章:
0
18 [报告]
发表于 2011-04-27 13:54 |只看该作者
回复 17# kouu


    您贴的代码在这里的含义是。。。

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
19 [报告]
发表于 2011-04-27 14:00 |只看该作者
我这里代码有点不一样
__exit_signal:
        sighand = rcu_dereference(tsk->sighand);
        spin_lock(&sighand->siglock);

但在之前确实关了中断:
release_task:
        write_lock_irq(&tasklist_lock);
        tracehook_finish_release_task(p);
        __exit_signal(p);

论坛徽章:
0
20 [报告]
发表于 2011-04-27 14:06 |只看该作者
我了解了,kouu的意思是关了中断但是最后又打开了中断,所以函数结束后,仍然中断是打开着的。
是我看错了。
我的理解是进程上下文用到spin_lock之前要关本地中断,但amarant举的代码例子里没关,这我现在无法解释了。各位大神发表下意见吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP