Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma
Pull rdma updates from Jason Gunthorpe: "A smaller cycle this time. Notably we see another new driver, 'Soft iWarp', and the deletion of an ancient unused driver for nes. - Revise and simplify the signature offload RDMA MR APIs - More progress on hoisting object allocation boiler plate code out of the drivers - Driver bug fixes and revisions for hns, hfi1, efa, cxgb4, qib, i40iw - Tree wide cleanups: struct_size, put_user_page, xarray, rst doc conversion - Removal of obsolete ib_ucm chardev and nes driver - netlink based discovery of chardevs and autoloading of the modules providing them - Move more of the rdamvt/hfi1 uapi to include/uapi/rdma - New driver 'siw' for software based iWarp running on top of netdev, much like rxe's software RoCE. - mlx5 feature to report events in their raw devx format to userspace - Expose per-object counters through rdma tool - Adaptive interrupt moderation for RDMA (DIM), sharing the DIM core from netdev" * tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma: (194 commits) RMDA/siw: Require a 64 bit arch RDMA/siw: Mark expected switch fall-throughs RDMA/core: Fix -Wunused-const-variable warnings rdma/siw: Remove set but not used variable 's' rdma/siw: Add missing dependencies on LIBCRC32C and DMA_VIRT_OPS RDMA/siw: Add missing rtnl_lock around access to ifa rdma/siw: Use proper enumerated type in map_cqe_status RDMA/siw: Remove unnecessary kthread create/destroy printouts IB/rdmavt: Fix variable shadowing issue in rvt_create_cq RDMA/core: Fix race when resolving IP address RDMA/core: Make rdma_counter.h compile stand alone IB/core: Work on the caller socket net namespace in nldev_newlink() RDMA/rxe: Fill in wc byte_len with IB_WC_RECV_RDMA_WITH_IMM RDMA/mlx5: Set RDMA DIM to be enabled by default RDMA/nldev: Added configuration of RDMA dynamic interrupt moderation to netlink RDMA/core: Provide RDMA DIM support for ULPs linux/dim: Implement RDMA adaptive moderation (DIM) IB/mlx5: Report correctly tag matching rendezvous capability docs: infiniband: add it to the driver-api bookset IB/mlx5: Implement VHCA tunnel mechanism in DEVX ...
Šī revīzija ir iekļauta:
@@ -183,6 +183,10 @@ static void qedr_roce_register_device(struct qedr_dev *dev)
|
||||
}
|
||||
|
||||
static const struct ib_device_ops qedr_dev_ops = {
|
||||
.owner = THIS_MODULE,
|
||||
.driver_id = RDMA_DRIVER_QEDR,
|
||||
.uverbs_abi_ver = QEDR_ABI_VERSION,
|
||||
|
||||
.alloc_mr = qedr_alloc_mr,
|
||||
.alloc_pd = qedr_alloc_pd,
|
||||
.alloc_ucontext = qedr_alloc_ucontext,
|
||||
@@ -220,6 +224,7 @@ static const struct ib_device_ops qedr_dev_ops = {
|
||||
.resize_cq = qedr_resize_cq,
|
||||
|
||||
INIT_RDMA_OBJ_SIZE(ib_ah, qedr_ah, ibah),
|
||||
INIT_RDMA_OBJ_SIZE(ib_cq, qedr_cq, ibcq),
|
||||
INIT_RDMA_OBJ_SIZE(ib_pd, qedr_pd, ibpd),
|
||||
INIT_RDMA_OBJ_SIZE(ib_srq, qedr_srq, ibsrq),
|
||||
INIT_RDMA_OBJ_SIZE(ib_ucontext, qedr_ucontext, ibucontext),
|
||||
@@ -231,8 +236,6 @@ static int qedr_register_device(struct qedr_dev *dev)
|
||||
|
||||
dev->ibdev.node_guid = dev->attr.node_guid;
|
||||
memcpy(dev->ibdev.node_desc, QEDR_NODE_DESC, sizeof(QEDR_NODE_DESC));
|
||||
dev->ibdev.owner = THIS_MODULE;
|
||||
dev->ibdev.uverbs_abi_ver = QEDR_ABI_VERSION;
|
||||
|
||||
dev->ibdev.uverbs_cmd_mask = QEDR_UVERBS(GET_CONTEXT) |
|
||||
QEDR_UVERBS(QUERY_DEVICE) |
|
||||
@@ -274,7 +277,6 @@ static int qedr_register_device(struct qedr_dev *dev)
|
||||
rdma_set_device_sysfs_group(&dev->ibdev, &qedr_attr_group);
|
||||
ib_set_device_ops(&dev->ibdev, &qedr_dev_ops);
|
||||
|
||||
dev->ibdev.driver_id = RDMA_DRIVER_QEDR;
|
||||
rc = ib_device_set_netdev(&dev->ibdev, dev->ndev, 1);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
@@ -159,54 +159,47 @@ int qedr_query_device(struct ib_device *ibdev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define QEDR_SPEED_SDR (1)
|
||||
#define QEDR_SPEED_DDR (2)
|
||||
#define QEDR_SPEED_QDR (4)
|
||||
#define QEDR_SPEED_FDR10 (8)
|
||||
#define QEDR_SPEED_FDR (16)
|
||||
#define QEDR_SPEED_EDR (32)
|
||||
|
||||
static inline void get_link_speed_and_width(int speed, u8 *ib_speed,
|
||||
u8 *ib_width)
|
||||
{
|
||||
switch (speed) {
|
||||
case 1000:
|
||||
*ib_speed = QEDR_SPEED_SDR;
|
||||
*ib_speed = IB_SPEED_SDR;
|
||||
*ib_width = IB_WIDTH_1X;
|
||||
break;
|
||||
case 10000:
|
||||
*ib_speed = QEDR_SPEED_QDR;
|
||||
*ib_speed = IB_SPEED_QDR;
|
||||
*ib_width = IB_WIDTH_1X;
|
||||
break;
|
||||
|
||||
case 20000:
|
||||
*ib_speed = QEDR_SPEED_DDR;
|
||||
*ib_speed = IB_SPEED_DDR;
|
||||
*ib_width = IB_WIDTH_4X;
|
||||
break;
|
||||
|
||||
case 25000:
|
||||
*ib_speed = QEDR_SPEED_EDR;
|
||||
*ib_speed = IB_SPEED_EDR;
|
||||
*ib_width = IB_WIDTH_1X;
|
||||
break;
|
||||
|
||||
case 40000:
|
||||
*ib_speed = QEDR_SPEED_QDR;
|
||||
*ib_speed = IB_SPEED_QDR;
|
||||
*ib_width = IB_WIDTH_4X;
|
||||
break;
|
||||
|
||||
case 50000:
|
||||
*ib_speed = QEDR_SPEED_QDR;
|
||||
*ib_width = IB_WIDTH_4X;
|
||||
*ib_speed = IB_SPEED_HDR;
|
||||
*ib_width = IB_WIDTH_1X;
|
||||
break;
|
||||
|
||||
case 100000:
|
||||
*ib_speed = QEDR_SPEED_EDR;
|
||||
*ib_speed = IB_SPEED_EDR;
|
||||
*ib_width = IB_WIDTH_4X;
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Unsupported */
|
||||
*ib_speed = QEDR_SPEED_SDR;
|
||||
*ib_speed = IB_SPEED_SDR;
|
||||
*ib_width = IB_WIDTH_1X;
|
||||
}
|
||||
}
|
||||
@@ -813,20 +806,20 @@ int qedr_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags)
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct ib_cq *qedr_create_cq(struct ib_device *ibdev,
|
||||
const struct ib_cq_init_attr *attr,
|
||||
struct ib_udata *udata)
|
||||
int qedr_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
|
||||
struct ib_udata *udata)
|
||||
{
|
||||
struct ib_device *ibdev = ibcq->device;
|
||||
struct qedr_ucontext *ctx = rdma_udata_to_drv_context(
|
||||
udata, struct qedr_ucontext, ibucontext);
|
||||
struct qed_rdma_destroy_cq_out_params destroy_oparams;
|
||||
struct qed_rdma_destroy_cq_in_params destroy_iparams;
|
||||
struct qedr_dev *dev = get_qedr_dev(ibdev);
|
||||
struct qed_rdma_create_cq_in_params params;
|
||||
struct qedr_create_cq_ureq ureq;
|
||||
struct qedr_create_cq_ureq ureq = {};
|
||||
int vector = attr->comp_vector;
|
||||
int entries = attr->cqe;
|
||||
struct qedr_cq *cq;
|
||||
struct qedr_cq *cq = get_qedr_cq(ibcq);
|
||||
int chain_entries;
|
||||
int page_cnt;
|
||||
u64 pbl_ptr;
|
||||
@@ -841,18 +834,13 @@ struct ib_cq *qedr_create_cq(struct ib_device *ibdev,
|
||||
DP_ERR(dev,
|
||||
"create cq: the number of entries %d is too high. Must be equal or below %d.\n",
|
||||
entries, QEDR_MAX_CQES);
|
||||
return ERR_PTR(-EINVAL);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
chain_entries = qedr_align_cq_entries(entries);
|
||||
chain_entries = min_t(int, chain_entries, QEDR_MAX_CQES);
|
||||
|
||||
cq = kzalloc(sizeof(*cq), GFP_KERNEL);
|
||||
if (!cq)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
if (udata) {
|
||||
memset(&ureq, 0, sizeof(ureq));
|
||||
if (ib_copy_from_udata(&ureq, udata, sizeof(ureq))) {
|
||||
DP_ERR(dev,
|
||||
"create cq: problem copying data from user space\n");
|
||||
@@ -930,7 +918,7 @@ struct ib_cq *qedr_create_cq(struct ib_device *ibdev,
|
||||
"create cq: icid=0x%0x, addr=%p, size(entries)=0x%0x\n",
|
||||
cq->icid, cq, params.cq_size);
|
||||
|
||||
return &cq->ibcq;
|
||||
return 0;
|
||||
|
||||
err3:
|
||||
destroy_iparams.icid = cq->icid;
|
||||
@@ -945,8 +933,7 @@ err1:
|
||||
if (udata)
|
||||
ib_umem_release(cq->q.umem);
|
||||
err0:
|
||||
kfree(cq);
|
||||
return ERR_PTR(-EINVAL);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
int qedr_resize_cq(struct ib_cq *ibcq, int new_cnt, struct ib_udata *udata)
|
||||
@@ -962,14 +949,13 @@ int qedr_resize_cq(struct ib_cq *ibcq, int new_cnt, struct ib_udata *udata)
|
||||
#define QEDR_DESTROY_CQ_MAX_ITERATIONS (10)
|
||||
#define QEDR_DESTROY_CQ_ITER_DURATION (10)
|
||||
|
||||
int qedr_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata)
|
||||
void qedr_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata)
|
||||
{
|
||||
struct qedr_dev *dev = get_qedr_dev(ibcq->device);
|
||||
struct qed_rdma_destroy_cq_out_params oparams;
|
||||
struct qed_rdma_destroy_cq_in_params iparams;
|
||||
struct qedr_cq *cq = get_qedr_cq(ibcq);
|
||||
int iter;
|
||||
int rc;
|
||||
|
||||
DP_DEBUG(dev, QEDR_MSG_CQ, "destroy cq %p (icid=%d)\n", cq, cq->icid);
|
||||
|
||||
@@ -977,13 +963,10 @@ int qedr_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata)
|
||||
|
||||
/* GSIs CQs are handled by driver, so they don't exist in the FW */
|
||||
if (cq->cq_type == QEDR_CQ_TYPE_GSI)
|
||||
goto done;
|
||||
return;
|
||||
|
||||
iparams.icid = cq->icid;
|
||||
rc = dev->ops->rdma_destroy_cq(dev->rdma_ctx, &iparams, &oparams);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
dev->ops->rdma_destroy_cq(dev->rdma_ctx, &iparams, &oparams);
|
||||
dev->ops->common->chain_free(dev->cdev, &cq->pbl);
|
||||
|
||||
if (udata) {
|
||||
@@ -1014,27 +997,11 @@ int qedr_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata)
|
||||
iter--;
|
||||
}
|
||||
|
||||
if (oparams.num_cq_notif != cq->cnq_notif)
|
||||
goto err;
|
||||
|
||||
/* Note that we don't need to have explicit code to wait for the
|
||||
* completion of the event handler because it is invoked from the EQ.
|
||||
* Since the destroy CQ ramrod has also been received on the EQ we can
|
||||
* be certain that there's no event handler in process.
|
||||
*/
|
||||
done:
|
||||
cq->sig = ~cq->sig;
|
||||
|
||||
kfree(cq);
|
||||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
DP_ERR(dev,
|
||||
"CQ %p (icid=%d) not freed, expecting %d ints but got %d ints\n",
|
||||
cq, cq->icid, oparams.num_cq_notif, cq->cnq_notif);
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int get_gid_info_from_table(struct ib_qp *ibqp,
|
||||
@@ -1605,12 +1572,10 @@ qedr_iwarp_populate_user_qp(struct qedr_dev *dev,
|
||||
|
||||
static void qedr_cleanup_user(struct qedr_dev *dev, struct qedr_qp *qp)
|
||||
{
|
||||
if (qp->usq.umem)
|
||||
ib_umem_release(qp->usq.umem);
|
||||
ib_umem_release(qp->usq.umem);
|
||||
qp->usq.umem = NULL;
|
||||
|
||||
if (qp->urq.umem)
|
||||
ib_umem_release(qp->urq.umem);
|
||||
ib_umem_release(qp->urq.umem);
|
||||
qp->urq.umem = NULL;
|
||||
}
|
||||
|
||||
@@ -2713,8 +2678,7 @@ int qedr_dereg_mr(struct ib_mr *ib_mr, struct ib_udata *udata)
|
||||
qedr_free_pbl(dev, &mr->info.pbl_info, mr->info.pbl_table);
|
||||
|
||||
/* it could be user registered memory. */
|
||||
if (mr->umem)
|
||||
ib_umem_release(mr->umem);
|
||||
ib_umem_release(mr->umem);
|
||||
|
||||
kfree(mr);
|
||||
|
||||
|
@@ -50,11 +50,10 @@ int qedr_mmap(struct ib_ucontext *, struct vm_area_struct *vma);
|
||||
int qedr_alloc_pd(struct ib_pd *pd, struct ib_udata *udata);
|
||||
void qedr_dealloc_pd(struct ib_pd *pd, struct ib_udata *udata);
|
||||
|
||||
struct ib_cq *qedr_create_cq(struct ib_device *ibdev,
|
||||
const struct ib_cq_init_attr *attr,
|
||||
struct ib_udata *udata);
|
||||
int qedr_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
|
||||
struct ib_udata *udata);
|
||||
int qedr_resize_cq(struct ib_cq *, int cqe, struct ib_udata *);
|
||||
int qedr_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata);
|
||||
void qedr_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata);
|
||||
int qedr_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags);
|
||||
struct ib_qp *qedr_create_qp(struct ib_pd *, struct ib_qp_init_attr *attrs,
|
||||
struct ib_udata *);
|
||||
|
Atsaukties uz šo jaunā problēmā
Block a user