memory_subsys_online memory_block_change_state memory_block_action MEM_ONLINE: online_pages move_pfn_range zone_for_pfn_range(为hotplug的mem选择一个zone, normal zone or movable zone) move_pfn_range_to_zone memmap_init_zone(初始化zone的每个page) __init_single_page if (context == MEMMAP_HOTPLUG)(hotplug场景,设置__SetPageReserved(page); ) __SetPageReserved(page); set_pageblock_migratetype(page, MIGRATE_MOVABLE);(设置zone的migrate type为movable) walk_system_ram_range(遍历每个page,然后执行以下的callback) online_pages_range if (PageReserved(pfn_to_page(start_pfn)))(上面已经设置了PG_reserved) online_pages_blocks online_page_callback generic_online_page __free_pages_core(将page释放到buddy里) online_mem_sections MEM_OFFLINE: offline_pages __offline_pages start_isolate_page_range(隔离offline的page,设置migrate type为MIGRATE_MOVABLE) set_migratetype_isolate has_unmovable_pages(检测是否包含unmovable的page)
set_pageblock_migratetype(page, MIGRATE_ISOLATE); move_freepages_block(zone, page, MIGRATE_ISOLATE,NULL); (将freepage zone->free_area[order][MIGRATE_ISOLATE]) move_freepages move_to_free_area(page, &zone->free_area[order], migratetype); __mod_zone_freepage_state(修改zone的统计计数) scan_movable_pages(上面将freepage迁移到MIGRATE_ISOLATE里了,这里开始遍历需要migrate的dirty page) do_migrate_range(对dirty page做migrate) offline_isolated_pages offline_isolated_pages_cb __offline_isolated_pages del_page_from_free_area(page, &zone->free_area[order]);(将page从对应的buddy删除)
总结:
online流程
1)、先为hotplug的内存找到一个合适的zone,如果有配置movable_node,则hotplug到movable_zone,如果没有则hotplug到normal zone;
2)、通过memmap_init_zone,初始化zone的每个page,比如migrate_type等;
3)、通过触发callback,执行generic_online_page,将page是否到zone的freelist;
offline流程:
1)、先开始隔离page,判断offline的range page是否都是movable的;
2)、将freepage先迁移到zone的free_list[IMGRATE_ISOLATE];
3)、进入scan_movable_pages流程,开始遍历dirty page,然后触发migrate,将dirty page迁移走;
4)、进入offline_isolated_pages,将所有的page的free_area链表移除;
原文地址:http://www.cnblogs.com/hhdd666/p/16897318.html
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,请务用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员!
8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性