Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma
Pull rdma updates from Jason Gunthorpe: "This has been a smaller cycle than normal. One new driver was accepted, which is unusual, and at least one more driver remains in review on the list. Summary: - Driver fixes for hns, hfi1, nes, rxe, i40iw, mlx5, cxgb4, vmw_pvrdma - Many patches from MatthewW converting radix tree and IDR users to use xarray - Introduction of tracepoints to the MAD layer - Build large SGLs at the start for DMA mapping and get the driver to split them - Generally clean SGL handling code throughout the subsystem - Support for restricting RDMA devices to net namespaces for containers - Progress to remove object allocation boilerplate code from drivers - Change in how the mlx5 driver shows representor ports linked to VFs - mlx5 uapi feature to access the on chip SW ICM memory - Add a new driver for 'EFA'. This is HW that supports user space packet processing through QPs in Amazon's cloud" * tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma: (186 commits) RDMA/ipoib: Allow user space differentiate between valid dev_port IB/core, ipoib: Do not overreact to SM LID change event RDMA/device: Don't fire uevent before device is fully initialized lib/scatterlist: Remove leftover from sg_page_iter comment RDMA/efa: Add driver to Kconfig/Makefile RDMA/efa: Add the efa module RDMA/efa: Add EFA verbs implementation RDMA/efa: Add common command handlers RDMA/efa: Implement functions that submit and complete admin commands RDMA/efa: Add the ABI definitions RDMA/efa: Add the com service API definitions RDMA/efa: Add the efa_com.h file RDMA/efa: Add the efa.h header file RDMA/efa: Add EFA device definitions RDMA: Add EFA related definitions RDMA/umem: Remove hugetlb flag RDMA/bnxt_re: Use core helpers to get aligned DMA address RDMA/i40iw: Use core helpers to get aligned DMA address within a supported page size RDMA/verbs: Add a DMA iterator to return aligned contiguous memory blocks RDMA/umem: Add API to find best driver supported page size in an MR ...
Cette révision appartient à :
@@ -39,7 +39,6 @@
|
||||
#include <linux/iommu.h>
|
||||
#include <linux/pci.h>
|
||||
#include <net/addrconf.h>
|
||||
#include <linux/idr.h>
|
||||
|
||||
#include <linux/qed/qed_chain.h>
|
||||
#include <linux/qed/qed_if.h>
|
||||
@@ -82,20 +81,6 @@ static void qedr_get_dev_fw_str(struct ib_device *ibdev, char *str)
|
||||
(fw_ver >> 8) & 0xFF, fw_ver & 0xFF);
|
||||
}
|
||||
|
||||
static struct net_device *qedr_get_netdev(struct ib_device *dev, u8 port_num)
|
||||
{
|
||||
struct qedr_dev *qdev;
|
||||
|
||||
qdev = get_qedr_dev(dev);
|
||||
dev_hold(qdev->ndev);
|
||||
|
||||
/* The HW vendor's device driver must guarantee
|
||||
* that this function returns NULL before the net device has finished
|
||||
* NETDEV_UNREGISTER state.
|
||||
*/
|
||||
return qdev->ndev;
|
||||
}
|
||||
|
||||
static int qedr_roce_port_immutable(struct ib_device *ibdev, u8 port_num,
|
||||
struct ib_port_immutable *immutable)
|
||||
{
|
||||
@@ -163,6 +148,14 @@ static const struct attribute_group qedr_attr_group = {
|
||||
|
||||
static const struct ib_device_ops qedr_iw_dev_ops = {
|
||||
.get_port_immutable = qedr_iw_port_immutable,
|
||||
.iw_accept = qedr_iw_accept,
|
||||
.iw_add_ref = qedr_iw_qp_add_ref,
|
||||
.iw_connect = qedr_iw_connect,
|
||||
.iw_create_listen = qedr_iw_create_listen,
|
||||
.iw_destroy_listen = qedr_iw_destroy_listen,
|
||||
.iw_get_qp = qedr_iw_get_qp,
|
||||
.iw_reject = qedr_iw_reject,
|
||||
.iw_rem_ref = qedr_iw_qp_rem_ref,
|
||||
.query_gid = qedr_iw_query_gid,
|
||||
};
|
||||
|
||||
@@ -172,21 +165,8 @@ static int qedr_iw_register_device(struct qedr_dev *dev)
|
||||
|
||||
ib_set_device_ops(&dev->ibdev, &qedr_iw_dev_ops);
|
||||
|
||||
dev->ibdev.iwcm = kzalloc(sizeof(*dev->ibdev.iwcm), GFP_KERNEL);
|
||||
if (!dev->ibdev.iwcm)
|
||||
return -ENOMEM;
|
||||
|
||||
dev->ibdev.iwcm->connect = qedr_iw_connect;
|
||||
dev->ibdev.iwcm->accept = qedr_iw_accept;
|
||||
dev->ibdev.iwcm->reject = qedr_iw_reject;
|
||||
dev->ibdev.iwcm->create_listen = qedr_iw_create_listen;
|
||||
dev->ibdev.iwcm->destroy_listen = qedr_iw_destroy_listen;
|
||||
dev->ibdev.iwcm->add_ref = qedr_iw_qp_add_ref;
|
||||
dev->ibdev.iwcm->rem_ref = qedr_iw_qp_rem_ref;
|
||||
dev->ibdev.iwcm->get_qp = qedr_iw_get_qp;
|
||||
|
||||
memcpy(dev->ibdev.iwcm->ifname,
|
||||
dev->ndev->name, sizeof(dev->ibdev.iwcm->ifname));
|
||||
memcpy(dev->ibdev.iw_ifname,
|
||||
dev->ndev->name, sizeof(dev->ibdev.iw_ifname));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -220,7 +200,6 @@ static const struct ib_device_ops qedr_dev_ops = {
|
||||
.get_dev_fw_str = qedr_get_dev_fw_str,
|
||||
.get_dma_mr = qedr_get_dma_mr,
|
||||
.get_link_layer = qedr_link_layer,
|
||||
.get_netdev = qedr_get_netdev,
|
||||
.map_mr_sg = qedr_map_mr_sg,
|
||||
.mmap = qedr_mmap,
|
||||
.modify_port = qedr_modify_port,
|
||||
@@ -239,7 +218,10 @@ static const struct ib_device_ops qedr_dev_ops = {
|
||||
.reg_user_mr = qedr_reg_user_mr,
|
||||
.req_notify_cq = qedr_arm_cq,
|
||||
.resize_cq = qedr_resize_cq,
|
||||
|
||||
INIT_RDMA_OBJ_SIZE(ib_ah, qedr_ah, ibah),
|
||||
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),
|
||||
};
|
||||
|
||||
@@ -293,6 +275,10 @@ static int qedr_register_device(struct qedr_dev *dev)
|
||||
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;
|
||||
|
||||
return ib_register_device(&dev->ibdev, "qedr%d");
|
||||
}
|
||||
|
||||
@@ -364,8 +350,7 @@ static int qedr_alloc_resources(struct qedr_dev *dev)
|
||||
spin_lock_init(&dev->sgid_lock);
|
||||
|
||||
if (IS_IWARP(dev)) {
|
||||
spin_lock_init(&dev->qpidr.idr_lock);
|
||||
idr_init(&dev->qpidr.idr);
|
||||
xa_init_flags(&dev->qps, XA_FLAGS_LOCK_IRQ);
|
||||
dev->iwarp_wq = create_singlethread_workqueue("qedr_iwarpq");
|
||||
}
|
||||
|
||||
@@ -760,8 +745,8 @@ static void qedr_affiliated_event(void *context, u8 e_code, void *fw_handle)
|
||||
break;
|
||||
case EVENT_TYPE_SRQ:
|
||||
srq_id = (u16)roce_handle64;
|
||||
spin_lock_irqsave(&dev->srqidr.idr_lock, flags);
|
||||
srq = idr_find(&dev->srqidr.idr, srq_id);
|
||||
xa_lock_irqsave(&dev->srqs, flags);
|
||||
srq = xa_load(&dev->srqs, srq_id);
|
||||
if (srq) {
|
||||
ibsrq = &srq->ibsrq;
|
||||
if (ibsrq->event_handler) {
|
||||
@@ -775,7 +760,7 @@ static void qedr_affiliated_event(void *context, u8 e_code, void *fw_handle)
|
||||
"SRQ event with NULL pointer ibsrq. Handle=%llx\n",
|
||||
roce_handle64);
|
||||
}
|
||||
spin_unlock_irqrestore(&dev->srqidr.idr_lock, flags);
|
||||
xa_unlock_irqrestore(&dev->srqs, flags);
|
||||
DP_NOTICE(dev, "SRQ event %d on handle %p\n", e_code, srq);
|
||||
default:
|
||||
break;
|
||||
|
@@ -33,7 +33,7 @@
|
||||
#define __QEDR_H__
|
||||
|
||||
#include <linux/pci.h>
|
||||
#include <linux/idr.h>
|
||||
#include <linux/xarray.h>
|
||||
#include <rdma/ib_addr.h>
|
||||
#include <linux/qed/qed_if.h>
|
||||
#include <linux/qed/qed_chain.h>
|
||||
@@ -123,11 +123,6 @@ struct qedr_device_attr {
|
||||
|
||||
#define QEDR_ENET_STATE_BIT (0)
|
||||
|
||||
struct qedr_idr {
|
||||
spinlock_t idr_lock; /* Protect idr data-structure */
|
||||
struct idr idr;
|
||||
};
|
||||
|
||||
struct qedr_dev {
|
||||
struct ib_device ibdev;
|
||||
struct qed_dev *cdev;
|
||||
@@ -171,8 +166,8 @@ struct qedr_dev {
|
||||
struct qedr_cq *gsi_rqcq;
|
||||
struct qedr_qp *gsi_qp;
|
||||
enum qed_rdma_type rdma_type;
|
||||
struct qedr_idr qpidr;
|
||||
struct qedr_idr srqidr;
|
||||
struct xarray qps;
|
||||
struct xarray srqs;
|
||||
struct workqueue_struct *iwarp_wq;
|
||||
u16 iwarp_max_mtu;
|
||||
|
||||
|
@@ -491,7 +491,7 @@ int qedr_iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
|
||||
int rc = 0;
|
||||
int i;
|
||||
|
||||
qp = idr_find(&dev->qpidr.idr, conn_param->qpn);
|
||||
qp = xa_load(&dev->qps, conn_param->qpn);
|
||||
if (unlikely(!qp))
|
||||
return -EINVAL;
|
||||
|
||||
@@ -681,7 +681,7 @@ int qedr_iw_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
|
||||
|
||||
DP_DEBUG(dev, QEDR_MSG_IWARP, "Accept on qpid=%d\n", conn_param->qpn);
|
||||
|
||||
qp = idr_find(&dev->qpidr.idr, conn_param->qpn);
|
||||
qp = xa_load(&dev->qps, conn_param->qpn);
|
||||
if (!qp) {
|
||||
DP_ERR(dev, "Invalid QP number %d\n", conn_param->qpn);
|
||||
return -EINVAL;
|
||||
@@ -739,9 +739,7 @@ void qedr_iw_qp_rem_ref(struct ib_qp *ibqp)
|
||||
struct qedr_qp *qp = get_qedr_qp(ibqp);
|
||||
|
||||
if (atomic_dec_and_test(&qp->refcnt)) {
|
||||
spin_lock_irq(&qp->dev->qpidr.idr_lock);
|
||||
idr_remove(&qp->dev->qpidr.idr, qp->qp_id);
|
||||
spin_unlock_irq(&qp->dev->qpidr.idr_lock);
|
||||
xa_erase_irq(&qp->dev->qps, qp->qp_id);
|
||||
kfree(qp);
|
||||
}
|
||||
}
|
||||
@@ -750,5 +748,5 @@ struct ib_qp *qedr_iw_get_qp(struct ib_device *ibdev, int qpn)
|
||||
{
|
||||
struct qedr_dev *dev = get_qedr_dev(ibdev);
|
||||
|
||||
return idr_find(&dev->qpidr.idr, qpn);
|
||||
return xa_load(&dev->qps, qpn);
|
||||
}
|
||||
|
@@ -397,14 +397,17 @@ static inline int qedr_gsi_build_header(struct qedr_dev *dev,
|
||||
bool has_udp = false;
|
||||
int i;
|
||||
|
||||
rc = rdma_read_gid_l2_fields(sgid_attr, &vlan_id, NULL);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
if (vlan_id < VLAN_CFI_MASK)
|
||||
has_vlan = true;
|
||||
|
||||
send_size = 0;
|
||||
for (i = 0; i < swr->num_sge; ++i)
|
||||
send_size += swr->sg_list[i].length;
|
||||
|
||||
vlan_id = rdma_vlan_dev_vlan_id(sgid_attr->ndev);
|
||||
if (vlan_id < VLAN_CFI_MASK)
|
||||
has_vlan = true;
|
||||
|
||||
has_udp = (sgid_attr->gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP);
|
||||
if (!has_udp) {
|
||||
/* RoCE v1 */
|
||||
|
@@ -42,6 +42,7 @@
|
||||
#include <rdma/ib_umem.h>
|
||||
#include <rdma/ib_addr.h>
|
||||
#include <rdma/ib_cache.h>
|
||||
#include <rdma/uverbs_ioctl.h>
|
||||
|
||||
#include <linux/qed/common_hsi.h>
|
||||
#include "qedr_hsi_rdma.h"
|
||||
@@ -436,8 +437,7 @@ int qedr_mmap(struct ib_ucontext *context, struct vm_area_struct *vma)
|
||||
vma->vm_page_prot);
|
||||
}
|
||||
|
||||
int qedr_alloc_pd(struct ib_pd *ibpd, struct ib_ucontext *context,
|
||||
struct ib_udata *udata)
|
||||
int qedr_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
|
||||
{
|
||||
struct ib_device *ibdev = ibpd->device;
|
||||
struct qedr_dev *dev = get_qedr_dev(ibdev);
|
||||
@@ -446,7 +446,7 @@ int qedr_alloc_pd(struct ib_pd *ibpd, struct ib_ucontext *context,
|
||||
int rc;
|
||||
|
||||
DP_DEBUG(dev, QEDR_MSG_INIT, "Function called from: %s\n",
|
||||
(udata && context) ? "User Lib" : "Kernel");
|
||||
udata ? "User Lib" : "Kernel");
|
||||
|
||||
if (!dev->rdma_ctx) {
|
||||
DP_ERR(dev, "invalid RDMA context\n");
|
||||
@@ -459,10 +459,12 @@ int qedr_alloc_pd(struct ib_pd *ibpd, struct ib_ucontext *context,
|
||||
|
||||
pd->pd_id = pd_id;
|
||||
|
||||
if (udata && context) {
|
||||
if (udata) {
|
||||
struct qedr_alloc_pd_uresp uresp = {
|
||||
.pd_id = pd_id,
|
||||
};
|
||||
struct qedr_ucontext *context = rdma_udata_to_drv_context(
|
||||
udata, struct qedr_ucontext, ibucontext);
|
||||
|
||||
rc = qedr_ib_copy_to_udata(udata, &uresp, sizeof(uresp));
|
||||
if (rc) {
|
||||
@@ -471,14 +473,14 @@ int qedr_alloc_pd(struct ib_pd *ibpd, struct ib_ucontext *context,
|
||||
return rc;
|
||||
}
|
||||
|
||||
pd->uctx = get_qedr_ucontext(context);
|
||||
pd->uctx = context;
|
||||
pd->uctx->pd = pd;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void qedr_dealloc_pd(struct ib_pd *ibpd)
|
||||
void qedr_dealloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
|
||||
{
|
||||
struct qedr_dev *dev = get_qedr_dev(ibpd->device);
|
||||
struct qedr_pd *pd = get_qedr_pd(ibpd);
|
||||
@@ -813,9 +815,10 @@ int qedr_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags)
|
||||
|
||||
struct ib_cq *qedr_create_cq(struct ib_device *ibdev,
|
||||
const struct ib_cq_init_attr *attr,
|
||||
struct ib_ucontext *ib_ctx, struct ib_udata *udata)
|
||||
struct ib_udata *udata)
|
||||
{
|
||||
struct qedr_ucontext *ctx = get_qedr_ucontext(ib_ctx);
|
||||
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);
|
||||
@@ -903,7 +906,7 @@ struct ib_cq *qedr_create_cq(struct ib_device *ibdev,
|
||||
cq->sig = QEDR_CQ_MAGIC_NUMBER;
|
||||
spin_lock_init(&cq->cq_lock);
|
||||
|
||||
if (ib_ctx) {
|
||||
if (udata) {
|
||||
rc = qedr_copy_cq_uresp(dev, cq, udata);
|
||||
if (rc)
|
||||
goto err3;
|
||||
@@ -959,7 +962,7 @@ 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)
|
||||
int 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;
|
||||
@@ -983,7 +986,7 @@ int qedr_destroy_cq(struct ib_cq *ibcq)
|
||||
|
||||
dev->ops->common->chain_free(dev->cdev, &cq->pbl);
|
||||
|
||||
if (ibcq->uobject && ibcq->uobject->context) {
|
||||
if (udata) {
|
||||
qedr_free_pbl(dev, &cq->q.pbl_info, cq->q.pbl_tbl);
|
||||
ib_umem_release(cq->q.umem);
|
||||
}
|
||||
@@ -1044,10 +1047,13 @@ static inline int get_gid_info_from_table(struct ib_qp *ibqp,
|
||||
enum rdma_network_type nw_type;
|
||||
const struct ib_global_route *grh = rdma_ah_read_grh(&attr->ah_attr);
|
||||
u32 ipv4_addr;
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
gid_attr = grh->sgid_attr;
|
||||
qp_params->vlan_id = rdma_vlan_dev_vlan_id(gid_attr->ndev);
|
||||
ret = rdma_read_gid_l2_fields(gid_attr, &qp_params->vlan_id, NULL);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
nw_type = rdma_gid_attr_network_type(gid_attr);
|
||||
switch (nw_type) {
|
||||
@@ -1261,7 +1267,7 @@ static void qedr_set_roce_db_info(struct qedr_dev *dev, struct qedr_qp *qp)
|
||||
}
|
||||
}
|
||||
|
||||
static int qedr_check_srq_params(struct ib_pd *ibpd, struct qedr_dev *dev,
|
||||
static int qedr_check_srq_params(struct qedr_dev *dev,
|
||||
struct ib_srq_init_attr *attrs,
|
||||
struct ib_udata *udata)
|
||||
{
|
||||
@@ -1377,38 +1383,28 @@ err0:
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int qedr_idr_add(struct qedr_dev *dev, struct qedr_idr *qidr,
|
||||
void *ptr, u32 id);
|
||||
static void qedr_idr_remove(struct qedr_dev *dev,
|
||||
struct qedr_idr *qidr, u32 id);
|
||||
|
||||
struct ib_srq *qedr_create_srq(struct ib_pd *ibpd,
|
||||
struct ib_srq_init_attr *init_attr,
|
||||
struct ib_udata *udata)
|
||||
int qedr_create_srq(struct ib_srq *ibsrq, struct ib_srq_init_attr *init_attr,
|
||||
struct ib_udata *udata)
|
||||
{
|
||||
struct qed_rdma_destroy_srq_in_params destroy_in_params;
|
||||
struct qed_rdma_create_srq_in_params in_params = {};
|
||||
struct qedr_dev *dev = get_qedr_dev(ibpd->device);
|
||||
struct qedr_dev *dev = get_qedr_dev(ibsrq->device);
|
||||
struct qed_rdma_create_srq_out_params out_params;
|
||||
struct qedr_pd *pd = get_qedr_pd(ibpd);
|
||||
struct qedr_pd *pd = get_qedr_pd(ibsrq->pd);
|
||||
struct qedr_create_srq_ureq ureq = {};
|
||||
u64 pbl_base_addr, phy_prod_pair_addr;
|
||||
struct qedr_srq_hwq_info *hw_srq;
|
||||
u32 page_cnt, page_size;
|
||||
struct qedr_srq *srq;
|
||||
struct qedr_srq *srq = get_qedr_srq(ibsrq);
|
||||
int rc = 0;
|
||||
|
||||
DP_DEBUG(dev, QEDR_MSG_QP,
|
||||
"create SRQ called from %s (pd %p)\n",
|
||||
(udata) ? "User lib" : "kernel", pd);
|
||||
|
||||
rc = qedr_check_srq_params(ibpd, dev, init_attr, udata);
|
||||
rc = qedr_check_srq_params(dev, init_attr, udata);
|
||||
if (rc)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
srq = kzalloc(sizeof(*srq), GFP_KERNEL);
|
||||
if (!srq)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
return -EINVAL;
|
||||
|
||||
srq->dev = dev;
|
||||
hw_srq = &srq->hw_srq;
|
||||
@@ -1464,13 +1460,13 @@ struct ib_srq *qedr_create_srq(struct ib_pd *ibpd,
|
||||
goto err2;
|
||||
}
|
||||
|
||||
rc = qedr_idr_add(dev, &dev->srqidr, srq, srq->srq_id);
|
||||
rc = xa_insert_irq(&dev->srqs, srq->srq_id, srq, GFP_KERNEL);
|
||||
if (rc)
|
||||
goto err2;
|
||||
|
||||
DP_DEBUG(dev, QEDR_MSG_SRQ,
|
||||
"create srq: created srq with srq_id=0x%0x\n", srq->srq_id);
|
||||
return &srq->ibsrq;
|
||||
return 0;
|
||||
|
||||
err2:
|
||||
destroy_in_params.srq_id = srq->srq_id;
|
||||
@@ -1482,18 +1478,16 @@ err1:
|
||||
else
|
||||
qedr_free_srq_kernel_params(srq);
|
||||
err0:
|
||||
kfree(srq);
|
||||
|
||||
return ERR_PTR(-EFAULT);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
int qedr_destroy_srq(struct ib_srq *ibsrq)
|
||||
void qedr_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata)
|
||||
{
|
||||
struct qed_rdma_destroy_srq_in_params in_params = {};
|
||||
struct qedr_dev *dev = get_qedr_dev(ibsrq->device);
|
||||
struct qedr_srq *srq = get_qedr_srq(ibsrq);
|
||||
|
||||
qedr_idr_remove(dev, &dev->srqidr, srq->srq_id);
|
||||
xa_erase_irq(&dev->srqs, srq->srq_id);
|
||||
in_params.srq_id = srq->srq_id;
|
||||
dev->ops->rdma_destroy_srq(dev->rdma_ctx, &in_params);
|
||||
|
||||
@@ -1505,9 +1499,6 @@ int qedr_destroy_srq(struct ib_srq *ibsrq)
|
||||
DP_DEBUG(dev, QEDR_MSG_SRQ,
|
||||
"destroy srq: destroyed srq with srq_id=0x%0x\n",
|
||||
srq->srq_id);
|
||||
kfree(srq);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int qedr_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr,
|
||||
@@ -1593,29 +1584,6 @@ static inline void qedr_qp_user_print(struct qedr_dev *dev, struct qedr_qp *qp)
|
||||
qp->usq.buf_len, qp->urq.buf_addr, qp->urq.buf_len);
|
||||
}
|
||||
|
||||
static int qedr_idr_add(struct qedr_dev *dev, struct qedr_idr *qidr,
|
||||
void *ptr, u32 id)
|
||||
{
|
||||
int rc;
|
||||
|
||||
idr_preload(GFP_KERNEL);
|
||||
spin_lock_irq(&qidr->idr_lock);
|
||||
|
||||
rc = idr_alloc(&qidr->idr, ptr, id, id + 1, GFP_ATOMIC);
|
||||
|
||||
spin_unlock_irq(&qidr->idr_lock);
|
||||
idr_preload_end();
|
||||
|
||||
return rc < 0 ? rc : 0;
|
||||
}
|
||||
|
||||
static void qedr_idr_remove(struct qedr_dev *dev, struct qedr_idr *qidr, u32 id)
|
||||
{
|
||||
spin_lock_irq(&qidr->idr_lock);
|
||||
idr_remove(&qidr->idr, id);
|
||||
spin_unlock_irq(&qidr->idr_lock);
|
||||
}
|
||||
|
||||
static inline void
|
||||
qedr_iwarp_populate_user_qp(struct qedr_dev *dev,
|
||||
struct qedr_qp *qp,
|
||||
@@ -1985,7 +1953,7 @@ struct ib_qp *qedr_create_qp(struct ib_pd *ibpd,
|
||||
qp->ibqp.qp_num = qp->qp_id;
|
||||
|
||||
if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
|
||||
rc = qedr_idr_add(dev, &dev->qpidr, qp, qp->qp_id);
|
||||
rc = xa_insert_irq(&dev->qps, qp->qp_id, qp, GFP_KERNEL);
|
||||
if (rc)
|
||||
goto err;
|
||||
}
|
||||
@@ -2493,7 +2461,8 @@ err:
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int qedr_free_qp_resources(struct qedr_dev *dev, struct qedr_qp *qp)
|
||||
static int qedr_free_qp_resources(struct qedr_dev *dev, struct qedr_qp *qp,
|
||||
struct ib_udata *udata)
|
||||
{
|
||||
int rc = 0;
|
||||
|
||||
@@ -2503,7 +2472,7 @@ static int qedr_free_qp_resources(struct qedr_dev *dev, struct qedr_qp *qp)
|
||||
return rc;
|
||||
}
|
||||
|
||||
if (qp->ibqp.uobject && qp->ibqp.uobject->context)
|
||||
if (udata)
|
||||
qedr_cleanup_user(dev, qp);
|
||||
else
|
||||
qedr_cleanup_kernel(dev, qp);
|
||||
@@ -2511,7 +2480,7 @@ static int qedr_free_qp_resources(struct qedr_dev *dev, struct qedr_qp *qp)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int qedr_destroy_qp(struct ib_qp *ibqp)
|
||||
int qedr_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata)
|
||||
{
|
||||
struct qedr_qp *qp = get_qedr_qp(ibqp);
|
||||
struct qedr_dev *dev = qp->dev;
|
||||
@@ -2555,37 +2524,31 @@ int qedr_destroy_qp(struct ib_qp *ibqp)
|
||||
if (qp->qp_type == IB_QPT_GSI)
|
||||
qedr_destroy_gsi_qp(dev);
|
||||
|
||||
qedr_free_qp_resources(dev, qp);
|
||||
qedr_free_qp_resources(dev, qp, udata);
|
||||
|
||||
if (atomic_dec_and_test(&qp->refcnt) &&
|
||||
rdma_protocol_iwarp(&dev->ibdev, 1)) {
|
||||
qedr_idr_remove(dev, &dev->qpidr, qp->qp_id);
|
||||
xa_erase_irq(&dev->qps, qp->qp_id);
|
||||
kfree(qp);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
struct ib_ah *qedr_create_ah(struct ib_pd *ibpd, struct rdma_ah_attr *attr,
|
||||
u32 flags, struct ib_udata *udata)
|
||||
int qedr_create_ah(struct ib_ah *ibah, struct rdma_ah_attr *attr, u32 flags,
|
||||
struct ib_udata *udata)
|
||||
{
|
||||
struct qedr_ah *ah;
|
||||
|
||||
ah = kzalloc(sizeof(*ah), GFP_ATOMIC);
|
||||
if (!ah)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
struct qedr_ah *ah = get_qedr_ah(ibah);
|
||||
|
||||
rdma_copy_ah_attr(&ah->attr, attr);
|
||||
|
||||
return &ah->ibah;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int qedr_destroy_ah(struct ib_ah *ibah, u32 flags)
|
||||
void qedr_destroy_ah(struct ib_ah *ibah, u32 flags)
|
||||
{
|
||||
struct qedr_ah *ah = get_qedr_ah(ibah);
|
||||
|
||||
rdma_destroy_ah_attr(&ah->attr);
|
||||
kfree(ah);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void free_mr_info(struct qedr_dev *dev, struct mr_info *info)
|
||||
@@ -2734,7 +2697,7 @@ err0:
|
||||
return ERR_PTR(rc);
|
||||
}
|
||||
|
||||
int qedr_dereg_mr(struct ib_mr *ib_mr)
|
||||
int qedr_dereg_mr(struct ib_mr *ib_mr, struct ib_udata *udata)
|
||||
{
|
||||
struct qedr_mr *mr = get_qedr_mr(ib_mr);
|
||||
struct qedr_dev *dev = get_qedr_dev(ib_mr->device);
|
||||
@@ -2826,8 +2789,8 @@ err0:
|
||||
return ERR_PTR(rc);
|
||||
}
|
||||
|
||||
struct ib_mr *qedr_alloc_mr(struct ib_pd *ibpd,
|
||||
enum ib_mr_type mr_type, u32 max_num_sg)
|
||||
struct ib_mr *qedr_alloc_mr(struct ib_pd *ibpd, enum ib_mr_type mr_type,
|
||||
u32 max_num_sg, struct ib_udata *udata)
|
||||
{
|
||||
struct qedr_mr *mr;
|
||||
|
||||
|
@@ -47,16 +47,14 @@ int qedr_alloc_ucontext(struct ib_ucontext *uctx, struct ib_udata *udata);
|
||||
void qedr_dealloc_ucontext(struct ib_ucontext *uctx);
|
||||
|
||||
int qedr_mmap(struct ib_ucontext *, struct vm_area_struct *vma);
|
||||
int qedr_alloc_pd(struct ib_pd *pd, struct ib_ucontext *uctx,
|
||||
struct ib_udata *udata);
|
||||
void qedr_dealloc_pd(struct ib_pd *pd);
|
||||
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_ucontext *ib_ctx,
|
||||
struct ib_udata *udata);
|
||||
int qedr_resize_cq(struct ib_cq *, int cqe, struct ib_udata *);
|
||||
int qedr_destroy_cq(struct ib_cq *);
|
||||
int 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 *);
|
||||
@@ -64,22 +62,21 @@ int qedr_modify_qp(struct ib_qp *, struct ib_qp_attr *attr,
|
||||
int attr_mask, struct ib_udata *udata);
|
||||
int qedr_query_qp(struct ib_qp *, struct ib_qp_attr *qp_attr,
|
||||
int qp_attr_mask, struct ib_qp_init_attr *);
|
||||
int qedr_destroy_qp(struct ib_qp *ibqp);
|
||||
int qedr_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata);
|
||||
|
||||
struct ib_srq *qedr_create_srq(struct ib_pd *ibpd,
|
||||
struct ib_srq_init_attr *attr,
|
||||
struct ib_udata *udata);
|
||||
int qedr_create_srq(struct ib_srq *ibsrq, struct ib_srq_init_attr *attr,
|
||||
struct ib_udata *udata);
|
||||
int qedr_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr,
|
||||
enum ib_srq_attr_mask attr_mask, struct ib_udata *udata);
|
||||
int qedr_query_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr);
|
||||
int qedr_destroy_srq(struct ib_srq *ibsrq);
|
||||
void qedr_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata);
|
||||
int qedr_post_srq_recv(struct ib_srq *ibsrq, const struct ib_recv_wr *wr,
|
||||
const struct ib_recv_wr **bad_recv_wr);
|
||||
struct ib_ah *qedr_create_ah(struct ib_pd *ibpd, struct rdma_ah_attr *attr,
|
||||
u32 flags, struct ib_udata *udata);
|
||||
int qedr_destroy_ah(struct ib_ah *ibah, u32 flags);
|
||||
int qedr_create_ah(struct ib_ah *ibah, struct rdma_ah_attr *attr, u32 flags,
|
||||
struct ib_udata *udata);
|
||||
void qedr_destroy_ah(struct ib_ah *ibah, u32 flags);
|
||||
|
||||
int qedr_dereg_mr(struct ib_mr *);
|
||||
int qedr_dereg_mr(struct ib_mr *ib_mr, struct ib_udata *udata);
|
||||
struct ib_mr *qedr_get_dma_mr(struct ib_pd *, int acc);
|
||||
|
||||
struct ib_mr *qedr_reg_user_mr(struct ib_pd *, u64 start, u64 length,
|
||||
@@ -89,7 +86,7 @@ int qedr_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg,
|
||||
int sg_nents, unsigned int *sg_offset);
|
||||
|
||||
struct ib_mr *qedr_alloc_mr(struct ib_pd *pd, enum ib_mr_type mr_type,
|
||||
u32 max_num_sg);
|
||||
u32 max_num_sg, struct ib_udata *udata);
|
||||
int qedr_poll_cq(struct ib_cq *, int num_entries, struct ib_wc *wc);
|
||||
int qedr_post_send(struct ib_qp *, const struct ib_send_wr *,
|
||||
const struct ib_send_wr **bad_wr);
|
||||
|
Référencer dans un nouveau ticket
Bloquer un utilisateur