memory hotplug

 

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链表移除;

posted @ 2022-11-16 19:50  叫什么昵称合适  阅读(105)  评论(0)    收藏  举报