Magma 测试策略

架构图

四个主要接口

四个主要组件

  • Libvulkan
  • Libmagma
  • magma_system
  • 供应商 msd(Magma 服务驱动程序)

鼓励挑战

  • Vulkan 驱动程序需要硬件才能完成完整测试
    • 每个受支持的 GPU 都需要测试不同的硬件平台
  • GPU 是复杂的硬件,存在缺陷,可能会偶尔触发不当行为
    • 有些测试很少出现故障
  • Vulkan CTS(一致性)需要几个小时才能运行
    • 应该在每日 build 上运行,而不是在常规 CQ 上运行
  • 向上游传送对供应商的 libvulkan 更改
    • 供应商必须提供一个构建和测试环境,以便他们在 Fuchsia 上验证 Vulkan CTS
  • 对 gfxbench 的来源访问权限受到限制
    • 我们应该测试二进制软件包吗?

单元测试

其中有些测试需要硬件,未包含在 CQ 的提交前检查中。

  • magma_util_tests
    • 覆盖 100% magma_util(不包括平台)
  • magma_platform_tests:
    • 覆盖 100% 的 magma_util/platform
  • magma_system_tests
    • 覆盖 100% 的岩浆系统
    • 使用模拟 MSD
  • 供应商 MSD
    • 覆盖率 80-100%(可能不值得对硬件互动代码的某些部分进行模拟)
    • 使用多个模拟来代替硬件
      • 平台 mmio
      • 站台公交车地图制作程序
      • 地址空间
      • 映射批次
  • libvulkan
    • 由供应商提供
    • 使用模拟 Magma 系统(如果不够充分,会成为硬件交互测试)

需要硬件的单元测试可内置在测试 MSD 中,该 MSD 在绑定后会运行测试。供应商专用自动化测试框架会取消绑定生产驱动程序,将测试驱动程序绑定到合适的位置,并查询测试结果。然后,自动化测试框架将取消绑定测试驱动程序,并重新绑定生产驱动程序。

硬件交互测试

app、libvulkan、msd 和 gpu 之间的交互非常复杂。一般来说,应用会生成 Vulkan 命令缓冲区和着色器程序,这些缓冲区和着色器程序由 libvulkan 以特定于 GPU 的二进制格式创建。这些命令缓冲区及其他资源会与 magma 系统驱动程序共享,Magma 系统驱动程序会将资源映射到 GPU 的地址空间,并在 GPU 的执行单元上调度命令缓冲区。

  • magma_conformance_tests
    • 不执行命令缓冲区;依靠 Vulkan CTS 实现命令缓冲区覆盖率
  • msd_conformance_tests
    • 验证供应商的 msd 实现
    • 覆盖率目标为 100%,目前约为 50%(https://fxbug.dev/42080890 用于实现供应商详情)
  • 特定于供应商
    • 关机
    • 挂起/故障恢复
  • vkreadback
    • 尽可能简化对 Vulkan 的端到端验证
  • vkloop
    • 验证挂起检测和恢复
  • vkext
    • 验证 Fuchsia Vulkan 扩展
  • Vulkan CTS
    • 需要几个小时才能运行
    • 应每天至少运行一次
    • 供应商必须提供一个构建和测试环境,以便他们在 Fuchsia 上验证 Vulkan CTS

需要硬件

Fuchsia 支持具有以下 GPS 的设备:

  • Intel Gen 9/12 - Intel HD/Xe 显卡
  • ARM Mali - Bifrost

GPU 是复杂的硬件,存在缺陷,可能会不常触发异常行为。有些测试可能很少出现故障。如果检测到这些错误,则应将其视为驱动程序 bug。

性能测试

  • TODO

模糊测试

MSD 应通过 magma FIDL 接口进行模糊测试。每个 MSD 都应该有自己的模糊测试工具,因为每个驱动程序在处理命令缓冲区或即时命令数据的方式上都是独一无二的,因此需要不同的输入预处理以确保充分覆盖范围。libfuzzer 模糊测试工具应使用 mock-ddk 与 MSD 相关联,以确保可从驱动程序接收覆盖率信息。由于真实的 GPU 硬件无法在模糊测试工具环境中使用,因此模糊测试工具必须具有虚构的设备实现。

应使用种子语料库,以确保 MSD 输入能够全面覆盖。这可以通过插桩 ICD 或拦截所有 Vulkan 命令的代理 MSD 收集。

在 Fuchsia ICD 开发过程中,不需要对 Vulkan ICD 进行模糊测试,因为存在以下问题:

  • Vulkan 规范充满了未定义的行为,因此很难确保模糊测试工具只测试合法的输入。不正确的输入会导致应用崩溃或挂起应用 - 请参阅 Vulkan 规范
  • ICD 位于应用的地址空间中,因此,此类模糊测试无法保证针对那些同样可以任意修改其地址空间的恶意应用提供安全保证。保护操作系统和其他应用的完整性必须在 MSD 层执行。

我们鼓励 ICD 开发者为 ICD 中没有未定义行为的部分创建模糊测试工具。这可能包括定义测试 ICD build,用于定义规范原本未定义的行为。

为了确保 ICD 符合 Vulkan 规范,大多数测试都是针对 Vulkan CTS 进行的。一些外部因素(例如 graphicsfuzz)旨在利用模糊测试来帮助添加 CTS 测试。

另请参阅