迁移层

XE 迁移层用于生成可以复制内存(驱逐)、清除内存或编程表(绑定)的作业。此层存在于每个 GT 中,具有一个迁移引擎,并为所有生成的作业使用一个特殊的 VM。

特殊 VM 详情

特殊的 VM 配置有一个页面结构,我们可以在其中动态映射需要复制和清除的 BO,动态映射其他 VM 的页面表 BO 进行更新,并使用 1 GB 页面对整个设备的 VRAM 进行身份映射。

目前,页面结构由 32 个物理页面组成,其中 16 个保留用于复制和清除期间的 BO 映射,1 个保留用于内核绑定,几个页面需要设置身份映射(确切的数字取决于设备地址空间的位数),其余的保留给用户绑定操作。

TODO:布局图

绑定作业

一个绑定作业由两个批次组成,并在迁移引擎(内核绑定)或传入的绑定引擎(用户绑定)上运行。在这两种情况下,引擎的 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 进行身份映射?我们应该探索这一点。