特殊场景1-不支持SVA但是使能IOMMU,所有注册到UACCE框架的设备都是支持PASID和支持IOMMU的场景
为了解决硬件不能访问用户态VA的问题,WD基础层接口新增了内存相关接口,主要有wd_reserve_memory,wd_blkpool_create,wd_blkpool_destroy,wd_alloc_blk和wd_free_blk这几个函数和struct wd_blkpool_setup结构体。其中:
- 内存预留接口:wd_reserve_memory用来申请一片内存,使得硬件和用户态均可使用VA访问这片内存。
- 块模式-内存池预留和释放接口:wd_blkpool_create基于用户定义的块大小和块数量来申请一片内存,使得硬件和用户态均可使用VA访问这片内存。wd_blkpool_destroy销毁wd_blkpool_create创建的内存池。
- 块模式-内存分配释放接口:wd_alloc_blk和wd_free_blk,从wd_blkpool_create申请的内存中,申请一个或者释放一个块大小的内存。
每个函数的具体细节请参考WD数据存储格式与内存接口。
在特殊场景1下,使用WD基础层接口时,在涉及到内存操作时要稍作调整,新增的接口使用中需要考虑的注意事项具体包括:
- 消息发送前,指针需要传递给硬件的话,在默认场景中的第3步之前,声明一个struct wd_blkpool_setup变量,确定使用多大的内存池,这块内存池里面又切分成多少块,每块内存是多大。
1 2 3 4 5 6
struct wd_blkpool_setup { __u32 block_size;/* Block buffer size */ __u32 block_num;/* Block buffer number */ __u32 align_size;/* Block buffer startging address align size */ struct wd_mm_br br;/* memory from user if don't use WD memory */ };
- 消息发送前,指针需要传递给硬件的话,取struct wd_blkpool_setup变量地址作为参数调用void *wd_blkpool_create(struct wd_queue *q, struct wd_blkpool_setup *setup)接口预留出相应大小的内存,如果成功则返回内存池起始地址,失败则返回空指针。函数内部会调用wd_reserve_memory来预留内存。
- 消息发送前,指针需要传递给硬件的话,在默认场景中的第3步中,涉及到需要传给硬件的地址,都通过wd_alloc_blk从预留的内存池中分配出来。
- 消息接收处理完后,在默认场景中的第7步中,释放通过wd_alloc_blk申请的内存时,使用wd_free_blk释放。
- 消息接收处理完后,在默认场景中的第7步后,把预留内存池起始地址作为参数,调用wd_blkpool_destroy释放预留的内存。
父主题: WD基础层接口