easyui 页面出现 new dialog_内存管理:页面迁移

本文详细介绍了内存管理中的页面迁移,特别是easyui页面出现new dialog的情况。文章围绕migrate_pages()函数展开,讨论了迁移模式、原因及其在内存规整中的作用。此外,还探讨了支持迁移的页面类型和实际操作流程,包括解锁、重新映射等步骤。
摘要由CSDN通过智能技术生成

5140950651b554a879064aa47ad73ab4.png

概述:

页面迁移(migrate)是内存管理中很多功能实现的基础,比方说内存规整、NUMA balance、内存热插拔等等,本文主要讲一下页面迁移的主要流程和应用。

kernel代码基于:v5.9-rc8

页面迁移的API:

migrate_pages( ) 这是页面迁移在内核态的主要接口,内核中涉及到页面迁移的功能大都会调到它。当然,在用户空间也存在着内存迁移相关的系统调用,最终也会调到它。这里我们通过migrate_pages( )的几个形参展开全文。

/* 
 * migrate_pages - migrate the pages specified in a list, to the free pages
 *                 supplied as the target for the page migration
 *
 * @from:               The list of pages to be migrated.
 * @get_new_page:       The function used to allocate free pages to be used
 *                      as the target of the page migration.
 * @put_new_page:       The function used to free target pages if migration
 *                      fails, or NULL if no special handling is necessary.
 * @private:            Private data to be passed on to get_new_page()
 * @mode:               The migration mode that specifies the constraints for
 *                      page migration, if any.
 * @reason:             The reason for page migration.
 */
     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)

形参含义根据上面的注释很好理解,我们单独说下mode和reason,他们分别表示迁移模式和迁移原因。

迁移模式:

迁移模式主要会影响迁移过程中对一些行为的过滤:

MIGRATE_ASYNC        //异步迁移,过程中不会发生阻塞,
MIGRATE_SYNC_LIGHT   //轻度同步迁移,允许大部分的阻塞操作,唯独不允许脏页的回写操作
MIGRATE_SYNC         //同步迁移,迁移过程会发生阻塞,若需要迁移的某个page正在writeback或被locked会等待它完成
MIGRATE_SYNC_NO_COPY //同步迁移,但不等待页面的拷贝过程。页面的拷贝通过回调migratepage(),过程可能会涉及DMA

举例:内存规整(compact)中会调用migrate_pages(),同时也会设置迁移模式(位于compact_control->mode)。若是sysfs主动触发的内存规整会用MIGRATE_SYNC模式;若是kcompactd触发的规整会用MIGRATE_SYNC_LIGHT模式;若是内存分配slowpath中触发的会根据compact prior去设置用MIGRATE_ASYNC或MIGRATE_SYNC_LIGHT模式。

迁移原因:

迁移原因主要使用来记录是什么功能触发了迁移的行为,毕竟页面迁移对系统本身是个不小的overhead,所以知道迁移的原因很有必。

MR_COMPACTION      //内存规整导致的迁移
MR_MEMORY_FAILURE  //当内存出现硬件问题(ECC校验失败等)时触发的页面迁移。 参考memory-failure.c
MR_MEMORY_HOTPLUG  //内存热插拔导致的迁移
MR_SYSCALL         //应用层主动调用migrate_pages()或move_pages()触发的迁移。
MR_MEMPOLICY_MBIND //调用mbind系统调用设置memory policy时触发的迁移
MR_NUMA_MISPLACED  //numa balance触发的页面迁移(node之间)
MR_CONTIG_RANGE    //调用alloc_contig_range()为CMA或HugeTLB分配连续内存时触发的迁移(和compact相关)。

延伸:对上面MR_SYSCALL迁移原因中提到的两个API(位于libnuma库)的简单介绍。

migrate_pages()  //和kernel中接口同名,别搞混了
含义:把某pid进程的所有页面从源numa node迁移到目标numa nodes组中,对应系统调用sys_migrate_pages()         
move_pages()  
含义:把进程到部分页面迁移目标numa node中,对应系统调用sys_move_pages()

migrate_pages()介绍:

通过上面对迁移原因的介绍,我们知道了页面迁移的原因各种各样,这里我们通过内存规整(memory compact)这样一个实际的例子展开介绍,下图主要体现了内存规整和页面迁移的关系:

30f2c66ba4e96c1e77ce5863adab44d0.png

通过上图,我们看出页面迁移在内存规整中举足轻重的地位。下面则是内存规整调用migrate_pages()的函数关系:

compact_zone           //内存规整
  ->migrate_pages      //页面迁移的入口函数						
    ->unmap_and_move   //页面迁移的核心实现 

现在切入重点,页面迁移(migrate)过程做了那些事情:

迁移前的准备:

1. 获取old page的页面锁PG_locked (异步模式拿不到锁就直接跳过此页面)

2. 若是正在writeback的页面,则根据迁移模式判断是否等待页面wirteback(MIGRATE_SYNC_LIGHT和MIGRATE_ASYNC不等待)

3. 获取new page的页面锁PG_locked (new page正常情况下不会获取失败)

88d1b149a4108aab0e62d4228a634655.png

解除old page的页表映射:

调用try_to_unmap(),通过反向映射机制解除old page所有相关的PTEs

8cc8532d4da294ccf1698cc8c92b365e.png

设置new page的页面内容、元数据及映射关系:

调用move_to_new_page拷贝old page的内容和struct page元数据到new page,并通过反向映射机制建立new page的映射关系。

a6675e47ae943f7c9dafff54643ab364.png

页面迁移的收尾工作:

1. 迁移完成释放新旧页面的PG_locked。

2. 设置迁移原因。

3. 调用put_page释放old page引用计数(_refcount减1)

1d03a48953975d284e2005a0bf011ca4.png

补充:说到最后忽然想起来缺了点什么.....什么样的页面才支持迁移呢?

1. lru上的page,因为上面挂的是user spcace用的pages,都是从buddy分配器migrate type为movable或reclaim的pageblock上分来的。

2. no-lru但是movable的页面。no-lru的页面通常是为kernel space分配的page,这种页面通常是unmovable的,但是下面这个commit使得驱动中用到的页面也可以支持迁移。但是在驱动实现的过程中需要置位page->mapping中的second bit,并且实现page->mapping->a_ops中的相关方法。(详细介绍看下面的这个commit,重点关注PageMovable()的实现)

bda807d44("mm: migrate: support non-lru movable page migration")

原创文章,转载和引用请注明出处。

作者:Yann Xu

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值