免费注册 查看新帖 |

Chinaunix

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

[内存管理] 临时映射的一个疑问 [复制链接]

论坛徽章:
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
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-01-21 11:42 |只看该作者 |倒序浏览
版本3.10.17
kmap_atomic在选取映射的表项的时候,直接通过kmap_atomic_idx_push函数获取
static inline int kmap_atomic_idx_push(void)
{
        int idx = __this_cpu_inc_return(__kmap_atomic_idx) - 1;

#ifdef CONFIG_DEBUG_HIGHMEM
        WARN_ON_ONCE(in_irq() && !irqs_disabled());
        BUG_ON(idx > KM_TYPE_NR);
#endif
        return idx;
}
在释放的时候通过kmap_atomic_idx找到对应的表项,那么这么实现的结果不是只能按顺序分配和释放了吗,假如我现在按顺序建立了3个临时映射1,2,3
如果我要释放2的话,岂不是出错了?
static inline int kmap_atomic_idx(void)
{
        return __this_cpu_read(__kmap_atomic_idx) - 1;
}

论坛徽章:
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 [报告]
发表于 2015-01-21 18:16 |只看该作者
@humjb_1983
@Tinnal
@arm-linux-gcc

麻烦帮忙解答一下,多谢多谢

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
3 [报告]
发表于 2015-01-22 08:18 |只看该作者
@super皮波


  你@的方法错了,这样别人是收不到通知的。

kmap_atomic函数一直在我心中还是存在type参数让你去人工选择被映射的页的。看到你这贴,再翻翻3.10的内核代码,发现世界变了,呵呵。再查一下,原来2.6.37开始就变了。

回答你这个问题:
1. kmap_atomic是在关强占下进行的,因此其它内核线程在你没有kunmap前是没有机会去kmap_atomic的,这防止了其它线程与你并发。其它核是没有作谓的,因为核间是分开的。
2. 那弄kmap_atomic_idx_push这东西出来干嘛?并发没了,一般的函数重入(递归)倒是有吧。你kmap_atomic以后,还能kmap_atomic另外一个页呀。并且刚才的并发场景里没有说中断,我们只关抢占了,没关中断。这也是一个重入场景(但这个场景不会导致乱序,因此把它归到一般重入的场景)。这么做就是为了在这情况下都能分配到不同的页。这个功能其实已经比2.6.37前的kmap_atomic方便多了。

3. 此于你自己如果kmap_atomic了很多,然后又不按顺序去kunmap,那就是你的问题了。kmap_atomic原则上是随用随还,不应该长时间、特别是同一时间持有多个。这是老原则了。

论坛徽章:
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
4 [报告]
发表于 2015-01-22 09:40 |只看该作者
回复 3# Tinnal

多谢了,很透彻!
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP