Skip to content

Commit 2f255f6

Browse files
committed
libxscale: Add support for pd and mr
This patch adds support for pd and mr operations including: 1. alloc_pd 2. dealloc_pd 3. reg_mr 4. dereg_mr Signed-off-by: Tian Xin <tianx@yunsilicon.com> Signed-off-by: Wei Honggang <weihg@yunsilicon.com> Signed-off-by: Zhao Qianwei <zhaoqw@yunsilicon.com> Signed-off-by: Li Qiang <liq@yunsilicon.com> Signed-off-by: Yan Lei <jacky@yunsilicon.com>
1 parent a4c4e7d commit 2f255f6

File tree

2 files changed

+96
-0
lines changed

2 files changed

+96
-0
lines changed

providers/xscale/verbs.c

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,98 @@ int xsc_query_port(struct ibv_context *context, u8 port,
3737
return ibv_cmd_query_port(context, port, attr, &cmd, sizeof(cmd));
3838
}
3939

40+
struct ibv_pd *xsc_alloc_pd(struct ibv_context *context)
41+
{
42+
struct ibv_alloc_pd cmd;
43+
struct xsc_alloc_pd_resp resp;
44+
struct xsc_pd *pd;
45+
46+
pd = calloc(1, sizeof(*pd));
47+
if (!pd)
48+
return NULL;
49+
50+
if (ibv_cmd_alloc_pd(context, &pd->ibv_pd, &cmd, sizeof(cmd),
51+
&resp.ibv_resp, sizeof(resp))) {
52+
free(pd);
53+
return NULL;
54+
}
55+
56+
atomic_init(&pd->refcount, 1);
57+
pd->pdn = resp.pdn;
58+
xsc_dbg(to_xctx(context)->dbg_fp, XSC_DBG_PD, "pd number:%u\n",
59+
pd->pdn);
60+
61+
return &pd->ibv_pd;
62+
}
63+
64+
int xsc_free_pd(struct ibv_pd *pd)
65+
{
66+
int ret;
67+
struct xsc_pd *xpd = to_xpd(pd);
68+
69+
if (atomic_load(&xpd->refcount) > 1)
70+
return EBUSY;
71+
72+
ret = ibv_cmd_dealloc_pd(pd);
73+
if (ret)
74+
return ret;
75+
76+
xsc_dbg(to_xctx(pd->context)->dbg_fp, XSC_DBG_PD, "dealloc pd\n");
77+
free(xpd);
78+
79+
return 0;
80+
}
81+
82+
struct ibv_mr *xsc_reg_mr(struct ibv_pd *pd, void *addr, size_t length,
83+
u64 hca_va, int acc)
84+
{
85+
struct xsc_mr *mr;
86+
struct ibv_reg_mr cmd;
87+
int ret;
88+
enum ibv_access_flags access = (enum ibv_access_flags)acc;
89+
struct ib_uverbs_reg_mr_resp resp;
90+
91+
mr = calloc(1, sizeof(*mr));
92+
if (!mr)
93+
return NULL;
94+
95+
ret = ibv_cmd_reg_mr(pd, addr, length, hca_va, access, &mr->vmr, &cmd,
96+
sizeof(cmd), &resp, sizeof(resp));
97+
if (ret) {
98+
xsc_free_buf(&mr->buf);
99+
free(mr);
100+
return NULL;
101+
}
102+
mr->alloc_flags = acc;
103+
104+
xsc_dbg(to_xctx(pd->context)->dbg_fp, XSC_DBG_MR, "lkey:%u, rkey:%u\n",
105+
mr->vmr.ibv_mr.lkey, mr->vmr.ibv_mr.rkey);
106+
107+
return &mr->vmr.ibv_mr;
108+
}
109+
110+
void xsc_free_buf(struct xsc_buf *buf)
111+
{
112+
ibv_dofork_range(buf->buf, buf->length);
113+
free(buf->buf);
114+
}
115+
116+
int xsc_dereg_mr(struct verbs_mr *vmr)
117+
{
118+
int ret;
119+
120+
if (vmr->mr_type == IBV_MR_TYPE_NULL_MR)
121+
goto free;
122+
123+
ret = ibv_cmd_dereg_mr(vmr);
124+
if (ret)
125+
return ret;
126+
127+
free:
128+
free(vmr);
129+
return 0;
130+
}
131+
40132
static void xsc_set_fw_version(struct ibv_device_attr *attr,
41133
union xsc_ib_fw_ver *fw_ver)
42134
{

providers/xscale/xscale.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ static void xsc_free_context(struct ibv_context *ibctx);
3333

3434
static const struct verbs_context_ops xsc_ctx_common_ops = {
3535
.query_port = xsc_query_port,
36+
.alloc_pd = xsc_alloc_pd,
37+
.dealloc_pd = xsc_free_pd,
38+
.reg_mr = xsc_reg_mr,
39+
.dereg_mr = xsc_dereg_mr,
3640
.query_device_ex = xsc_query_device_ex,
3741
.free_context = xsc_free_context,
3842
};

0 commit comments

Comments
 (0)