迁移层¶
XE 迁移层用于生成可以复制内存(驱逐)、清除内存或编程表(绑定)的作业。该层存在于每个 GT 中,具有一个迁移引擎,并为所有生成的作业使用一个特殊的 VM。
特殊 VM 详细信息¶
特殊的 VM 配置有一个页面结构,我们可以在其中动态映射需要复制和清除的 BO,动态映射其他 VM 的页表 BO 以进行更新,并使用 1 GB 页面来标识映射整个设备的 VRAM。
当前页面结构由 32 个物理页面组成,其中 16 个页面被保留用于复制和清除期间的 BO 映射,1 个页面被保留用于内核绑定,几个页面需要设置身份映射(确切数量取决于设备有多少位地址空间),其余页面被保留用于用户绑定操作。
待办事项:布局图
绑定作业¶
一个绑定作业由两个批处理组成,并在迁移引擎(内核绑定)或传入的绑定引擎(用户绑定)上运行。 在这两种情况下,引擎的 VM 都是迁移 VM。
第一个批处理用于更新迁移 VM 页面结构,以指向需要更新的绑定 VM 页表 BO。 此操作需要一个物理页面。 如果是用户绑定,则从保留用户绑定操作的页面池中分配该页面,并由 drm_suballoc 管理该池。 如果是内核绑定,则使用为内核绑定保留的页面。
仅当设备没有 VRAM 时才需要第一个批处理,因为当设备具有 VRAM 时,绑定 VM 页表 BO 位于 VRAM 中,并且可以使用身份映射。
第二个批处理用于在绑定 VM 中编程页面表更新。 为什么不只用一个批处理? 这是因为需要在这两个批处理之间使 TLB 失效,而这只能从环中完成。
绑定作业完成后,如果为用户绑定,则将分配的页面返回给为用户绑定操作保留的页面池。 对于内核绑定,无需这样做,因为保留的内核页面由每个作业依次使用。
复制/清除作业¶
复制或清除作业由两个批处理组成,并在迁移引擎上运行。
与绑定类似,第一个批处理用于更新迁移 VM 页面结构。 在复制作业中,我们需要将 BO 的源和目标映射到页面结构中。 在清除作业中,我们只需要将 BO 的 1 个映射添加到页面结构中。 我们使用迁移 VM 中 16 个保留页面进行映射,这使我们的最大复制大小为 16 MB,最大清除大小为 32 MB。
第二个批处理用于执行复制或清除。 同样类似于绑定,由于需要从环中使 TLB 在批处理之间失效,因此需要两个批处理。
如果 BO 大于最大复制/清除大小,则将生成多个作业。
未来的工作¶
更新复制和清除代码以使用身份映射的 VRAM。
我们可以重新设计页面异步绑定的使用方式,以使用每个页面中的所有条目吗?
使用大页面进行 sysmem 映射。
是否可以身份映射 sysmem? 我们应该探索这一点。