UAPI 打开、绑定与 IOCTL 调用链

UAPI 打开、绑定与 IOCTL 调用链

1. Legacy流程

1
2
3
4
5
6
7
8
9
10
11
12
13
open("/dev/vfio/vfio")
-> VFIO_GET_API_VERSION
-> VFIO_CHECK_EXTENSION(VFIO_TYPE1_IOMMU)

open("/dev/vfio/N")
-> VFIO_GROUP_GET_STATUS
-> VFIO_GROUP_SET_CONTAINER(container_fd)

container ioctl:
-> VFIO_SET_IOMMU(VFIO_TYPE1_IOMMU)

group ioctl:
-> VFIO_GROUP_GET_DEVICE_FD(name)

实际 attach与 SET_IOMMU顺序需遵循 UAPI示例和 backend状态。

2. Device ioctl

通用:

  • VFIO_DEVICE_GET_INFO
  • VFIO_DEVICE_GET_REGION_INFO
  • VFIO_DEVICE_GET_IRQ_INFO
  • VFIO_DEVICE_SET_IRQS
  • VFIO_DEVICE_RESET
  • VFIO_DEVICE_FEATURE

随后可 read/write/mmap region。

3. argsz和flags

VFIO结构以 argsz支持 ABI扩展。用户应:

1.初始化 argsz;
2.检查返回 flags/capability chain;
3.必要时按所需大小重试;
4.忽略未知可跳过 capability。

不能假设所有 driver支持同一 feature。

4. Region offset

Device fd的 file offset编码 region index和内部 offset。PCI config、BAR、ROM、vendor region各有独立 index/flags。

5. IRQ

VFIO_DEVICE_SET_IRQS通过 index/start/count/flags:

  • DATA_NONE/BOOL/EVENTFD;
  • ACTION_MASK/UNMASK/TRIGGER。

MSI/MSI-X常把 eventfd数组关联 vector。

6. Feature

本树 Core处理 migration、migration state、DMA logging start/stop/report等 feature;PCI core另处理 low power和 VF token。是否可用由 device ops和 feature probe决定。

7. 错误

  • -EINVAL:argsz/flags/index/state;
  • -ENODEV:device消失;
  • -EBUSY:group不 viable或已绑定;
  • -ENOTTY:不支持 ioctl;
  • -EFAULT:用户指针;
  • -ENOMEM:pin/map资源。

8. Compat

32位用户态在64位 kernel上通过 compat ioctl。所有用户 pointer和 size必须按 UAPI类型处理,不能复制内核私有结构布局。

文章互动

阅读 --

留言

0 条留言

正在加载留言…