免费注册 查看新帖 |

Chinaunix

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

请教内存管理函数__rmqueue_fallback关于pageblock_order问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-10-28 14:16 |只看该作者 |倒序浏览
kernel版本3.0.4:
  1. /* Remove an element from the buddy allocator from the fallback list */
  2. static inline struct page *
  3. __rmqueue_fallback(struct zone *zone, int order, int start_migratetype)
  4. {
  5. ......
  6.                         if (unlikely(current_order >= (pageblock_order >> 1)) ||
  7.                                         start_migratetype == MIGRATE_RECLAIMABLE ||
  8.                                         page_group_by_mobility_disabled) {
  9.                                 unsigned long pages;
  10.                                 pages = move_freepages_block(zone, page,
  11.                                                                 start_migratetype);

  12.                                 /* Claim the whole block if over half of it is free */
  13.                                 if (pages >= (1 << (pageblock_order-1)) ||
  14.                                                 page_group_by_mobility_disabled)
  15.                                         set_pageblock_migratetype(page,
  16.                                                                 start_migratetype);

  17.                                 migratetype = start_migratetype;
  18.                         }
  19. ......
  20. }
复制代码
上面函数中从注释看:
  1.                         /*
  2.                          * If breaking a large block of pages, move all free
  3.                          * pages to the preferred allocation list. If falling
  4.                          * back for a reclaimable kernel allocation, be more
  5.                          * aggressive about taking ownership of free pages
  6.                          */
复制代码
如果打碎一个large block,将整个移动一个pageblock到新的migrate链表中。

我的问题是:

If语句的判断条件为什么会是pageblock_order >> 1?为什么要右移1位呢?这个是出于什么考虑的?

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2011-10-28 23:59 |只看该作者
migrate, 关注~

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2011-10-29 11:57 |只看该作者
看了下, 我的理解如下:

在从大阶到小阶的备用表中找一个节点返回.
找的过程中, 如果符合条件的阶是上半部分, 就把该阶的一个节点整个都分给它,
甚至修改该节点的migrate类型.
否则仅仅是从该节点借取请求的页数.

>>1就是判断上半部分还是下半部分的.
尽量从大阶获取.
否则先从小阶获取则会造成更多的碎片.

论坛徽章:
0
4 [报告]
发表于 2011-10-30 08:52 |只看该作者
谢谢楼上的回复。
我觉得上半部这个解释好,我是觉得如果pageblock如果是10的话,上半部就是5,也就是32个页。如果破坏了一个32页的block,就要移动1024页的pageblock,真是不能理解作者的意图啊~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP