Skip to content

Commit 19098df

Browse files
majdmellanoxdledford
authored andcommitted
IB/mlx5: Refactor mlx5_ib_qp to accommodate other QP types
Extract specific IB QP fields to mlx5_ib_qp_trans structure. The mlx5_core QP object resides in mlx5_ib_qp_base, which all QP types inherit from. When we need to find mlx5_ib_qp using mlx5_core QP (event handling and co), we use a pointer that resides in mlx5_ib_qp_base. In addition, we delete all redundant fields that weren't used anywhere in the code: -doorbell_qpn -sq_max_wqes_per_wr -sq_spare_wqes Signed-off-by: Majd Dibbiny <[email protected]> Reviewed-by: Matan Barak <[email protected]> Signed-off-by: Doug Ledford <[email protected]>
1 parent 146d2f1 commit 19098df

File tree

3 files changed

+147
-95
lines changed

3 files changed

+147
-95
lines changed

drivers/infiniband/hw/mlx5/mlx5_ib.h

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -191,35 +191,44 @@ struct mlx5_ib_pfault {
191191
struct mlx5_pagefault mpfault;
192192
};
193193

194+
struct mlx5_ib_ubuffer {
195+
struct ib_umem *umem;
196+
int buf_size;
197+
u64 buf_addr;
198+
};
199+
200+
struct mlx5_ib_qp_base {
201+
struct mlx5_ib_qp *container_mibqp;
202+
struct mlx5_core_qp mqp;
203+
struct mlx5_ib_ubuffer ubuffer;
204+
};
205+
206+
struct mlx5_ib_qp_trans {
207+
struct mlx5_ib_qp_base base;
208+
u16 xrcdn;
209+
u8 alt_port;
210+
u8 atomic_rd_en;
211+
u8 resp_depth;
212+
};
213+
194214
struct mlx5_ib_qp {
195215
struct ib_qp ibqp;
196-
struct mlx5_core_qp mqp;
216+
struct mlx5_ib_qp_trans trans_qp;
197217
struct mlx5_buf buf;
198218

199219
struct mlx5_db db;
200220
struct mlx5_ib_wq rq;
201221

202-
u32 doorbell_qpn;
203222
u8 sq_signal_bits;
204223
u8 fm_cache;
205-
int sq_max_wqes_per_wr;
206-
int sq_spare_wqes;
207224
struct mlx5_ib_wq sq;
208225

209-
struct ib_umem *umem;
210-
int buf_size;
211-
212226
/* serialize qp state modifications
213227
*/
214228
struct mutex mutex;
215-
u16 xrcdn;
216229
u32 flags;
217230
u8 port;
218-
u8 alt_port;
219-
u8 atomic_rd_en;
220-
u8 resp_depth;
221231
u8 state;
222-
int mlx_type;
223232
int wq_sig;
224233
int scat_cqe;
225234
int max_inline_data;
@@ -489,7 +498,7 @@ static inline struct mlx5_ib_cq *to_mcq(struct ib_cq *ibcq)
489498

490499
static inline struct mlx5_ib_qp *to_mibqp(struct mlx5_core_qp *mqp)
491500
{
492-
return container_of(mqp, struct mlx5_ib_qp, mqp);
501+
return container_of(mqp, struct mlx5_ib_qp_base, mqp)->container_mibqp;
493502
}
494503

495504
static inline struct mlx5_ib_mr *to_mibmr(struct mlx5_core_mr *mmr)
@@ -567,7 +576,8 @@ int mlx5_ib_post_recv(struct ib_qp *ibqp, struct ib_recv_wr *wr,
567576
struct ib_recv_wr **bad_wr);
568577
void *mlx5_get_send_wqe(struct mlx5_ib_qp *qp, int n);
569578
int mlx5_ib_read_user_wqe(struct mlx5_ib_qp *qp, int send, int wqe_index,
570-
void *buffer, u32 length);
579+
void *buffer, u32 length,
580+
struct mlx5_ib_qp_base *base);
571581
struct ib_cq *mlx5_ib_create_cq(struct ib_device *ibdev,
572582
const struct ib_cq_init_attr *attr,
573583
struct ib_ucontext *context,

drivers/infiniband/hw/mlx5/odp.c

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -153,14 +153,16 @@ static struct mlx5_ib_mr *mlx5_ib_odp_find_mr_lkey(struct mlx5_ib_dev *dev,
153153

154154
static void mlx5_ib_page_fault_resume(struct mlx5_ib_qp *qp,
155155
struct mlx5_ib_pfault *pfault,
156-
int error) {
156+
int error)
157+
{
157158
struct mlx5_ib_dev *dev = to_mdev(qp->ibqp.pd->device);
158-
int ret = mlx5_core_page_fault_resume(dev->mdev, qp->mqp.qpn,
159+
u32 qpn = qp->trans_qp.base.mqp.qpn;
160+
int ret = mlx5_core_page_fault_resume(dev->mdev,
161+
qpn,
159162
pfault->mpfault.flags,
160163
error);
161164
if (ret)
162-
pr_err("Failed to resolve the page fault on QP 0x%x\n",
163-
qp->mqp.qpn);
165+
pr_err("Failed to resolve the page fault on QP 0x%x\n", qpn);
164166
}
165167

166168
/*
@@ -391,6 +393,7 @@ static int mlx5_ib_mr_initiator_pfault_handler(
391393
#if defined(DEBUG)
392394
u32 ctrl_wqe_index, ctrl_qpn;
393395
#endif
396+
u32 qpn = qp->trans_qp.base.mqp.qpn;
394397

395398
ds = be32_to_cpu(ctrl->qpn_ds) & MLX5_WQE_CTRL_DS_MASK;
396399
if (ds * MLX5_WQE_DS_UNITS > wqe_length) {
@@ -401,7 +404,7 @@ static int mlx5_ib_mr_initiator_pfault_handler(
401404

402405
if (ds == 0) {
403406
mlx5_ib_err(dev, "Got WQE with zero DS. wqe_index=%x, qpn=%x\n",
404-
wqe_index, qp->mqp.qpn);
407+
wqe_index, qpn);
405408
return -EFAULT;
406409
}
407410

@@ -411,16 +414,16 @@ static int mlx5_ib_mr_initiator_pfault_handler(
411414
MLX5_WQE_CTRL_WQE_INDEX_SHIFT;
412415
if (wqe_index != ctrl_wqe_index) {
413416
mlx5_ib_err(dev, "Got WQE with invalid wqe_index. wqe_index=0x%x, qpn=0x%x ctrl->wqe_index=0x%x\n",
414-
wqe_index, qp->mqp.qpn,
417+
wqe_index, qpn,
415418
ctrl_wqe_index);
416419
return -EFAULT;
417420
}
418421

419422
ctrl_qpn = (be32_to_cpu(ctrl->qpn_ds) & MLX5_WQE_CTRL_QPN_MASK) >>
420423
MLX5_WQE_CTRL_QPN_SHIFT;
421-
if (qp->mqp.qpn != ctrl_qpn) {
424+
if (qpn != ctrl_qpn) {
422425
mlx5_ib_err(dev, "Got WQE with incorrect QP number. wqe_index=0x%x, qpn=0x%x ctrl->qpn=0x%x\n",
423-
wqe_index, qp->mqp.qpn,
426+
wqe_index, qpn,
424427
ctrl_qpn);
425428
return -EFAULT;
426429
}
@@ -537,6 +540,7 @@ static void mlx5_ib_mr_wqe_pfault_handler(struct mlx5_ib_qp *qp,
537540
int resume_with_error = 0;
538541
u16 wqe_index = pfault->mpfault.wqe.wqe_index;
539542
int requestor = pfault->mpfault.flags & MLX5_PFAULT_REQUESTOR;
543+
u32 qpn = qp->trans_qp.base.mqp.qpn;
540544

541545
buffer = (char *)__get_free_page(GFP_KERNEL);
542546
if (!buffer) {
@@ -546,10 +550,10 @@ static void mlx5_ib_mr_wqe_pfault_handler(struct mlx5_ib_qp *qp,
546550
}
547551

548552
ret = mlx5_ib_read_user_wqe(qp, requestor, wqe_index, buffer,
549-
PAGE_SIZE);
553+
PAGE_SIZE, &qp->trans_qp.base);
550554
if (ret < 0) {
551555
mlx5_ib_err(dev, "Failed reading a WQE following page fault, error=%x, wqe_index=%x, qpn=%x\n",
552-
-ret, wqe_index, qp->mqp.qpn);
556+
-ret, wqe_index, qpn);
553557
resume_with_error = 1;
554558
goto resolve_page_fault;
555559
}
@@ -586,7 +590,8 @@ static void mlx5_ib_mr_wqe_pfault_handler(struct mlx5_ib_qp *qp,
586590
resolve_page_fault:
587591
mlx5_ib_page_fault_resume(qp, pfault, resume_with_error);
588592
mlx5_ib_dbg(dev, "PAGE FAULT completed. QP 0x%x resume_with_error=%d, flags: 0x%x\n",
589-
qp->mqp.qpn, resume_with_error, pfault->mpfault.flags);
593+
qpn, resume_with_error,
594+
pfault->mpfault.flags);
590595

591596
free_page((unsigned long)buffer);
592597
}
@@ -753,7 +758,7 @@ void mlx5_ib_odp_create_qp(struct mlx5_ib_qp *qp)
753758
qp->disable_page_faults = 1;
754759
spin_lock_init(&qp->disable_page_faults_lock);
755760

756-
qp->mqp.pfault_handler = mlx5_ib_pfault_handler;
761+
qp->trans_qp.base.mqp.pfault_handler = mlx5_ib_pfault_handler;
757762

758763
for (i = 0; i < MLX5_IB_PAGEFAULT_CONTEXTS; ++i)
759764
INIT_WORK(&qp->pagefaults[i].work, mlx5_ib_qp_pfault_action);

0 commit comments

Comments
 (0)