struct ttm_device 和struct ttm_bo_device

一、核心结论

项目 说明

被替换的结构体 `struct ttm_bo_device`
引入版本 Linux 5.13 / 5.14 内核 (约 2021 年中)

重命名原因 简化命名,统一 TTM 设备模型,整合内存管理功能

二、历史演变证据

  1. 内核 5.4.x (原始结构)

```c

// include/drm/ttm/ttm_bo_driver.h (5.4 内核)

struct ttm_bo_device {

struct ttm_bo_global *glob; // 全局管理器

struct ttm_mem_global mem_glob; // 内存配额

struct list_head device_list; // 设备链表

struct ttm_bo_driver *driver; // 驱动回调

struct ttm_resource_manager *man[TTM_NUM_MEM_TYPES]; // 内存域管理器

struct drm_vma_offset_manager *vma_manager; // VMA 管理

bool need_dma32; // DMA32 标志

// ...

};

```

  1. 内核 5.13+ (新结构)

```c

// include/drm/ttm/ttm_device.h (新内核)

struct ttm_device {

struct ttm_bo_global *glob; // 继承:全局管理器

struct ttm_resource_manager *man[TTM_NUM_MEM_TYPES]; // 继承:内存域

struct drm_vma_offset_manager *vma_manager; // 继承:VMA

struct device *dev; // 新增:内核设备指针

struct address_space *mapping; // 新增:地址空间映射

struct ttm_pool *pool; // 新增:统一页池

// 移除:mem_glob (功能整合到 zones)

// 移除:driver 回调表 (改用 ttm_device_funcs)

// 移除:need_dma32 (改用 flags)

};

```

三、关键变化点

```

┌─────────────────────────────────────────────────────────────────────────────┐

│ 5.4 内核: struct ttm_bo_device │

│ │

│ ttm_bo_global_init() ← 全局初始化 │

│ │ │

│ └── ttm_bo_device_init() ← 设备初始化 │

│ │ │

│ ├── ttm_mem_global_init() ← 内存配额 │

│ ├── ttm_bo_init_mm() ← 各内存域 │

│ └── 驱动注册 ttm_bo_driver 回调表 │

│ │

│ 问题: │

│ 1. "bo_device" 命名强调 Buffer Object,但功能已扩展到通用内存管理 │

│ 2. ttm_bo_driver 回调表与 drm_driver 分离,增加复杂度 │

│ 3. mem_glob 和 pool 管理分离,统计不一致 │

│ 4. need_dma32 / need_swiotlb 多个 bool 参数 │

└─────────────────────────────────────────────────────────────────────────────┘

▼ 重构 (5.13+)

┌─────────────────────────────────────────────────────────────────────────────┐

│ 新内核: struct ttm_device │

│ │

│ ttm_device_init() ← 统一初始化入口 [^12^] │

│ │ │

│ ├── 整合 ttm_mem_global 功能到 zones[] │

│ ├── 统一页池 ttm_pool (替代 ttm_pool_manager) │

│ ├── 新回调结构 ttm_device_funcs (替代 ttm_bo_driver) │

│ └── flags 参数替代多个 bool (TTM_POOL_USE_DMA_ALLOC / TTM_POOL_USE_DMA32) [^9^]

│ │

│ 改进: │

│ 1. 命名更通用:"ttm_device" 而非 "ttm_bo_device" │

│ 2. 统一设备模型:嵌入 struct device *dev │

│ 3. 统一页池管理:ttm_pool 替代分散的 pool 实现 │

│ 4. 简化初始化参数:flags 替代 bool 列表 [^9^] │

│ 5. 驱动适配层:提供兼容宏或 inline 函数 │

└─────────────────────────────────────────────────────────────────────────────┘

```

四、驱动代码迁移示例

AMDGPU 驱动的适配 (来自搜索结果的补丁)

```c

// 旧 API (5.4 风格):

int amdgpu_ttm_init(struct amdgpu_device *adev)

{

r = ttm_bo_device_init(&adev->mman.bdev, &amdgpu_bo_driver,

adev->dev, mapping, vma_manager,

adev->need_swiotlb, // bool

dma_addressing_limited(adev->dev)); // bool

}

// 新 API (5.13+ 风格):

int amdgpu_ttm_init(struct amdgpu_device *adev)

{

r = ttm_device_init(&adev->mman.bdev, &amdgpu_bo_driver, // 注意:bdev 仍是同一字段

adev->dev, mapping, vma_manager,

(adev->need_swiotlb ? TTM_POOL_USE_DMA_ALLOC : 0) |

(dma_addressing_limited(adev->dev) ? TTM_POOL_USE_DMA32 : 0));

// flags 替代 bool 参数

}

```

VirtualBox 驱动的兼容处理

// vbox_drv.h 中的版本兼容

#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 13, 0)

struct ttm_device bdev; // 新内核使用 ttm_device

#else

struct ttm_bo_device bdev; // 旧内核使用 ttm_bo_device

#endif

```

五、5.4.248 内核的特殊说明

5.4.248 仍然使用 `struct ttm_bo_device`,这是长期支持 (LTS) 内核的特性:

六、结构体字段对比

七、关键关联

```

5.4 内核:

struct ttm_bo_device ──→ struct ttm_bo_global ──→ struct ttm_mem_global ──→ struct ttm_mem_zone

│ │

└── struct ttm_buffer_object ──→ struct ttm_tt ──→ struct page* (物理内存)

5.13+ 内核:

struct ttm_device ──→ struct ttm_bo_global ──→ zones[] (替代 mem_glob)

│ │

└── struct ttm_buffer_object ──→ struct ttm_tt ──→ struct page* (物理内存)

└── struct ttm_pool (统一页池)

```

总结: `struct ttm_device` 是 TTM 子系统的现代化重构,主要目的是:

  1. 简化命名:从 "bo_device" 到 "device",反映其通用内存管理角色

  2. 统一设备模型:嵌入 `struct device *`,与 Linux 设备模型一致

  3. 整合内存管理:将分散的 `mem_glob`/`pool_manager` 统一为 `zones`/`pool`

  4. 简化 API:用 `flags` 替代多个 `bool` 参数,提高可扩展性

5.4 LTS 内核保持 `ttm_bo_device` 以确保驱动兼容性,这是 LTS 内核的稳定性承诺。