免费注册 查看新帖 |

Chinaunix

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

[内核同步] 我有一个问题 [复制链接]

论坛徽章:
1
lufei
日期:2016-06-17 17:49:16
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-04 12:43 |只看该作者 |倒序浏览
这是内核3.6.2里面的一个函数。这里面一下搞三个锁,是为什么?我觉得2个就可以搞定啊。if 里面的不可以合成一个吗?各种锁谁有示例代码啊?感觉内核里面各种锁用的很混乱啊,可能是我不太明白{:3_190:} 。什么锁该怎么用,怎么混用完全不明白啊。求教,谢了先。
static int adb_release(struct inode *inode, struct file *file)
{
        struct adbdev_state *state = file->private_data;
        unsigned long flags;

        mutex_lock(&adb_mutex);
        if (state) {
                file->private_data = NULL;
                spin_lock_irqsave(&state->lock, flags);
                if (atomic_read(&state->n_pending) == 0
                    && state->completed == NULL) {
                        spin_unlock_irqrestore(&state->lock, flags);
                        kfree(state);
                } else {
                        state->inuse = 0;
                        spin_unlock_irqrestore(&state->lock, flags);
                }
        }
        mutex_unlock(&adb_mutex);
        return 0;
}

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
2 [报告]
发表于 2014-08-04 14:18 |只看该作者
常用的就这么几种内核同步机制,除了读写锁之外(读写锁有很多变种,特别是rcu),其他的直接看看源码实现,你就懂了
书上说的很明白,对着书看源码

自旋锁
原子变量
per-cpu
信号量
互斥量
读写锁


论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
3 [报告]
发表于 2014-08-04 15:13 |只看该作者
要保护的临界资源不同,所以用不同的锁。

论坛徽章:
1
lufei
日期:2016-06-17 17:49:16
4 [报告]
发表于 2014-08-04 15:21 |只看该作者
嗯,我看看具体是怎么玩的。回复 2# super皮波


   

论坛徽章:
1
lufei
日期:2016-06-17 17:49:16
5 [报告]
发表于 2014-08-04 15:26 |只看该作者
mutex_lock(&adb_mutex);
        if (state) {难道这个互斥只保证在if检查通过后不出现state为空的情况,而不同步这个地址的内容?是这样吗?那既然进了这个锁,怎么调度的时候会出现需要另外的spin来保护的情况呢?
humjb_1983 发表于 2014-08-04 15:13
要保护的临界资源不同,所以用不同的锁。

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
6 [报告]
发表于 2014-08-04 16:25 |只看该作者
mutex_lock(&adb_mutex);--锁对象是adb_mutex
spin_lock_irqsave(&state->lock, flags)--所对象是&state->lock
要保护的对象是不同的

论坛徽章:
1
lufei
日期:2016-06-17 17:49:16
7 [报告]
发表于 2014-08-04 17:29 |只看该作者
麻烦再问下:mutex_lock(&adb_mutex);
        if (state) {
                file->private_data = NULL;
                spin_lock_irqsave(&state->lock, flags);
                if (atomic_read(&state->n_pending) == 0
                    ..........................
                } else {
                        state->inuse = 0;
                        spin_unlock_irqrestore(&state->lock, flags);
                }
        }
        mutex_unlock(&adb_mutex);这里的mutex难道不足以保护state->inuse而需要另加spin,我不明白为什么是这样{:3_186:} 。
humjb_1983 发表于 2014-08-04 16:25
mutex_lock(&adb_mutex);--锁对象是adb_mutex
spin_lock_irqsave(&state->lock, flags)--所对象是&state-> ...

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
8 [报告]
发表于 2014-08-04 18:34 |只看该作者
adidiaos丶丶 发表于 2014-08-04 17:29
麻烦再问下:mutex_lock(&adb_mutex);
        if (state) {
                file->private_data = NULL ...


spin_lock_irqsave(&state->lock, flags);
---从表面理解,这个应该是用于保护state中数据的,而mutex_lock(&adb_mutex)保护的对象应该不同,也就是说如果某内核执行流程中需要修改state中的数据,应该需要获取state->lock,而不会去获取adb_mutex,所以adb_mutex不能保护state中的数据。
当然,这段代码我没研究过,可能有理解偏差。。。

论坛徽章:
1
lufei
日期:2016-06-17 17:49:16
9 [报告]
发表于 2014-08-04 19:08 |只看该作者
嗯,谢谢。我再看看。回复 8# humjb_1983


   

论坛徽章:
0
10 [报告]
发表于 2014-08-05 02:23 |只看该作者
本帖最后由 黎明748 于 2014-08-05 02:37 编辑

mutex_lock(&adb_mutex);只保证这里的if语句只有一个路径可以执行,并不保证其他路径不会访问state结构,所以还要再加spin。
我觉得这里mutex_lock(&adb_mutex)主要是保护if(state),kfree(state)和 spin_lock_irqsave(&state->lock, flags)和spin_unlock_irqsave(&state->lock, flags);。这里操作file结构没有上锁,估计file结构之前也是已经获得锁了,没代码不清楚。spin就保护state结构。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP