Skip to content

Commit

Permalink
RDMA/rdmavt: Decouple QP and SGE lists allocations
Browse files Browse the repository at this point in the history
The rdmavt QP has fields that are both needed for the control and data
path. Such mixed declaration caused to the very specific allocation flow
with kzalloc_node and SGE list embedded into the struct rvt_qp.

This patch separates QP creation to two: regular memory allocation for the
control path and specific code for the SGE list, while the access to the
later is performed through derefenced pointer.

Such pointer and its context are expected to be in the cache, so
performance difference is expected to be negligible, if any exists.

Link: https://lore.kernel.org/r/f66c1e20ccefba0db3c69c58ca9c897f062b4d1c.1627040189.git.leonro@nvidia.com
Signed-off-by: Leon Romanovsky <[email protected]>
Signed-off-by: Jason Gunthorpe <[email protected]>
  • Loading branch information
rleon authored and jgunthorpe committed Aug 3, 2021
1 parent 0dc0da1 commit 44da373
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 6 deletions.
13 changes: 8 additions & 5 deletions drivers/infiniband/sw/rdmavt/qp.c
Original file line number Diff line number Diff line change
Expand Up @@ -1078,7 +1078,7 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd,
int err;
struct rvt_swqe *swq = NULL;
size_t sz;
size_t sg_list_sz;
size_t sg_list_sz = 0;
struct ib_qp *ret = ERR_PTR(-ENOMEM);
struct rvt_dev_info *rdi = ib_to_rvt(ibpd->device);
void *priv = NULL;
Expand Down Expand Up @@ -1126,8 +1126,6 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd,
if (!swq)
return ERR_PTR(-ENOMEM);

sz = sizeof(*qp);
sg_list_sz = 0;
if (init_attr->srq) {
struct rvt_srq *srq = ibsrq_to_rvtsrq(init_attr->srq);

Expand All @@ -1137,10 +1135,13 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd,
} else if (init_attr->cap.max_recv_sge > 1)
sg_list_sz = sizeof(*qp->r_sg_list) *
(init_attr->cap.max_recv_sge - 1);
qp = kzalloc_node(sz + sg_list_sz, GFP_KERNEL,
rdi->dparms.node);
qp = kzalloc_node(sizeof(*qp), GFP_KERNEL, rdi->dparms.node);
if (!qp)
goto bail_swq;
qp->r_sg_list =
kzalloc_node(sg_list_sz, GFP_KERNEL, rdi->dparms.node);
if (!qp->r_sg_list)
goto bail_qp;
qp->allowed_ops = get_allowed_ops(init_attr->qp_type);

RCU_INIT_POINTER(qp->next, NULL);
Expand Down Expand Up @@ -1328,6 +1329,7 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd,

bail_qp:
kfree(qp->s_ack_queue);
kfree(qp->r_sg_list);
kfree(qp);

bail_swq:
Expand Down Expand Up @@ -1762,6 +1764,7 @@ int rvt_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata)
kvfree(qp->r_rq.kwq);
rdi->driver_f.qp_priv_free(rdi, qp);
kfree(qp->s_ack_queue);
kfree(qp->r_sg_list);
rdma_destroy_ah_attr(&qp->remote_ah_attr);
rdma_destroy_ah_attr(&qp->alt_ah_attr);
free_ud_wq_attr(qp);
Expand Down
2 changes: 1 addition & 1 deletion include/rdma/rdmavt_qp.h
Original file line number Diff line number Diff line change
Expand Up @@ -444,7 +444,7 @@ struct rvt_qp {
/*
* This sge list MUST be last. Do not add anything below here.
*/
struct rvt_sge r_sg_list[] /* verified SGEs */
struct rvt_sge *r_sg_list /* verified SGEs */
____cacheline_aligned_in_smp;
};

Expand Down

0 comments on commit 44da373

Please sign in to comment.