首页 > 其他分享 >RDMA-内核接口-rxe_map_mr_sg

RDMA-内核接口-rxe_map_mr_sg

时间:2023-09-08 16:00:49浏览次数:41  
标签:map ibmr struct int rxe RDMA mr sg page

描述:映射mr的sg

调用链:

此处多处调用


static int nvme_rdma_map_sg_fr(struct nvme_rdma_queue *queue,

        struct nvme_rdma_request *req, struct nvme_command *c,

        int count)

{

    req->mr = ib_mr_pool_get(queue->qp, &queue->qp->rdma_mrs);

    /*

     * Align the MR to a 4K page size to match the ctrl page size and

     * the block virtual boundary.

     */

    nr = ib_map_mr_sg(req->mr, req->sg_table.sgl, count, NULL, SZ_4K);


}


映射dma映射的SG列表的最大前缀,并将其设置为内存区域

int ib_map_mr_sg(struct ib_mr *mr, struct scatterlist *sg, int sg_nents,

         unsigned int *sg_offset, unsigned int page_size)

{

    if (unlikely(!mr->device->ops.map_mr_sg))

        return -EOPNOTSUPP;


    mr->page_size = page_size;


    return mr->device->ops.map_mr_sg(mr, sg, sg_nents, sg_offset);

}

Ops_rxe:

static int rxe_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg,

             int sg_nents, unsigned int *sg_offset)

{

    struct rxe_mem *mr = to_rmr(ibmr);

    int n;


    mr->nbuf = 0;


    n = ib_sg_to_pages(ibmr, sg, sg_nents, sg_offset, rxe_set_page);


    mr->va = ibmr->iova;

    mr->iova = ibmr->iova;

    mr->length = ibmr->length;

    mr->page_shift = ilog2(ibmr->page_size);

    mr->page_mask = ibmr->page_size - 1;

    mr->offset = mr->iova & mr->page_mask;


    return n;

}

调用ib_sg_to_pages()方法,主要在驱动程序页分配函数指针rxe_set_page

static int rxe_set_page(struct ib_mr *ibmr, u64 addr)

{

    struct rxe_mem *mr = to_rmr(ibmr);

    struct rxe_map *map;

    struct rxe_phys_buf *buf;


    if (unlikely(mr->nbuf == mr->num_buf))

        return -ENOMEM;


    map = mr->map[mr->nbuf / RXE_BUF_PER_MAP];

    buf = &map->buf[mr->nbuf % RXE_BUF_PER_MAP];


    buf->addr = addr;

    buf->size = ibmr->page_size;

    mr->nbuf++;


    return 0;

}

Ops_i40iw:

static int i40iw_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg,

               int sg_nents, unsigned int *sg_offset)

{

    struct i40iw_mr *iwmr = to_iwmr(ibmr);


    iwmr->npages = 0;

    return ib_sg_to_pages(ibmr, sg, sg_nents, sg_offset, i40iw_set_page);

}

调用ib_sg_to_pages()方法,主要在驱动程序页分配函数指针i40iw_set_page

static int i40iw_set_page(struct ib_mr *ibmr, u64 addr)

{

    struct i40iw_mr *iwmr = to_iwmr(ibmr);

    struct i40iw_pbl *iwpbl = &iwmr->iwpbl;

    struct i40iw_pble_alloc *palloc = &iwpbl->pble_alloc;

    u64 *pbl;


    if (unlikely(iwmr->npages == iwmr->page_cnt))

        return -ENOMEM;


    pbl = (u64 *)palloc->level1.addr;

    pbl[iwmr->npages++] = cpu_to_le64(addr);

    return 0;

}

标签:map,ibmr,struct,int,rxe,RDMA,mr,sg,page
From: https://blog.51cto.com/u_16113732/7411315

相关文章

  • 构筑下一代数据中心互联的“超级高速公路”,中科驭数正式发布KPU FLEXFLOW®-2100R RDM
    2023服贸会期间,中科驭数重磅推出最新自研的高性能网络“利器”——KPUFLEXFLOW®-2100RRDMA加速DPU卡。这款产品的发布标志着中科驭数在高性能计算和数据中心领域的不断创新,旨在面向高速网络、高性能存储搭建起算力集群内部通信的"超级高速公路”,助力高性能计算领域创新。站在数......
  • hashMap产生的循环依赖问题
    转:hashMap产生的循环依赖问题 这样就是一个很经典hashMap线程不安全导致的循环依赖,因为是个循环链表,就会导致数组一直重复扩容,导致集合的一个无限大,但是JDK1.8的时候,把头插法改成了尾插法,同时引进了红黑树,当连续扩容32次的时候会转换成红黑树,解决这个循环依赖的问题,但是还是......
  • vue2使用 AMap-Vue 高德地图(矩形、圆形、多边形)绘制电子围栏
     AMap-Vue 参考 安装使用|AMap-Vue(gitee.io)main.js引入importAmapVuefrom'@amap/amap-vue';Vue.use(AmapVue);AmapVue.config.key='您申请的key值';AmapVue.config.version='2.0';//默认2.0,这里可以不修改AmapVue.config.plugins=["A......
  • 使用JavaStream将List转为Map
    有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top首发博客地址系列文章地址使用JavaStream将List转换为Map可以使用Collectors.toMap()方法。toMap()方法接受两个参数,第一个参数是用于提取Map的键的函数,第二个参数是用于提......
  • LFU缓存算法(理解容易,主要是代码实现内外双map+双双向链表)
    packagearithmetic;importjava.util.HashMap;publicclassFaceTest82{//LFU缓存置换算法//比较词频,词频相同看时间点//置换之后,词频重新开始累计publicFaceTest82(intk){capacity=k;size=0;records=newHashMap<Integer,FaceTest82.Node>();heads=newH......
  • 实现Map批量赋值,我只需24秒搞定!
    函数的功能是将一组键值对批量赋值给Map中的键。在Java中,通常使用Map的put方法逐个将键值对赋值给Map,但在某些场景下,可能需要一次性将多个键值对赋值给Map。函数功能:Map批量赋值参数1:参数名称:target;参数类型:Map;参数描述:Map对象参数2:参数名称:keyAndValue;参数类型:Object;参数描述:k......
  • LRUCache算法缓存策略(map+doubleLinkedList)
    packagearithmetic;importjava.util.HashMap;publicclassFaceTest81{//LRUcache缓存策略map+双向链表//get、update、put需要时间复杂度达到O1//map+双向链表结构publicFaceTest81(intcapacity){ cache=newMyCache(capacity);}privateMyCache<Integer,Intege......
  • @supermap/iclient-leaflet使用tiledMapLayer报错
    使用leaflet加载超图的时候有时候超图无法加载有时候报如下错误因为手上有好几个项目都在使用leaflet但是同样都使用@supermap/iclient-leaflet(版本11.1.0-a)加载超图,有的项目可行,有的不可行最后打开项目根目录下node_modules里查看@supermap文件夹里的iclient-leafl......
  • Redis复习:(1)RedisTempalte之BitMap操作
    packagecn.edu.tju.service.impl;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.dao.DataAccessException;importorg.springframework.data.redis.connection.RedisConnection;importorg.springframework.data.redis.co......
  • map、sync.map、concurrent-map适用场景与源码解析
    最近一直加班,无论工作日还是周末,虽然每天很忙但总感觉空空的,很少有时间停下来思考与总结。项目中各种甩锅,最后最苦逼的还是落到了研发的头上,文档编写、环境部署、问题排查虐得一遍又一遍。事情杂乱,研发效率超级低,不知道何是是个头呀背景在go中,map是最常用的集合之一。其底层key存......