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

RDMA-MR内核接口-rxe_get_dma_mr

时间:2023-09-07 10:38:40浏览次数:35  
标签:dma struct get mem rxe iwmr pd mr

描述:注册物理内存,获取具有数据传输所需密钥的内存区域结构

.get_dma_mr = rxe_get_dma_mr,

内核的PD下面会注册一个内部的特殊MR,这个MR的范围包含了所有的系统内存。然后如果内核态的RDMA用户创建PD的时候传入了这个flag,就会把这个MR的R_Key挂在PD结构体的unsafe_global_rkey里面返回给用户。用户可以把这个R_Key传给对端使用,对端就可以用这个R_Key访问本端的全部内存了,可以避免频繁注册MR带来的开销。

       调用链:Allocates an unused protection domain.

a)     类型转换为rxe类型

b)    验证mr_type

c)     申请rxe_mem: mr = rxe_alloc(&rxe->mr_pool);

d)    为mr分配索引:rxe_add_index(mr)

e)     对对象进行引用:rxe_add_ref(pd)

f)      构成mr:rxe_mem_init_dam(pd, max_num_sg, mr);

l  int rxe_mem_init_dma(struct rxe_pd *pd,

                    int max_pages, struct rxe_mem *mem)

l  初始化mr:rxe_mem_init(0, mem)->生成lkey和rkey

g)    返回新分配的mr


       struct ib_pd *__ib_alloc_pd(struct ib_device *device, unsigned int flags,const char *caller){

    mr = pd->device->ops.get_dma_mr(pd, mr_access_flags);

}

       Ops_rxe

.get_dma_mr = rxe_get_dma_mr

static struct ib_mr *rxe_get_dma_mr(struct ib_pd *ibpd, int access)

{

    err = rxe_mem_init_dma(pd, access, mr);

}


int rxe_mem_init_dma(struct rxe_pd *pd,

             int access, struct rxe_mem *mem)

{

    rxe_mem_init(access, mem);


    mem->pd         = pd;

    mem->access     = access;

    mem->state      = RXE_MEM_STATE_VALID;

    mem->type       = RXE_MEM_TYPE_DMA;


    return 0;

}


Ops_i40iw

       static struct ib_mr *i40iw_get_dma_mr(struct ib_pd *pd, int acc)

{

    u64 kva = 0;


    return i40iw_reg_phys_mr(pd, 0, 0, acc, &kva);

}

 

/**

 * i40iw_reg_phys_mr - register kernel physical memory

 * @pd: ibpd pointer

 * @addr: physical address of memory to register

 * @size: size of memory to register

 * @acc: Access rights

 * @iova_start: start of virtual address for physical buffers

 */

struct ib_mr *i40iw_reg_phys_mr(struct ib_pd *pd,

                u64 addr,

                u64 size,

                int acc,

                u64 *iova_start)

