鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

特殊场景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基础层接口时,在涉及到内存操作时要稍作调整,新增的接口使用中需要考虑的注意事项具体包括:

  1. 消息发送前,指针需要传递给硬件的话,在默认场景中的第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 */
    };
    
  2. 消息发送前,指针需要传递给硬件的话,取struct wd_blkpool_setup变量地址作为参数调用void *wd_blkpool_create(struct wd_queue *q, struct wd_blkpool_setup *setup)接口预留出相应大小的内存,如果成功则返回内存池起始地址,失败则返回空指针。函数内部会调用wd_reserve_memory来预留内存。
  3. 消息发送前,指针需要传递给硬件的话,在默认场景中的第3步中,涉及到需要传给硬件的地址,都通过wd_alloc_blk从预留的内存池中分配出来。
  4. 消息接收处理完后,在默认场景中的第7步中,释放通过wd_alloc_blk申请的内存时,使用wd_free_blk释放。
  5. 消息接收处理完后,在默认场景中的第7步后,把预留内存池起始地址作为参数,调用wd_blkpool_destroy释放预留的内存。