一、核心结论
项目 说明
被替换的结构体 `struct ttm_bo_device`
引入版本 Linux 5.13 / 5.14 内核 (约 2021 年中)
重命名原因 简化命名,统一 TTM 设备模型,整合内存管理功能
二、历史演变证据
- 内核 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 标志
// ...
};
```
- 内核 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 子系统的现代化重构,主要目的是:
-
简化命名:从 "bo_device" 到 "device",反映其通用内存管理角色
-
统一设备模型:嵌入 `struct device *`,与 Linux 设备模型一致
-
整合内存管理:将分散的 `mem_glob`/`pool_manager` 统一为 `zones`/`pool`
-
简化 API:用 `flags` 替代多个 `bool` 参数,提高可扩展性
5.4 LTS 内核保持 `ttm_bo_device` 以确保驱动兼容性,这是 LTS 内核的稳定性承诺。