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. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性