Skip to content

Commit 6d83d13

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 f1b1696 commit 6d83d13

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
@@ -39,6 +39,98 @@ int xsc_query_port(struct ibv_context *context, u8 port,
3939
return ibv_cmd_query_port(context, port, attr, &cmd, sizeof(cmd));
4040
}
4141

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

providers/xscale/xscale.c

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

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

0 commit comments

Comments
 (0)