Linux内核5.16中unmap_and_move_huge_page()的技术疑问
Linux内核5.16中unmap_and_move_huge_page()的大页拆分行为分析
在Linux内核的migrate_pages()函数中,会针对大页调用unmap_and_move_huge_page()进行迁移,核心分支代码如下:
int migrate_pages(struct list_head *from, new_page_t get_new_page, free_page_t put_new_page, unsigned long private, enum migrate_mode mode, int reason, unsigned int *ret_succeeded) { ....... if (PageHuge(page)) rc = unmap_and_move_huge_page(get_new_page,put_new_page, private, page, pass > 2, mode, reason, &ret_pages); else rc = unmap_and_move(get_new_page, put_new_page, private, page, pass > 2, mode, reason, &ret_pages); ...... }
针对该逻辑,有以下两个问题及对应解答:
问题1:unmap_and_move_huge_page()是否会将大页拆分为小页?
在Linux内核5.16版本中,unmap_and_move_huge_page()会在特定条件下将大页拆分为小页。当大页迁移尝试失败(例如无法分配到连续的物理大页作为目标载体),且当前迁移模式允许降级处理时,该函数会触发大页拆分流程,将透明大页(THP)分解为普通的4KB小页后,再通过常规迁移逻辑完成后续操作。
问题2:若该函数会拆分大页,它调用了哪个函数?
负责执行大页拆分的函数是split_huge_page_to_list()。在unmap_and_move_huge_page()的实现中,当大页迁移失败且满足拆分条件时,会调用该函数将大页拆分为多个独立的小页,随后这些小页会被加入到迁移队列中,转而通过unmap_and_move()函数完成单页迁移。
内容的提问来源于stack exchange,提问作者user19629747
相关产品推荐
相关产品推荐