{

    struct i40iw_pd *iwpd = to_iwpd(pd);

    struct i40iw_device *iwdev = to_iwdev(pd->device);

    struct i40iw_pbl *iwpbl;

    struct i40iw_mr *iwmr;

    enum i40iw_status_code status;

    u32 stag;

    u16 access = I40IW_ACCESS_FLAGS_LOCALREAD;

    int ret;


    iwmr = kzalloc(sizeof(*iwmr), GFP_KERNEL);

    if (!iwmr)

        return ERR_PTR(-ENOMEM);

    iwmr->ibmr.pd = pd;

    iwmr->ibmr.device = pd->device;

    iwpbl = &iwmr->iwpbl;

    iwpbl->iwmr = iwmr;

    iwmr->type =

    iwpbl->user_base = *iova_start;

    stag = i40iw_create_stag(iwdev);

    if (!stag) {

        ret = -EOVERFLOW;

        goto err;

    access |= i40iw_get_user_access(acc);

    iwmr->stag = stag;

    iwmr->ibmr.rkey = stag;

    iwmr->ibmr.lkey = stag;

    iwmr->page_cnt = 1;

    iwmr->pgaddrmem[0]  = addr;

    iwmr->length = size;

    status = i40iw_hwreg_mr(iwdev, iwmr, access);

    if (status) {

        i40iw_free_stag(iwdev, stag);

        ret = -ENOMEM;

        goto err;


    i40iw_add_pdusecount(iwpd);

    return &iwmr->ibmr;

 err:

    kfree(iwmr);

    return ERR_PTR(ret);

}

 

标签:dma,struct,get,mem,rxe,iwmr,pd,mr
From: https://blog.51cto.com/u_16113732/7394524

相关文章

  • 【JAVA】java.lang.IllegalStateException: Failed to get nested archive for entry
    无脑看:解压后,替换lib里的jar,在本窗口用命令:jar-xvf ***.jar进行打包就行了。 一、背景:替换jar包中lib里的jar包1、在经过360压缩软件打开后进行了替换,运行报错 (PS.有时候不显示日志的时候可以在bat最后加一个pause)2、在经过WINRAR压缩软件进行存储(stor......
  • 自己编写一个发get请求案例
    在线用户的文件夹上一篇的咨询在线用户列表我们打印一下,发现确实打印了这个对象省流:如果我想要发请求,只要在api里面新建就行了。那么我们试一下创建一个test1在api下的monitor下引入对axios的封装(第一行)复制list方法,命名其为list1,为了做测试打印11111111(已经有list了)引......
  • Tomcat7+ 弱口令 && 后台getshell漏洞
    Tomcat7+弱口令&&后台getshell漏洞环境说明Tomcat支持后台部署war文件,可以直接将webshell部署到web目录下。其中,欲访问后台,需要对应用户有相应权限。Tomcat7+权限分为:manger(后台管理)manger-gui拥有html页面权限manger-status拥有查看status的权限mager-jmx拥有jmx权限......
  • Android OTA升级之升级包生成脚本ota_from_target_files
    我们在这里主要分析OTA升级过程中对ota_from_target_files.py脚本的调用,这个脚本主的作用是生成各种OTA完整包和增量包。 以生成完整OTA包为例,假设我们的命令为:./build/tools/releasetools/ota_from_target_files-n input_file_dir/target_file.zip output_file_dir/outp......
  • TARGET_DEVICE_DIR取值过程分析
    xxx(机型名)为例在build/core/main.mk中,会包含build/core/config.mk,在config.mk中,会包含build/core/envsetup.mk,在envsetup.mk中有:#ReadtheproductspecssowecangetTARGET_DEVICEandother#variablesthatweneedinordertolocatetheoutp......
  • axios封装后发get请求
    ruoyi的前端对axios进行了封装,让我们发get请求或者是post请求更加方便了。ruoyi对axios的封装在下面文件中:打开文件,可以看到它有三个显眼的方法,分别是request拦截器、response拦截器和通用下载方法。request拦截器对我们发送的请求进行了封装,当我们发送Get请求,那么我们携带参数......
  • 刷面经的正确姿势,快来get!大厂面经集合2.0
    本文首发自公粽hao「林行学长」,欢迎来撩,免费领取20个求职工具资源包。了解校招、分享校招知识的学长来了!想必24届的朋友们都在面试的路上了吧,面试可是校招的必经环境。作为经历过校招的学长,曾经也是一枚面试小白,完全不知道如何应对面试、不知道面试官会问什么问题。但是现在,许多......
  • Android - Get Bluetooth UUID for this device
    StackOverflowisacommunityof4.7millionprogrammers,justlikeyou,helpingeachother.Jointhem,itonlytakesaminute:Android-GetBluetoothUUIDforthisdeviceupvote9downvotefavorite7IwasbrowingStackandtheinternetforasimplesolut......
  • Vue2 中vuex和store基本用法——取值之this.$store.getters.getValue & 修改值之this.
        参考:https://blog.csdn.net/weixin_44867717/article/details/124133304 项目实例:      ......
  • os.path.getmtime(file) 与 os.stat(file).st_mtime 的区别
    os.path.getmtime(file)和os.stat(file).st_mtime都用于获取文件的最后修改时间,但它们之间有一些区别:返回值类型:os.path.getmtime(file)返回的是一个浮点数,表示文件的最后修改时间,以秒为单位。os.stat(file).st_mtime返回的也是一个浮点数,表示文件的最后修改时间,以秒为单位。......