Skip to content

Commit b6db3f7

Browse files
solbjorndavem330
authored andcommitted
qed: simplify chain allocation with init params struct
To simplify qed_chain_alloc() prototype and call sites, introduce struct qed_chain_init_params to specify chain params, and pass a pointer to filled struct to the actual qed_chain_alloc() instead of a long list of separate arguments. Signed-off-by: Alexander Lobakin <[email protected]> Signed-off-by: Igor Russkikh <[email protected]> Signed-off-by: Michal Kalderon <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent c3a321b commit b6db3f7

File tree

10 files changed

+242
-233
lines changed

10 files changed

+242
-233
lines changed

drivers/infiniband/hw/qedr/main.c

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -346,9 +346,14 @@ static void qedr_free_resources(struct qedr_dev *dev)
346346

347347
static int qedr_alloc_resources(struct qedr_dev *dev)
348348
{
349+
struct qed_chain_init_params params = {
350+
.mode = QED_CHAIN_MODE_PBL,
351+
.intended_use = QED_CHAIN_USE_TO_CONSUME,
352+
.cnt_type = QED_CHAIN_CNT_TYPE_U16,
353+
.elem_size = sizeof(struct regpair *),
354+
};
349355
struct qedr_cnq *cnq;
350356
__le16 *cons_pi;
351-
u16 n_entries;
352357
int i, rc;
353358

354359
dev->sgid_tbl = kcalloc(QEDR_MAX_SGID, sizeof(union ib_gid),
@@ -382,7 +387,9 @@ static int qedr_alloc_resources(struct qedr_dev *dev)
382387
dev->sb_start = dev->ops->rdma_get_start_sb(dev->cdev);
383388

384389
/* Allocate CNQ PBLs */
385-
n_entries = min_t(u32, QED_RDMA_MAX_CNQ_SIZE, QEDR_ROCE_MAX_CNQ_SIZE);
390+
params.num_elems = min_t(u32, QED_RDMA_MAX_CNQ_SIZE,
391+
QEDR_ROCE_MAX_CNQ_SIZE);
392+
386393
for (i = 0; i < dev->num_cnq; i++) {
387394
cnq = &dev->cnq_array[i];
388395

@@ -391,13 +398,8 @@ static int qedr_alloc_resources(struct qedr_dev *dev)
391398
if (rc)
392399
goto err3;
393400

394-
rc = dev->ops->common->chain_alloc(dev->cdev,
395-
QED_CHAIN_USE_TO_CONSUME,
396-
QED_CHAIN_MODE_PBL,
397-
QED_CHAIN_CNT_TYPE_U16,
398-
n_entries,
399-
sizeof(struct regpair *),
400-
&cnq->pbl, NULL);
401+
rc = dev->ops->common->chain_alloc(dev->cdev, &cnq->pbl,
402+
&params);
401403
if (rc)
402404
goto err4;
403405

drivers/infiniband/hw/qedr/verbs.c

Lines changed: 47 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -891,6 +891,12 @@ int qedr_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
891891
udata, struct qedr_ucontext, ibucontext);
892892
struct qed_rdma_destroy_cq_out_params destroy_oparams;
893893
struct qed_rdma_destroy_cq_in_params destroy_iparams;
894+
struct qed_chain_init_params chain_params = {
895+
.mode = QED_CHAIN_MODE_PBL,
896+
.intended_use = QED_CHAIN_USE_TO_CONSUME,
897+
.cnt_type = QED_CHAIN_CNT_TYPE_U32,
898+
.elem_size = sizeof(union rdma_cqe),
899+
};
894900
struct qedr_dev *dev = get_qedr_dev(ibdev);
895901
struct qed_rdma_create_cq_in_params params;
896902
struct qedr_create_cq_ureq ureq = {};
@@ -917,6 +923,7 @@ int qedr_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
917923

918924
chain_entries = qedr_align_cq_entries(entries);
919925
chain_entries = min_t(int, chain_entries, QEDR_MAX_CQES);
926+
chain_params.num_elems = chain_entries;
920927

921928
/* calc db offset. user will add DPI base, kernel will add db addr */
922929
db_offset = DB_ADDR_SHIFT(DQ_PWM_OFFSET_UCM_RDMA_CQ_CONS_32BIT);
@@ -951,13 +958,8 @@ int qedr_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
951958
} else {
952959
cq->cq_type = QEDR_CQ_TYPE_KERNEL;
953960

954-
rc = dev->ops->common->chain_alloc(dev->cdev,
955-
QED_CHAIN_USE_TO_CONSUME,
956-
QED_CHAIN_MODE_PBL,
957-
QED_CHAIN_CNT_TYPE_U32,
958-
chain_entries,
959-
sizeof(union rdma_cqe),
960-
&cq->pbl, NULL);
961+
rc = dev->ops->common->chain_alloc(dev->cdev, &cq->pbl,
962+
&chain_params);
961963
if (rc)
962964
goto err0;
963965

@@ -1446,6 +1448,12 @@ static int qedr_alloc_srq_kernel_params(struct qedr_srq *srq,
14461448
struct ib_srq_init_attr *init_attr)
14471449
{
14481450
struct qedr_srq_hwq_info *hw_srq = &srq->hw_srq;
1451+
struct qed_chain_init_params params = {
1452+
.mode = QED_CHAIN_MODE_PBL,
1453+
.intended_use = QED_CHAIN_USE_TO_CONSUME_PRODUCE,
1454+
.cnt_type = QED_CHAIN_CNT_TYPE_U32,
1455+
.elem_size = QEDR_SRQ_WQE_ELEM_SIZE,
1456+
};
14491457
dma_addr_t phy_prod_pair_addr;
14501458
u32 num_elems;
14511459
void *va;
@@ -1464,13 +1472,9 @@ static int qedr_alloc_srq_kernel_params(struct qedr_srq *srq,
14641472
hw_srq->virt_prod_pair_addr = va;
14651473

14661474
num_elems = init_attr->attr.max_wr * RDMA_MAX_SRQ_WQE_SIZE;
1467-
rc = dev->ops->common->chain_alloc(dev->cdev,
1468-
QED_CHAIN_USE_TO_CONSUME_PRODUCE,
1469-
QED_CHAIN_MODE_PBL,
1470-
QED_CHAIN_CNT_TYPE_U32,
1471-
num_elems,
1472-
QEDR_SRQ_WQE_ELEM_SIZE,
1473-
&hw_srq->pbl, NULL);
1475+
params.num_elems = num_elems;
1476+
1477+
rc = dev->ops->common->chain_alloc(dev->cdev, &hw_srq->pbl, &params);
14741478
if (rc)
14751479
goto err0;
14761480

@@ -1901,29 +1905,28 @@ qedr_roce_create_kernel_qp(struct qedr_dev *dev,
19011905
u32 n_sq_elems, u32 n_rq_elems)
19021906
{
19031907
struct qed_rdma_create_qp_out_params out_params;
1908+
struct qed_chain_init_params params = {
1909+
.mode = QED_CHAIN_MODE_PBL,
1910+
.cnt_type = QED_CHAIN_CNT_TYPE_U32,
1911+
};
19041912
int rc;
19051913

1906-
rc = dev->ops->common->chain_alloc(dev->cdev,
1907-
QED_CHAIN_USE_TO_PRODUCE,
1908-
QED_CHAIN_MODE_PBL,
1909-
QED_CHAIN_CNT_TYPE_U32,
1910-
n_sq_elems,
1911-
QEDR_SQE_ELEMENT_SIZE,
1912-
&qp->sq.pbl, NULL);
1914+
params.intended_use = QED_CHAIN_USE_TO_PRODUCE;
1915+
params.num_elems = n_sq_elems;
1916+
params.elem_size = QEDR_SQE_ELEMENT_SIZE;
19131917

1918+
rc = dev->ops->common->chain_alloc(dev->cdev, &qp->sq.pbl, &params);
19141919
if (rc)
19151920
return rc;
19161921

19171922
in_params->sq_num_pages = qed_chain_get_page_cnt(&qp->sq.pbl);
19181923
in_params->sq_pbl_ptr = qed_chain_get_pbl_phys(&qp->sq.pbl);
19191924

1920-
rc = dev->ops->common->chain_alloc(dev->cdev,
1921-
QED_CHAIN_USE_TO_CONSUME_PRODUCE,
1922-
QED_CHAIN_MODE_PBL,
1923-
QED_CHAIN_CNT_TYPE_U32,
1924-
n_rq_elems,
1925-
QEDR_RQE_ELEMENT_SIZE,
1926-
&qp->rq.pbl, NULL);
1925+
params.intended_use = QED_CHAIN_USE_TO_CONSUME_PRODUCE;
1926+
params.elem_size = n_rq_elems;
1927+
params.elem_size = QEDR_RQE_ELEMENT_SIZE;
1928+
1929+
rc = dev->ops->common->chain_alloc(dev->cdev, &qp->rq.pbl, &params);
19271930
if (rc)
19281931
return rc;
19291932

@@ -1949,7 +1952,10 @@ qedr_iwarp_create_kernel_qp(struct qedr_dev *dev,
19491952
u32 n_sq_elems, u32 n_rq_elems)
19501953
{
19511954
struct qed_rdma_create_qp_out_params out_params;
1952-
struct qed_chain_ext_pbl ext_pbl;
1955+
struct qed_chain_init_params params = {
1956+
.mode = QED_CHAIN_MODE_PBL,
1957+
.cnt_type = QED_CHAIN_CNT_TYPE_U32,
1958+
};
19531959
int rc;
19541960

19551961
in_params->sq_num_pages = QED_CHAIN_PAGE_CNT(n_sq_elems,
@@ -1966,31 +1972,24 @@ qedr_iwarp_create_kernel_qp(struct qedr_dev *dev,
19661972
return -EINVAL;
19671973

19681974
/* Now we allocate the chain */
1969-
ext_pbl.p_pbl_virt = out_params.sq_pbl_virt;
1970-
ext_pbl.p_pbl_phys = out_params.sq_pbl_phys;
19711975

1972-
rc = dev->ops->common->chain_alloc(dev->cdev,
1973-
QED_CHAIN_USE_TO_PRODUCE,
1974-
QED_CHAIN_MODE_PBL,
1975-
QED_CHAIN_CNT_TYPE_U32,
1976-
n_sq_elems,
1977-
QEDR_SQE_ELEMENT_SIZE,
1978-
&qp->sq.pbl, &ext_pbl);
1976+
params.intended_use = QED_CHAIN_USE_TO_PRODUCE;
1977+
params.num_elems = n_sq_elems;
1978+
params.elem_size = QEDR_SQE_ELEMENT_SIZE;
1979+
params.ext_pbl_virt = out_params.sq_pbl_virt;
1980+
params.ext_pbl_phys = out_params.sq_pbl_phys;
19791981

1982+
rc = dev->ops->common->chain_alloc(dev->cdev, &qp->sq.pbl, &params);
19801983
if (rc)
19811984
goto err;
19821985

1983-
ext_pbl.p_pbl_virt = out_params.rq_pbl_virt;
1984-
ext_pbl.p_pbl_phys = out_params.rq_pbl_phys;
1985-
1986-
rc = dev->ops->common->chain_alloc(dev->cdev,
1987-
QED_CHAIN_USE_TO_CONSUME_PRODUCE,
1988-
QED_CHAIN_MODE_PBL,
1989-
QED_CHAIN_CNT_TYPE_U32,
1990-
n_rq_elems,
1991-
QEDR_RQE_ELEMENT_SIZE,
1992-
&qp->rq.pbl, &ext_pbl);
1986+
params.intended_use = QED_CHAIN_USE_TO_CONSUME_PRODUCE;
1987+
params.num_elems = n_rq_elems;
1988+
params.elem_size = QEDR_RQE_ELEMENT_SIZE;
1989+
params.ext_pbl_virt = out_params.rq_pbl_virt;
1990+
params.ext_pbl_phys = out_params.rq_pbl_phys;
19931991

1992+
rc = dev->ops->common->chain_alloc(dev->cdev, &qp->rq.pbl, &params);
19941993
if (rc)
19951994
goto err;
19961995

drivers/net/ethernet/qlogic/qed/qed_chain.c

Lines changed: 45 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,22 @@
77

88
#include "qed_dev_api.h"
99

10-
static void qed_chain_init_params(struct qed_chain *chain,
11-
u32 page_cnt, u8 elem_size,
12-
enum qed_chain_use_mode intended_use,
13-
enum qed_chain_mode mode,
14-
enum qed_chain_cnt_type cnt_type,
15-
const struct qed_chain_ext_pbl *ext_pbl)
10+
static void qed_chain_init(struct qed_chain *chain,
11+
const struct qed_chain_init_params *params,
12+
u32 page_cnt)
1613
{
1714
memset(chain, 0, sizeof(*chain));
1815

19-
chain->elem_size = elem_size;
20-
chain->intended_use = intended_use;
21-
chain->mode = mode;
22-
chain->cnt_type = cnt_type;
16+
chain->elem_size = params->elem_size;
17+
chain->intended_use = params->intended_use;
18+
chain->mode = params->mode;
19+
chain->cnt_type = params->cnt_type;
2320

24-
chain->elem_per_page = ELEMS_PER_PAGE(elem_size);
25-
chain->usable_per_page = USABLE_ELEMS_PER_PAGE(elem_size, mode);
26-
chain->elem_unusable = UNUSABLE_ELEMS_PER_PAGE(elem_size, mode);
21+
chain->elem_per_page = ELEMS_PER_PAGE(params->elem_size);
22+
chain->usable_per_page = USABLE_ELEMS_PER_PAGE(params->elem_size,
23+
params->mode);
24+
chain->elem_unusable = UNUSABLE_ELEMS_PER_PAGE(params->elem_size,
25+
params->mode);
2726

2827
chain->elem_per_page_mask = chain->elem_per_page - 1;
2928
chain->next_page_mask = chain->usable_per_page &
@@ -33,9 +32,9 @@ static void qed_chain_init_params(struct qed_chain *chain,
3332
chain->capacity = chain->usable_per_page * page_cnt;
3433
chain->size = chain->elem_per_page * page_cnt;
3534

36-
if (ext_pbl && ext_pbl->p_pbl_virt) {
37-
chain->pbl_sp.table_virt = ext_pbl->p_pbl_virt;
38-
chain->pbl_sp.table_phys = ext_pbl->p_pbl_phys;
35+
if (params->ext_pbl_virt) {
36+
chain->pbl_sp.table_virt = params->ext_pbl_virt;
37+
chain->pbl_sp.table_phys = params->ext_pbl_phys;
3938

4039
chain->b_external_pbl = true;
4140
}
@@ -154,18 +153,24 @@ void qed_chain_free(struct qed_dev *cdev, struct qed_chain *chain)
154153

155154
static int
156155
qed_chain_alloc_sanity_check(struct qed_dev *cdev,
157-
enum qed_chain_cnt_type cnt_type,
158-
size_t elem_size, u32 page_cnt)
156+
const struct qed_chain_init_params *params,
157+
u32 page_cnt)
159158
{
160-
u64 chain_size = ELEMS_PER_PAGE(elem_size) * page_cnt;
159+
u64 chain_size;
160+
161+
chain_size = ELEMS_PER_PAGE(params->elem_size);
162+
chain_size *= page_cnt;
163+
164+
if (!chain_size)
165+
return -EINVAL;
161166

162167
/* The actual chain size can be larger than the maximal possible value
163168
* after rounding up the requested elements number to pages, and after
164169
* taking into account the unusuable elements (next-ptr elements).
165170
* The size of a "u16" chain can be (U16_MAX + 1) since the chain
166171
* size/capacity fields are of u32 type.
167172
*/
168-
switch (cnt_type) {
173+
switch (params->cnt_type) {
169174
case QED_CHAIN_CNT_TYPE_U16:
170175
if (chain_size > U16_MAX + 1)
171176
break;
@@ -298,37 +303,42 @@ static int qed_chain_alloc_pbl(struct qed_dev *cdev, struct qed_chain *chain)
298303
return 0;
299304
}
300305

301-
int qed_chain_alloc(struct qed_dev *cdev,
302-
enum qed_chain_use_mode intended_use,
303-
enum qed_chain_mode mode,
304-
enum qed_chain_cnt_type cnt_type,
305-
u32 num_elems,
306-
size_t elem_size,
307-
struct qed_chain *chain,
308-
struct qed_chain_ext_pbl *ext_pbl)
306+
/**
307+
* qed_chain_alloc() - Allocate and initialize a chain.
308+
*
309+
* @cdev: Main device structure.
310+
* @chain: Chain to be processed.
311+
* @params: Chain initialization parameters.
312+
*
313+
* Return: 0 on success, negative errno otherwise.
314+
*/
315+
int qed_chain_alloc(struct qed_dev *cdev, struct qed_chain *chain,
316+
struct qed_chain_init_params *params)
309317
{
310318
u32 page_cnt;
311319
int rc;
312320

313-
if (mode == QED_CHAIN_MODE_SINGLE)
321+
if (params->mode == QED_CHAIN_MODE_SINGLE)
314322
page_cnt = 1;
315323
else
316-
page_cnt = QED_CHAIN_PAGE_CNT(num_elems, elem_size, mode);
324+
page_cnt = QED_CHAIN_PAGE_CNT(params->num_elems,
325+
params->elem_size,
326+
params->mode);
317327

318-
rc = qed_chain_alloc_sanity_check(cdev, cnt_type, elem_size, page_cnt);
328+
rc = qed_chain_alloc_sanity_check(cdev, params, page_cnt);
319329
if (rc) {
320330
DP_NOTICE(cdev,
321331
"Cannot allocate a chain with the given arguments:\n");
322332
DP_NOTICE(cdev,
323333
"[use_mode %d, mode %d, cnt_type %d, num_elems %d, elem_size %zu]\n",
324-
intended_use, mode, cnt_type, num_elems, elem_size);
334+
params->intended_use, params->mode, params->cnt_type,
335+
params->num_elems, params->elem_size);
325336
return rc;
326337
}
327338

328-
qed_chain_init_params(chain, page_cnt, elem_size, intended_use, mode,
329-
cnt_type, ext_pbl);
339+
qed_chain_init(chain, params, page_cnt);
330340

331-
switch (mode) {
341+
switch (params->mode) {
332342
case QED_CHAIN_MODE_NEXT_PTR:
333343
rc = qed_chain_alloc_next_ptr(cdev, chain);
334344
break;

drivers/net/ethernet/qlogic/qed/qed_dev_api.h

Lines changed: 3 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -254,35 +254,9 @@ int qed_dmae_host2host(struct qed_hwfn *p_hwfn,
254254
dma_addr_t dest_addr,
255255
u32 size_in_dwords, struct qed_dmae_params *p_params);
256256

257-
/**
258-
* @brief qed_chain_alloc - Allocate and initialize a chain
259-
*
260-
* @param p_hwfn
261-
* @param intended_use
262-
* @param mode
263-
* @param num_elems
264-
* @param elem_size
265-
* @param p_chain
266-
* @param ext_pbl - a possible external PBL
267-
*
268-
* @return int
269-
*/
270-
int
271-
qed_chain_alloc(struct qed_dev *cdev,
272-
enum qed_chain_use_mode intended_use,
273-
enum qed_chain_mode mode,
274-
enum qed_chain_cnt_type cnt_type,
275-
u32 num_elems,
276-
size_t elem_size,
277-
struct qed_chain *p_chain, struct qed_chain_ext_pbl *ext_pbl);
278-
279-
/**
280-
* @brief qed_chain_free - Free chain DMA memory
281-
*
282-
* @param p_hwfn
283-
* @param p_chain
284-
*/
285-
void qed_chain_free(struct qed_dev *cdev, struct qed_chain *p_chain);
257+
int qed_chain_alloc(struct qed_dev *cdev, struct qed_chain *chain,
258+
struct qed_chain_init_params *params);
259+
void qed_chain_free(struct qed_dev *cdev, struct qed_chain *chain);
286260

287261
/**
288262
* @@brief qed_fw_l2_queue - Get absolute L2 queue ID

0 commit comments

Comments
 (0)