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链表移除;
浙公网安备 33010602011771号