IB: Pass only ib_udata in function prototypes
Now when ib_udata is passed to all the driver's object create/destroy APIs the ib_udata will carry the ib_ucontext for every user command. There is no need to also pass the ib_ucontext via the functions prototypes. Make ib_udata the only argument psssed. Signed-off-by: Shamir Rabinovitch <shamir.rabinovitch@oracle.com> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
这个提交包含在:
@@ -576,14 +576,12 @@ void bnxt_re_dealloc_pd(struct ib_pd *ib_pd, struct ib_udata *udata)
|
||||
&pd->qplib_pd);
|
||||
}
|
||||
|
||||
int bnxt_re_alloc_pd(struct ib_pd *ibpd, struct ib_ucontext *ucontext,
|
||||
struct ib_udata *udata)
|
||||
int bnxt_re_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
|
||||
{
|
||||
struct ib_device *ibdev = ibpd->device;
|
||||
struct bnxt_re_dev *rdev = to_bnxt_re_dev(ibdev, ibdev);
|
||||
struct bnxt_re_ucontext *ucntx = container_of(ucontext,
|
||||
struct bnxt_re_ucontext,
|
||||
ib_uctx);
|
||||
struct bnxt_re_ucontext *ucntx = rdma_udata_to_drv_context(
|
||||
udata, struct bnxt_re_ucontext, ib_uctx);
|
||||
struct bnxt_re_pd *pd = container_of(ibpd, struct bnxt_re_pd, ib_pd);
|
||||
int rc;
|
||||
|
||||
@@ -2589,7 +2587,6 @@ int bnxt_re_destroy_cq(struct ib_cq *ib_cq, struct ib_udata *udata)
|
||||
|
||||
struct ib_cq *bnxt_re_create_cq(struct ib_device *ibdev,
|
||||
const struct ib_cq_init_attr *attr,
|
||||
struct ib_ucontext *context,
|
||||
struct ib_udata *udata)
|
||||
{
|
||||
struct bnxt_re_dev *rdev = to_bnxt_re_dev(ibdev, ibdev);
|
||||
@@ -2616,12 +2613,10 @@ struct ib_cq *bnxt_re_create_cq(struct ib_device *ibdev,
|
||||
if (entries > dev_attr->max_cq_wqes + 1)
|
||||
entries = dev_attr->max_cq_wqes + 1;
|
||||
|
||||
if (context) {
|
||||
if (udata) {
|
||||
struct bnxt_re_cq_req req;
|
||||
struct bnxt_re_ucontext *uctx = container_of
|
||||
(context,
|
||||
struct bnxt_re_ucontext,
|
||||
ib_uctx);
|
||||
struct bnxt_re_ucontext *uctx = rdma_udata_to_drv_context(
|
||||
udata, struct bnxt_re_ucontext, ib_uctx);
|
||||
if (ib_copy_from_udata(&req, udata, sizeof(req))) {
|
||||
rc = -EFAULT;
|
||||
goto fail;
|
||||
@@ -2672,7 +2667,7 @@ struct ib_cq *bnxt_re_create_cq(struct ib_device *ibdev,
|
||||
atomic_inc(&rdev->cq_count);
|
||||
spin_lock_init(&cq->cq_lock);
|
||||
|
||||
if (context) {
|
||||
if (udata) {
|
||||
struct bnxt_re_cq_resp resp;
|
||||
|
||||
resp.cqid = cq->qplib_cq.id;
|
||||
@@ -2690,7 +2685,7 @@ struct ib_cq *bnxt_re_create_cq(struct ib_device *ibdev,
|
||||
return &cq->ib_cq;
|
||||
|
||||
c2fail:
|
||||
if (context)
|
||||
if (udata)
|
||||
ib_umem_release(cq->umem);
|
||||
fail:
|
||||
kfree(cq->cql);
|
||||
|
@@ -163,8 +163,7 @@ int bnxt_re_query_gid(struct ib_device *ibdev, u8 port_num,
|
||||
int index, union ib_gid *gid);
|
||||
enum rdma_link_layer bnxt_re_get_link_layer(struct ib_device *ibdev,
|
||||
u8 port_num);
|
||||
int bnxt_re_alloc_pd(struct ib_pd *pd, struct ib_ucontext *context,
|
||||
struct ib_udata *udata);
|
||||
int bnxt_re_alloc_pd(struct ib_pd *pd, struct ib_udata *udata);
|
||||
void bnxt_re_dealloc_pd(struct ib_pd *pd, struct ib_udata *udata);
|
||||
struct ib_ah *bnxt_re_create_ah(struct ib_pd *pd,
|
||||
struct rdma_ah_attr *ah_attr,
|
||||
@@ -197,7 +196,6 @@ int bnxt_re_post_recv(struct ib_qp *qp, const struct ib_recv_wr *recv_wr,
|
||||
const struct ib_recv_wr **bad_recv_wr);
|
||||
struct ib_cq *bnxt_re_create_cq(struct ib_device *ibdev,
|
||||
const struct ib_cq_init_attr *attr,
|
||||
struct ib_ucontext *context,
|
||||
struct ib_udata *udata);
|
||||
int bnxt_re_destroy_cq(struct ib_cq *cq, struct ib_udata *udata);
|
||||
int bnxt_re_poll_cq(struct ib_cq *cq, int num_entries, struct ib_wc *wc);
|
||||
|
@@ -106,7 +106,6 @@ static int iwch_destroy_cq(struct ib_cq *ib_cq, struct ib_udata *udata)
|
||||
|
||||
static struct ib_cq *iwch_create_cq(struct ib_device *ibdev,
|
||||
const struct ib_cq_init_attr *attr,
|
||||
struct ib_ucontext *ib_context,
|
||||
struct ib_udata *udata)
|
||||
{
|
||||
int entries = attr->cqe;
|
||||
@@ -114,7 +113,6 @@ static struct ib_cq *iwch_create_cq(struct ib_device *ibdev,
|
||||
struct iwch_cq *chp;
|
||||
struct iwch_create_cq_resp uresp;
|
||||
struct iwch_create_cq_req ureq;
|
||||
struct iwch_ucontext *ucontext = NULL;
|
||||
static int warned;
|
||||
size_t resplen;
|
||||
|
||||
@@ -127,8 +125,7 @@ static struct ib_cq *iwch_create_cq(struct ib_device *ibdev,
|
||||
if (!chp)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
if (ib_context) {
|
||||
ucontext = to_iwch_ucontext(ib_context);
|
||||
if (udata) {
|
||||
if (!t3a_device(rhp)) {
|
||||
if (ib_copy_from_udata(&ureq, udata, sizeof (ureq))) {
|
||||
kfree(chp);
|
||||
@@ -154,7 +151,7 @@ static struct ib_cq *iwch_create_cq(struct ib_device *ibdev,
|
||||
entries = roundup_pow_of_two(entries);
|
||||
chp->cq.size_log2 = ilog2(entries);
|
||||
|
||||
if (cxio_create_cq(&rhp->rdev, &chp->cq, !ucontext)) {
|
||||
if (cxio_create_cq(&rhp->rdev, &chp->cq, !udata)) {
|
||||
kfree(chp);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
@@ -170,8 +167,10 @@ static struct ib_cq *iwch_create_cq(struct ib_device *ibdev,
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
if (ucontext) {
|
||||
if (udata) {
|
||||
struct iwch_mm_entry *mm;
|
||||
struct iwch_ucontext *ucontext = rdma_udata_to_drv_context(
|
||||
udata, struct iwch_ucontext, ibucontext);
|
||||
|
||||
mm = kmalloc(sizeof *mm, GFP_KERNEL);
|
||||
if (!mm) {
|
||||
@@ -378,8 +377,7 @@ static void iwch_deallocate_pd(struct ib_pd *pd, struct ib_udata *udata)
|
||||
cxio_hal_put_pdid(rhp->rdev.rscp, php->pdid);
|
||||
}
|
||||
|
||||
static int iwch_allocate_pd(struct ib_pd *pd, struct ib_ucontext *context,
|
||||
struct ib_udata *udata)
|
||||
static int iwch_allocate_pd(struct ib_pd *pd, struct ib_udata *udata)
|
||||
{
|
||||
struct iwch_pd *php = to_iwch_pd(pd);
|
||||
struct ib_device *ibdev = pd->device;
|
||||
@@ -394,7 +392,7 @@ static int iwch_allocate_pd(struct ib_pd *pd, struct ib_ucontext *context,
|
||||
|
||||
php->pdid = pdid;
|
||||
php->rhp = rhp;
|
||||
if (context) {
|
||||
if (udata) {
|
||||
struct iwch_alloc_pd_resp resp = {.pdid = php->pdid};
|
||||
|
||||
if (ib_copy_to_udata(udata, &resp, sizeof(resp))) {
|
||||
|
@@ -994,7 +994,6 @@ int c4iw_destroy_cq(struct ib_cq *ib_cq, struct ib_udata *udata)
|
||||
|
||||
struct ib_cq *c4iw_create_cq(struct ib_device *ibdev,
|
||||
const struct ib_cq_init_attr *attr,
|
||||
struct ib_ucontext *ib_context,
|
||||
struct ib_udata *udata)
|
||||
{
|
||||
int entries = attr->cqe;
|
||||
@@ -1003,10 +1002,11 @@ struct ib_cq *c4iw_create_cq(struct ib_device *ibdev,
|
||||
struct c4iw_cq *chp;
|
||||
struct c4iw_create_cq ucmd;
|
||||
struct c4iw_create_cq_resp uresp;
|
||||
struct c4iw_ucontext *ucontext = NULL;
|
||||
int ret, wr_len;
|
||||
size_t memsize, hwentries;
|
||||
struct c4iw_mm_entry *mm, *mm2;
|
||||
struct c4iw_ucontext *ucontext = rdma_udata_to_drv_context(
|
||||
udata, struct c4iw_ucontext, ibucontext);
|
||||
|
||||
pr_debug("ib_dev %p entries %d\n", ibdev, entries);
|
||||
if (attr->flags)
|
||||
@@ -1017,8 +1017,7 @@ struct ib_cq *c4iw_create_cq(struct ib_device *ibdev,
|
||||
if (vector >= rhp->rdev.lldi.nciq)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
if (ib_context) {
|
||||
ucontext = to_c4iw_ucontext(ib_context);
|
||||
if (udata) {
|
||||
if (udata->inlen < sizeof(ucmd))
|
||||
ucontext->is_32b_cqe = 1;
|
||||
}
|
||||
@@ -1070,7 +1069,7 @@ struct ib_cq *c4iw_create_cq(struct ib_device *ibdev,
|
||||
/*
|
||||
* memsize must be a multiple of the page size if its a user cq.
|
||||
*/
|
||||
if (ucontext)
|
||||
if (udata)
|
||||
memsize = roundup(memsize, PAGE_SIZE);
|
||||
|
||||
chp->cq.size = hwentries;
|
||||
|
@@ -995,7 +995,6 @@ int c4iw_dereg_mr(struct ib_mr *ib_mr, struct ib_udata *udata);
|
||||
int c4iw_destroy_cq(struct ib_cq *ib_cq, struct ib_udata *udata);
|
||||
struct ib_cq *c4iw_create_cq(struct ib_device *ibdev,
|
||||
const struct ib_cq_init_attr *attr,
|
||||
struct ib_ucontext *ib_context,
|
||||
struct ib_udata *udata);
|
||||
int c4iw_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags);
|
||||
int c4iw_modify_srq(struct ib_srq *ib_srq, struct ib_srq_attr *attr,
|
||||
|
@@ -204,8 +204,7 @@ static void c4iw_deallocate_pd(struct ib_pd *pd, struct ib_udata *udata)
|
||||
mutex_unlock(&rhp->rdev.stats.lock);
|
||||
}
|
||||
|
||||
static int c4iw_allocate_pd(struct ib_pd *pd, struct ib_ucontext *context,
|
||||
struct ib_udata *udata)
|
||||
static int c4iw_allocate_pd(struct ib_pd *pd, struct ib_udata *udata)
|
||||
{
|
||||
struct c4iw_pd *php = to_c4iw_pd(pd);
|
||||
struct ib_device *ibdev = pd->device;
|
||||
@@ -220,7 +219,7 @@ static int c4iw_allocate_pd(struct ib_pd *pd, struct ib_ucontext *context,
|
||||
|
||||
php->pdid = pdid;
|
||||
php->rhp = rhp;
|
||||
if (context) {
|
||||
if (udata) {
|
||||
struct c4iw_alloc_pd_resp uresp = {.pdid = php->pdid};
|
||||
|
||||
if (ib_copy_to_udata(udata, &uresp, sizeof(uresp))) {
|
||||
|
@@ -302,7 +302,6 @@ static void hns_roce_ib_free_cq_buf(struct hns_roce_dev *hr_dev,
|
||||
|
||||
struct ib_cq *hns_roce_ib_create_cq(struct ib_device *ib_dev,
|
||||
const struct ib_cq_init_attr *attr,
|
||||
struct ib_ucontext *context,
|
||||
struct ib_udata *udata)
|
||||
{
|
||||
struct hns_roce_dev *hr_dev = to_hr_dev(ib_dev);
|
||||
@@ -314,6 +313,8 @@ struct ib_cq *hns_roce_ib_create_cq(struct ib_device *ib_dev,
|
||||
int vector = attr->comp_vector;
|
||||
int cq_entries = attr->cqe;
|
||||
int ret;
|
||||
struct hns_roce_ucontext *context = rdma_udata_to_drv_context(
|
||||
udata, struct hns_roce_ucontext, ibucontext);
|
||||
|
||||
if (cq_entries < 1 || cq_entries > hr_dev->caps.max_cqes) {
|
||||
dev_err(dev, "Creat CQ failed. entries=%d, max=%d\n",
|
||||
@@ -332,7 +333,7 @@ struct ib_cq *hns_roce_ib_create_cq(struct ib_device *ib_dev,
|
||||
hr_cq->ib_cq.cqe = cq_entries - 1;
|
||||
spin_lock_init(&hr_cq->lock);
|
||||
|
||||
if (context) {
|
||||
if (udata) {
|
||||
if (ib_copy_from_udata(&ucmd, udata, sizeof(ucmd))) {
|
||||
dev_err(dev, "Failed to copy_from_udata.\n");
|
||||
ret = -EFAULT;
|
||||
@@ -350,8 +351,7 @@ struct ib_cq *hns_roce_ib_create_cq(struct ib_device *ib_dev,
|
||||
|
||||
if ((hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB) &&
|
||||
(udata->outlen >= sizeof(resp))) {
|
||||
ret = hns_roce_db_map_user(to_hr_ucontext(context),
|
||||
udata, ucmd.db_addr,
|
||||
ret = hns_roce_db_map_user(context, udata, ucmd.db_addr,
|
||||
&hr_cq->db);
|
||||
if (ret) {
|
||||
dev_err(dev, "cq record doorbell map failed!\n");
|
||||
@@ -362,7 +362,7 @@ struct ib_cq *hns_roce_ib_create_cq(struct ib_device *ib_dev,
|
||||
}
|
||||
|
||||
/* Get user space parameters */
|
||||
uar = &to_hr_ucontext(context)->uar;
|
||||
uar = &context->uar;
|
||||
} else {
|
||||
if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB) {
|
||||
ret = hns_roce_alloc_db(hr_dev, &hr_cq->db, 1);
|
||||
@@ -401,7 +401,7 @@ struct ib_cq *hns_roce_ib_create_cq(struct ib_device *ib_dev,
|
||||
* problems if tptr is set to zero here, so we initialze it in user
|
||||
* space.
|
||||
*/
|
||||
if (!context && hr_cq->tptr_addr)
|
||||
if (!udata && hr_cq->tptr_addr)
|
||||
*hr_cq->tptr_addr = 0;
|
||||
|
||||
/* Get created cq handler and carry out event */
|
||||
@@ -409,7 +409,7 @@ struct ib_cq *hns_roce_ib_create_cq(struct ib_device *ib_dev,
|
||||
hr_cq->event = hns_roce_ib_cq_event;
|
||||
hr_cq->cq_depth = cq_entries;
|
||||
|
||||
if (context) {
|
||||
if (udata) {
|
||||
resp.cqn = hr_cq->cqn;
|
||||
ret = ib_copy_to_udata(udata, &resp, sizeof(resp));
|
||||
if (ret)
|
||||
@@ -422,21 +422,20 @@ err_cqc:
|
||||
hns_roce_free_cq(hr_dev, hr_cq);
|
||||
|
||||
err_dbmap:
|
||||
if (context && (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB) &&
|
||||
if (udata && (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB) &&
|
||||
(udata->outlen >= sizeof(resp)))
|
||||
hns_roce_db_unmap_user(to_hr_ucontext(context),
|
||||
&hr_cq->db);
|
||||
hns_roce_db_unmap_user(context, &hr_cq->db);
|
||||
|
||||
err_mtt:
|
||||
hns_roce_mtt_cleanup(hr_dev, &hr_cq->hr_buf.hr_mtt);
|
||||
if (context)
|
||||
if (udata)
|
||||
ib_umem_release(hr_cq->umem);
|
||||
else
|
||||
hns_roce_ib_free_cq_buf(hr_dev, &hr_cq->hr_buf,
|
||||
hr_cq->ib_cq.cqe);
|
||||
|
||||
err_db:
|
||||
if (!context && (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB))
|
||||
if (!udata && (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB))
|
||||
hns_roce_free_db(hr_dev, &hr_cq->db);
|
||||
|
||||
err_cq:
|
||||
|
@@ -1112,8 +1112,7 @@ struct ib_ah *hns_roce_create_ah(struct ib_pd *pd,
|
||||
int hns_roce_query_ah(struct ib_ah *ibah, struct rdma_ah_attr *ah_attr);
|
||||
int hns_roce_destroy_ah(struct ib_ah *ah, u32 flags, struct ib_udata *udata);
|
||||
|
||||
int hns_roce_alloc_pd(struct ib_pd *pd, struct ib_ucontext *context,
|
||||
struct ib_udata *udata);
|
||||
int hns_roce_alloc_pd(struct ib_pd *pd, struct ib_udata *udata);
|
||||
void hns_roce_dealloc_pd(struct ib_pd *pd, struct ib_udata *udata);
|
||||
|
||||
struct ib_mr *hns_roce_get_dma_mr(struct ib_pd *pd, int acc);
|
||||
@@ -1177,7 +1176,6 @@ int to_hr_qp_type(int qp_type);
|
||||
|
||||
struct ib_cq *hns_roce_ib_create_cq(struct ib_device *ib_dev,
|
||||
const struct ib_cq_init_attr *attr,
|
||||
struct ib_ucontext *context,
|
||||
struct ib_udata *udata);
|
||||
|
||||
int hns_roce_ib_destroy_cq(struct ib_cq *ib_cq, struct ib_udata *udata);
|
||||
|
@@ -730,7 +730,7 @@ static int hns_roce_v1_rsv_lp_qp(struct hns_roce_dev *hr_dev)
|
||||
/* Reserved cq for loop qp */
|
||||
cq_init_attr.cqe = HNS_ROCE_MIN_WQE_NUM * 2;
|
||||
cq_init_attr.comp_vector = 0;
|
||||
cq = hns_roce_ib_create_cq(&hr_dev->ib_dev, &cq_init_attr, NULL, NULL);
|
||||
cq = hns_roce_ib_create_cq(&hr_dev->ib_dev, &cq_init_attr, NULL);
|
||||
if (IS_ERR(cq)) {
|
||||
dev_err(dev, "Create cq for reserved loop qp failed!");
|
||||
return -ENOMEM;
|
||||
@@ -749,7 +749,7 @@ static int hns_roce_v1_rsv_lp_qp(struct hns_roce_dev *hr_dev)
|
||||
goto alloc_mem_failed;
|
||||
|
||||
pd->device = ibdev;
|
||||
ret = hns_roce_alloc_pd(pd, NULL, NULL);
|
||||
ret = hns_roce_alloc_pd(pd, NULL);
|
||||
if (ret)
|
||||
goto alloc_pd_failed;
|
||||
|
||||
|
@@ -57,8 +57,7 @@ void hns_roce_cleanup_pd_table(struct hns_roce_dev *hr_dev)
|
||||
hns_roce_bitmap_cleanup(&hr_dev->pd_bitmap);
|
||||
}
|
||||
|
||||
int hns_roce_alloc_pd(struct ib_pd *ibpd, struct ib_ucontext *context,
|
||||
struct ib_udata *udata)
|
||||
int hns_roce_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
|
||||
{
|
||||
struct ib_device *ib_dev = ibpd->device;
|
||||
struct hns_roce_dev *hr_dev = to_hr_dev(ib_dev);
|
||||
@@ -72,7 +71,7 @@ int hns_roce_alloc_pd(struct ib_pd *ibpd, struct ib_ucontext *context,
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (context) {
|
||||
if (udata) {
|
||||
struct hns_roce_ib_alloc_pd_resp uresp = {.pdn = pd->pdn};
|
||||
|
||||
if (ib_copy_to_udata(udata, &uresp, sizeof(uresp))) {
|
||||
|
@@ -291,18 +291,15 @@ static void i40iw_dealloc_push_page(struct i40iw_device *iwdev, struct i40iw_sc_
|
||||
/**
|
||||
* i40iw_alloc_pd - allocate protection domain
|
||||
* @pd: PD pointer
|
||||
* @context: user context created during alloc
|
||||
* @udata: user data
|
||||
*/
|
||||
static int i40iw_alloc_pd(struct ib_pd *pd, struct ib_ucontext *context,
|
||||
struct ib_udata *udata)
|
||||
static int i40iw_alloc_pd(struct ib_pd *pd, struct ib_udata *udata)
|
||||
{
|
||||
struct i40iw_pd *iwpd = to_iwpd(pd);
|
||||
struct i40iw_device *iwdev = to_iwdev(pd->device);
|
||||
struct i40iw_sc_dev *dev = &iwdev->sc_dev;
|
||||
struct i40iw_alloc_pd_resp uresp;
|
||||
struct i40iw_sc_pd *sc_pd;
|
||||
struct i40iw_ucontext *ucontext;
|
||||
u32 pd_id = 0;
|
||||
int err;
|
||||
|
||||
@@ -318,8 +315,9 @@ static int i40iw_alloc_pd(struct ib_pd *pd, struct ib_ucontext *context,
|
||||
|
||||
sc_pd = &iwpd->sc_pd;
|
||||
|
||||
if (context) {
|
||||
ucontext = to_ucontext(context);
|
||||
if (udata) {
|
||||
struct i40iw_ucontext *ucontext = rdma_udata_to_drv_context(
|
||||
udata, struct i40iw_ucontext, ibucontext);
|
||||
dev->iw_pd_ops->pd_init(dev, sc_pd, pd_id, ucontext->abi_ver);
|
||||
memset(&uresp, 0, sizeof(uresp));
|
||||
uresp.pd_id = pd_id;
|
||||
@@ -1091,12 +1089,10 @@ static int i40iw_destroy_cq(struct ib_cq *ib_cq, struct ib_udata *udata)
|
||||
* i40iw_create_cq - create cq
|
||||
* @ibdev: device pointer from stack
|
||||
* @attr: attributes for cq
|
||||
* @context: user context created during alloc
|
||||
* @udata: user data
|
||||
*/
|
||||
static struct ib_cq *i40iw_create_cq(struct ib_device *ibdev,
|
||||
const struct ib_cq_init_attr *attr,
|
||||
struct ib_ucontext *context,
|
||||
struct ib_udata *udata)
|
||||
{
|
||||
struct i40iw_device *iwdev = to_iwdev(ibdev);
|
||||
@@ -1146,14 +1142,14 @@ static struct ib_cq *i40iw_create_cq(struct ib_device *ibdev,
|
||||
info.ceq_id_valid = true;
|
||||
info.ceqe_mask = 1;
|
||||
info.type = I40IW_CQ_TYPE_IWARP;
|
||||
if (context) {
|
||||
struct i40iw_ucontext *ucontext;
|
||||
if (udata) {
|
||||
struct i40iw_ucontext *ucontext = rdma_udata_to_drv_context(
|
||||
udata, struct i40iw_ucontext, ibucontext);
|
||||
struct i40iw_create_cq_req req;
|
||||
struct i40iw_cq_mr *cqmr;
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
iwcq->user_mode = true;
|
||||
ucontext = to_ucontext(context);
|
||||
if (ib_copy_from_udata(&req, udata, sizeof(struct i40iw_create_cq_req))) {
|
||||
err_code = -EFAULT;
|
||||
goto cq_free_resources;
|
||||
@@ -1223,7 +1219,7 @@ static struct ib_cq *i40iw_create_cq(struct ib_device *ibdev,
|
||||
goto cq_free_resources;
|
||||
}
|
||||
|
||||
if (context) {
|
||||
if (udata) {
|
||||
struct i40iw_create_cq_resp resp;
|
||||
|
||||
memset(&resp, 0, sizeof(resp));
|
||||
|
@@ -174,7 +174,6 @@ err_buf:
|
||||
#define CQ_CREATE_FLAGS_SUPPORTED IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETION
|
||||
struct ib_cq *mlx4_ib_create_cq(struct ib_device *ibdev,
|
||||
const struct ib_cq_init_attr *attr,
|
||||
struct ib_ucontext *context,
|
||||
struct ib_udata *udata)
|
||||
{
|
||||
int entries = attr->cqe;
|
||||
@@ -184,6 +183,8 @@ struct ib_cq *mlx4_ib_create_cq(struct ib_device *ibdev,
|
||||
struct mlx4_uar *uar;
|
||||
void *buf_addr;
|
||||
int err;
|
||||
struct mlx4_ib_ucontext *context = rdma_udata_to_drv_context(
|
||||
udata, struct mlx4_ib_ucontext, ibucontext);
|
||||
|
||||
if (entries < 1 || entries > dev->dev->caps.max_cqes)
|
||||
return ERR_PTR(-EINVAL);
|
||||
@@ -205,7 +206,7 @@ struct ib_cq *mlx4_ib_create_cq(struct ib_device *ibdev,
|
||||
INIT_LIST_HEAD(&cq->send_qp_list);
|
||||
INIT_LIST_HEAD(&cq->recv_qp_list);
|
||||
|
||||
if (context) {
|
||||
if (udata) {
|
||||
struct mlx4_ib_create_cq ucmd;
|
||||
|
||||
if (ib_copy_from_udata(&ucmd, udata, sizeof ucmd)) {
|
||||
@@ -219,12 +220,11 @@ struct ib_cq *mlx4_ib_create_cq(struct ib_device *ibdev,
|
||||
if (err)
|
||||
goto err_cq;
|
||||
|
||||
err = mlx4_ib_db_map_user(to_mucontext(context), udata,
|
||||
ucmd.db_addr, &cq->db);
|
||||
err = mlx4_ib_db_map_user(udata, ucmd.db_addr, &cq->db);
|
||||
if (err)
|
||||
goto err_mtt;
|
||||
|
||||
uar = &to_mucontext(context)->uar;
|
||||
uar = &context->uar;
|
||||
cq->mcq.usage = MLX4_RES_USAGE_USER_VERBS;
|
||||
} else {
|
||||
err = mlx4_db_alloc(dev->dev, &cq->db, 1);
|
||||
@@ -249,21 +249,21 @@ struct ib_cq *mlx4_ib_create_cq(struct ib_device *ibdev,
|
||||
if (dev->eq_table)
|
||||
vector = dev->eq_table[vector % ibdev->num_comp_vectors];
|
||||
|
||||
err = mlx4_cq_alloc(dev->dev, entries, &cq->buf.mtt, uar,
|
||||
cq->db.dma, &cq->mcq, vector, 0,
|
||||
err = mlx4_cq_alloc(dev->dev, entries, &cq->buf.mtt, uar, cq->db.dma,
|
||||
&cq->mcq, vector, 0,
|
||||
!!(cq->create_flags &
|
||||
IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETION),
|
||||
buf_addr, !!context);
|
||||
buf_addr, !!udata);
|
||||
if (err)
|
||||
goto err_dbmap;
|
||||
|
||||
if (context)
|
||||
if (udata)
|
||||
cq->mcq.tasklet_ctx.comp = mlx4_ib_cq_comp;
|
||||
else
|
||||
cq->mcq.comp = mlx4_ib_cq_comp;
|
||||
cq->mcq.event = mlx4_ib_cq_event;
|
||||
|
||||
if (context)
|
||||
if (udata)
|
||||
if (ib_copy_to_udata(udata, &cq->mcq.cqn, sizeof (__u32))) {
|
||||
err = -EFAULT;
|
||||
goto err_cq_free;
|
||||
@@ -275,19 +275,19 @@ err_cq_free:
|
||||
mlx4_cq_free(dev->dev, &cq->mcq);
|
||||
|
||||
err_dbmap:
|
||||
if (context)
|
||||
mlx4_ib_db_unmap_user(to_mucontext(context), &cq->db);
|
||||
if (udata)
|
||||
mlx4_ib_db_unmap_user(context, &cq->db);
|
||||
|
||||
err_mtt:
|
||||
mlx4_mtt_cleanup(dev->dev, &cq->buf.mtt);
|
||||
|
||||
if (context)
|
||||
if (udata)
|
||||
ib_umem_release(cq->umem);
|
||||
else
|
||||
mlx4_ib_free_cq_buf(dev, &cq->buf, cq->ibcq.cqe);
|
||||
|
||||
err_db:
|
||||
if (!context)
|
||||
if (!udata)
|
||||
mlx4_db_free(dev->dev, &cq->db);
|
||||
|
||||
err_cq:
|
||||
|
@@ -31,6 +31,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/slab.h>
|
||||
#include <rdma/uverbs_ioctl.h>
|
||||
|
||||
#include "mlx4_ib.h"
|
||||
|
||||
@@ -41,12 +42,13 @@ struct mlx4_ib_user_db_page {
|
||||
int refcnt;
|
||||
};
|
||||
|
||||
int mlx4_ib_db_map_user(struct mlx4_ib_ucontext *context,
|
||||
struct ib_udata *udata, unsigned long virt,
|
||||
int mlx4_ib_db_map_user(struct ib_udata *udata, unsigned long virt,
|
||||
struct mlx4_db *db)
|
||||
{
|
||||
struct mlx4_ib_user_db_page *page;
|
||||
int err = 0;
|
||||
struct mlx4_ib_ucontext *context = rdma_udata_to_drv_context(
|
||||
udata, struct mlx4_ib_ucontext, ibucontext);
|
||||
|
||||
mutex_lock(&context->db_page_mutex);
|
||||
|
||||
|
@@ -1177,8 +1177,7 @@ static int mlx4_ib_mmap(struct ib_ucontext *context, struct vm_area_struct *vma)
|
||||
}
|
||||
}
|
||||
|
||||
static int mlx4_ib_alloc_pd(struct ib_pd *ibpd, struct ib_ucontext *context,
|
||||
struct ib_udata *udata)
|
||||
static int mlx4_ib_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
|
||||
{
|
||||
struct mlx4_ib_pd *pd = to_mpd(ibpd);
|
||||
struct ib_device *ibdev = ibpd->device;
|
||||
@@ -1188,7 +1187,7 @@ static int mlx4_ib_alloc_pd(struct ib_pd *ibpd, struct ib_ucontext *context,
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (context && ib_copy_to_udata(udata, &pd->pdn, sizeof(__u32))) {
|
||||
if (udata && ib_copy_to_udata(udata, &pd->pdn, sizeof(__u32))) {
|
||||
mlx4_pd_free(to_mdev(ibdev)->dev, pd->pdn);
|
||||
return -EFAULT;
|
||||
}
|
||||
@@ -1201,7 +1200,6 @@ static void mlx4_ib_dealloc_pd(struct ib_pd *pd, struct ib_udata *udata)
|
||||
}
|
||||
|
||||
static struct ib_xrcd *mlx4_ib_alloc_xrcd(struct ib_device *ibdev,
|
||||
struct ib_ucontext *context,
|
||||
struct ib_udata *udata)
|
||||
{
|
||||
struct mlx4_ib_xrcd *xrcd;
|
||||
|
@@ -723,8 +723,7 @@ static inline u8 mlx4_ib_bond_next_port(struct mlx4_ib_dev *dev)
|
||||
int mlx4_ib_init_sriov(struct mlx4_ib_dev *dev);
|
||||
void mlx4_ib_close_sriov(struct mlx4_ib_dev *dev);
|
||||
|
||||
int mlx4_ib_db_map_user(struct mlx4_ib_ucontext *context,
|
||||
struct ib_udata *udata, unsigned long virt,
|
||||
int mlx4_ib_db_map_user(struct ib_udata *udata, unsigned long virt,
|
||||
struct mlx4_db *db);
|
||||
void mlx4_ib_db_unmap_user(struct mlx4_ib_ucontext *context, struct mlx4_db *db);
|
||||
|
||||
@@ -746,7 +745,6 @@ int mlx4_ib_modify_cq(struct ib_cq *cq, u16 cq_count, u16 cq_period);
|
||||
int mlx4_ib_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *udata);
|
||||
struct ib_cq *mlx4_ib_create_cq(struct ib_device *ibdev,
|
||||
const struct ib_cq_init_attr *attr,
|
||||
struct ib_ucontext *context,
|
||||
struct ib_udata *udata);
|
||||
int mlx4_ib_destroy_cq(struct ib_cq *cq, struct ib_udata *udata);
|
||||
int mlx4_ib_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc);
|
||||
|
@@ -1041,11 +1041,11 @@ static int create_qp_common(struct mlx4_ib_dev *dev, struct ib_pd *pd,
|
||||
goto err_mtt;
|
||||
|
||||
if (qp_has_rq(init_attr)) {
|
||||
err = mlx4_ib_db_map_user(
|
||||
context, udata,
|
||||
(src == MLX4_IB_QP_SRC) ? ucmd.qp.db_addr :
|
||||
err = mlx4_ib_db_map_user(udata,
|
||||
(src == MLX4_IB_QP_SRC) ?
|
||||
ucmd.qp.db_addr :
|
||||
ucmd.wq.db_addr,
|
||||
&qp->db);
|
||||
&qp->db);
|
||||
if (err)
|
||||
goto err_mtt;
|
||||
}
|
||||
|
@@ -131,8 +131,7 @@ struct ib_srq *mlx4_ib_create_srq(struct ib_pd *pd,
|
||||
if (err)
|
||||
goto err_mtt;
|
||||
|
||||
err = mlx4_ib_db_map_user(ucontext, udata, ucmd.db_addr,
|
||||
&srq->db);
|
||||
err = mlx4_ib_db_map_user(udata, ucmd.db_addr, &srq->db);
|
||||
if (err)
|
||||
goto err_mtt;
|
||||
} else {
|
||||
|
@@ -679,8 +679,7 @@ static int mini_cqe_res_format_to_hw(struct mlx5_ib_dev *dev, u8 format)
|
||||
}
|
||||
|
||||
static int create_cq_user(struct mlx5_ib_dev *dev, struct ib_udata *udata,
|
||||
struct ib_ucontext *context, struct mlx5_ib_cq *cq,
|
||||
int entries, u32 **cqb,
|
||||
struct mlx5_ib_cq *cq, int entries, u32 **cqb,
|
||||
int *cqe_size, int *index, int *inlen)
|
||||
{
|
||||
struct mlx5_ib_create_cq ucmd = {};
|
||||
@@ -691,6 +690,8 @@ static int create_cq_user(struct mlx5_ib_dev *dev, struct ib_udata *udata,
|
||||
int ncont;
|
||||
void *cqc;
|
||||
int err;
|
||||
struct mlx5_ib_ucontext *context = rdma_udata_to_drv_context(
|
||||
udata, struct mlx5_ib_ucontext, ibucontext);
|
||||
|
||||
ucmdlen = udata->inlen < sizeof(ucmd) ?
|
||||
(sizeof(ucmd) - sizeof(ucmd.flags)) : sizeof(ucmd);
|
||||
@@ -715,8 +716,7 @@ static int create_cq_user(struct mlx5_ib_dev *dev, struct ib_udata *udata,
|
||||
return err;
|
||||
}
|
||||
|
||||
err = mlx5_ib_db_map_user(to_mucontext(context), udata, ucmd.db_addr,
|
||||
&cq->db);
|
||||
err = mlx5_ib_db_map_user(context, udata, ucmd.db_addr, &cq->db);
|
||||
if (err)
|
||||
goto err_umem;
|
||||
|
||||
@@ -740,7 +740,7 @@ static int create_cq_user(struct mlx5_ib_dev *dev, struct ib_udata *udata,
|
||||
MLX5_SET(cqc, cqc, log_page_size,
|
||||
page_shift - MLX5_ADAPTER_PAGE_SHIFT);
|
||||
|
||||
*index = to_mucontext(context)->bfregi.sys_pages[0];
|
||||
*index = context->bfregi.sys_pages[0];
|
||||
|
||||
if (ucmd.cqe_comp_en == 1) {
|
||||
int mini_cqe_format;
|
||||
@@ -782,14 +782,14 @@ static int create_cq_user(struct mlx5_ib_dev *dev, struct ib_udata *udata,
|
||||
cq->private_flags |= MLX5_IB_CQ_PR_FLAGS_CQE_128_PAD;
|
||||
}
|
||||
|
||||
MLX5_SET(create_cq_in, *cqb, uid, to_mucontext(context)->devx_uid);
|
||||
MLX5_SET(create_cq_in, *cqb, uid, context->devx_uid);
|
||||
return 0;
|
||||
|
||||
err_cqb:
|
||||
kvfree(*cqb);
|
||||
|
||||
err_db:
|
||||
mlx5_ib_db_unmap_user(to_mucontext(context), &cq->db);
|
||||
mlx5_ib_db_unmap_user(context, &cq->db);
|
||||
|
||||
err_umem:
|
||||
ib_umem_release(cq->buf.umem);
|
||||
@@ -886,7 +886,6 @@ static void notify_soft_wc_handler(struct work_struct *work)
|
||||
|
||||
struct ib_cq *mlx5_ib_create_cq(struct ib_device *ibdev,
|
||||
const struct ib_cq_init_attr *attr,
|
||||
struct ib_ucontext *context,
|
||||
struct ib_udata *udata)
|
||||
{
|
||||
int entries = attr->cqe;
|
||||
@@ -927,8 +926,8 @@ struct ib_cq *mlx5_ib_create_cq(struct ib_device *ibdev,
|
||||
INIT_LIST_HEAD(&cq->list_recv_qp);
|
||||
|
||||
if (udata) {
|
||||
err = create_cq_user(dev, udata, context, cq, entries,
|
||||
&cqb, &cqe_size, &index, &inlen);
|
||||
err = create_cq_user(dev, udata, cq, entries, &cqb, &cqe_size,
|
||||
&index, &inlen);
|
||||
if (err)
|
||||
goto err_create;
|
||||
} else {
|
||||
@@ -965,7 +964,7 @@ struct ib_cq *mlx5_ib_create_cq(struct ib_device *ibdev,
|
||||
|
||||
mlx5_ib_dbg(dev, "cqn 0x%x\n", cq->mcq.cqn);
|
||||
cq->mcq.irqn = irqn;
|
||||
if (context)
|
||||
if (udata)
|
||||
cq->mcq.tasklet_ctx.comp = mlx5_ib_cq_comp;
|
||||
else
|
||||
cq->mcq.comp = mlx5_ib_cq_comp;
|
||||
@@ -973,7 +972,7 @@ struct ib_cq *mlx5_ib_create_cq(struct ib_device *ibdev,
|
||||
|
||||
INIT_LIST_HEAD(&cq->wc_list);
|
||||
|
||||
if (context)
|
||||
if (udata)
|
||||
if (ib_copy_to_udata(udata, &cq->mcq.cqn, sizeof(__u32))) {
|
||||
err = -EFAULT;
|
||||
goto err_cmd;
|
||||
|
@@ -2341,8 +2341,7 @@ int mlx5_ib_dealloc_dm(struct ib_dm *ibdm, struct uverbs_attr_bundle *attrs)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mlx5_ib_alloc_pd(struct ib_pd *ibpd, struct ib_ucontext *context,
|
||||
struct ib_udata *udata)
|
||||
static int mlx5_ib_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
|
||||
{
|
||||
struct mlx5_ib_pd *pd = to_mpd(ibpd);
|
||||
struct ib_device *ibdev = ibpd->device;
|
||||
@@ -2351,8 +2350,10 @@ static int mlx5_ib_alloc_pd(struct ib_pd *ibpd, struct ib_ucontext *context,
|
||||
u32 out[MLX5_ST_SZ_DW(alloc_pd_out)] = {};
|
||||
u32 in[MLX5_ST_SZ_DW(alloc_pd_in)] = {};
|
||||
u16 uid = 0;
|
||||
struct mlx5_ib_ucontext *context = rdma_udata_to_drv_context(
|
||||
udata, struct mlx5_ib_ucontext, ibucontext);
|
||||
|
||||
uid = context ? to_mucontext(context)->devx_uid : 0;
|
||||
uid = context ? context->devx_uid : 0;
|
||||
MLX5_SET(alloc_pd_in, in, opcode, MLX5_CMD_OP_ALLOC_PD);
|
||||
MLX5_SET(alloc_pd_in, in, uid, uid);
|
||||
err = mlx5_cmd_exec(to_mdev(ibdev)->mdev, in, sizeof(in),
|
||||
@@ -2362,7 +2363,7 @@ static int mlx5_ib_alloc_pd(struct ib_pd *ibpd, struct ib_ucontext *context,
|
||||
|
||||
pd->pdn = MLX5_GET(alloc_pd_out, out, pd);
|
||||
pd->uid = uid;
|
||||
if (context) {
|
||||
if (udata) {
|
||||
resp.pdn = pd->pdn;
|
||||
if (ib_copy_to_udata(udata, &resp, sizeof(resp))) {
|
||||
mlx5_cmd_dealloc_pd(to_mdev(ibdev)->mdev, pd->pdn, uid);
|
||||
@@ -4749,11 +4750,11 @@ static int create_dev_resources(struct mlx5_ib_resources *devr)
|
||||
devr->p0->uobject = NULL;
|
||||
atomic_set(&devr->p0->usecnt, 0);
|
||||
|
||||
ret = mlx5_ib_alloc_pd(devr->p0, NULL, NULL);
|
||||
ret = mlx5_ib_alloc_pd(devr->p0, NULL);
|
||||
if (ret)
|
||||
goto error0;
|
||||
|
||||
devr->c0 = mlx5_ib_create_cq(&dev->ib_dev, &cq_attr, NULL, NULL);
|
||||
devr->c0 = mlx5_ib_create_cq(&dev->ib_dev, &cq_attr, NULL);
|
||||
if (IS_ERR(devr->c0)) {
|
||||
ret = PTR_ERR(devr->c0);
|
||||
goto error1;
|
||||
@@ -4765,7 +4766,7 @@ static int create_dev_resources(struct mlx5_ib_resources *devr)
|
||||
devr->c0->cq_context = NULL;
|
||||
atomic_set(&devr->c0->usecnt, 0);
|
||||
|
||||
devr->x0 = mlx5_ib_alloc_xrcd(&dev->ib_dev, NULL, NULL);
|
||||
devr->x0 = mlx5_ib_alloc_xrcd(&dev->ib_dev, NULL);
|
||||
if (IS_ERR(devr->x0)) {
|
||||
ret = PTR_ERR(devr->x0);
|
||||
goto error2;
|
||||
@@ -4776,7 +4777,7 @@ static int create_dev_resources(struct mlx5_ib_resources *devr)
|
||||
mutex_init(&devr->x0->tgt_qp_mutex);
|
||||
INIT_LIST_HEAD(&devr->x0->tgt_qp_list);
|
||||
|
||||
devr->x1 = mlx5_ib_alloc_xrcd(&dev->ib_dev, NULL, NULL);
|
||||
devr->x1 = mlx5_ib_alloc_xrcd(&dev->ib_dev, NULL);
|
||||
if (IS_ERR(devr->x1)) {
|
||||
ret = PTR_ERR(devr->x1);
|
||||
goto error3;
|
||||
|
@@ -1083,7 +1083,6 @@ int mlx5_ib_read_user_wqe_srq(struct mlx5_ib_srq *srq, int wqe_index,
|
||||
void *buffer, int buflen, size_t *bc);
|
||||
struct ib_cq *mlx5_ib_create_cq(struct ib_device *ibdev,
|
||||
const struct ib_cq_init_attr *attr,
|
||||
struct ib_ucontext *context,
|
||||
struct ib_udata *udata);
|
||||
int mlx5_ib_destroy_cq(struct ib_cq *cq, struct ib_udata *udata);
|
||||
int mlx5_ib_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc);
|
||||
@@ -1123,8 +1122,7 @@ int mlx5_ib_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num,
|
||||
struct ib_mad_hdr *out, size_t *out_mad_size,
|
||||
u16 *out_mad_pkey_index);
|
||||
struct ib_xrcd *mlx5_ib_alloc_xrcd(struct ib_device *ibdev,
|
||||
struct ib_ucontext *context,
|
||||
struct ib_udata *udata);
|
||||
struct ib_udata *udata);
|
||||
int mlx5_ib_dealloc_xrcd(struct ib_xrcd *xrcd, struct ib_udata *udata);
|
||||
int mlx5_ib_get_buf_offset(u64 addr, int page_shift, u32 *offset);
|
||||
int mlx5_query_ext_port_caps(struct mlx5_ib_dev *dev, u8 port);
|
||||
|
@@ -5632,8 +5632,7 @@ out:
|
||||
}
|
||||
|
||||
struct ib_xrcd *mlx5_ib_alloc_xrcd(struct ib_device *ibdev,
|
||||
struct ib_ucontext *context,
|
||||
struct ib_udata *udata)
|
||||
struct ib_udata *udata)
|
||||
{
|
||||
struct mlx5_ib_dev *dev = to_mdev(ibdev);
|
||||
struct mlx5_ib_xrcd *xrcd;
|
||||
|
@@ -363,18 +363,17 @@ static int mthca_mmap_uar(struct ib_ucontext *context,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mthca_alloc_pd(struct ib_pd *ibpd, struct ib_ucontext *context,
|
||||
struct ib_udata *udata)
|
||||
static int mthca_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
|
||||
{
|
||||
struct ib_device *ibdev = ibpd->device;
|
||||
struct mthca_pd *pd = to_mpd(ibpd);
|
||||
int err;
|
||||
|
||||
err = mthca_pd_alloc(to_mdev(ibdev), !context, pd);
|
||||
err = mthca_pd_alloc(to_mdev(ibdev), !udata, pd);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (context) {
|
||||
if (udata) {
|
||||
if (ib_copy_to_udata(udata, &pd->pd_num, sizeof (__u32))) {
|
||||
mthca_pd_free(to_mdev(ibdev), pd);
|
||||
return -EFAULT;
|
||||
@@ -634,7 +633,6 @@ static int mthca_destroy_qp(struct ib_qp *qp, struct ib_udata *udata)
|
||||
|
||||
static struct ib_cq *mthca_create_cq(struct ib_device *ibdev,
|
||||
const struct ib_cq_init_attr *attr,
|
||||
struct ib_ucontext *context,
|
||||
struct ib_udata *udata)
|
||||
{
|
||||
int entries = attr->cqe;
|
||||
@@ -642,6 +640,8 @@ static struct ib_cq *mthca_create_cq(struct ib_device *ibdev,
|
||||
struct mthca_cq *cq;
|
||||
int nent;
|
||||
int err;
|
||||
struct mthca_ucontext *context = rdma_udata_to_drv_context(
|
||||
udata, struct mthca_ucontext, ibucontext);
|
||||
|
||||
if (attr->flags)
|
||||
return ERR_PTR(-EINVAL);
|
||||
@@ -649,19 +649,19 @@ static struct ib_cq *mthca_create_cq(struct ib_device *ibdev,
|
||||
if (entries < 1 || entries > to_mdev(ibdev)->limits.max_cqes)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
if (context) {
|
||||
if (udata) {
|
||||
if (ib_copy_from_udata(&ucmd, udata, sizeof ucmd))
|
||||
return ERR_PTR(-EFAULT);
|
||||
|
||||
err = mthca_map_user_db(to_mdev(ibdev), &to_mucontext(context)->uar,
|
||||
to_mucontext(context)->db_tab,
|
||||
ucmd.set_db_index, ucmd.set_db_page);
|
||||
err = mthca_map_user_db(to_mdev(ibdev), &context->uar,
|
||||
context->db_tab, ucmd.set_db_index,
|
||||
ucmd.set_db_page);
|
||||
if (err)
|
||||
return ERR_PTR(err);
|
||||
|
||||
err = mthca_map_user_db(to_mdev(ibdev), &to_mucontext(context)->uar,
|
||||
to_mucontext(context)->db_tab,
|
||||
ucmd.arm_db_index, ucmd.arm_db_page);
|
||||
err = mthca_map_user_db(to_mdev(ibdev), &context->uar,
|
||||
context->db_tab, ucmd.arm_db_index,
|
||||
ucmd.arm_db_page);
|
||||
if (err)
|
||||
goto err_unmap_set;
|
||||
}
|
||||
@@ -672,7 +672,7 @@ static struct ib_cq *mthca_create_cq(struct ib_device *ibdev,
|
||||
goto err_unmap_arm;
|
||||
}
|
||||
|
||||
if (context) {
|
||||
if (udata) {
|
||||
cq->buf.mr.ibmr.lkey = ucmd.lkey;
|
||||
cq->set_ci_db_index = ucmd.set_db_index;
|
||||
cq->arm_db_index = ucmd.arm_db_index;
|
||||
@@ -681,14 +681,13 @@ static struct ib_cq *mthca_create_cq(struct ib_device *ibdev,
|
||||
for (nent = 1; nent <= entries; nent <<= 1)
|
||||
; /* nothing */
|
||||
|
||||
err = mthca_init_cq(to_mdev(ibdev), nent,
|
||||
context ? to_mucontext(context) : NULL,
|
||||
context ? ucmd.pdn : to_mdev(ibdev)->driver_pd.pd_num,
|
||||
err = mthca_init_cq(to_mdev(ibdev), nent, context,
|
||||
udata ? ucmd.pdn : to_mdev(ibdev)->driver_pd.pd_num,
|
||||
cq);
|
||||
if (err)
|
||||
goto err_free;
|
||||
|
||||
if (context && ib_copy_to_udata(udata, &cq->cqn, sizeof (__u32))) {
|
||||
if (udata && ib_copy_to_udata(udata, &cq->cqn, sizeof(__u32))) {
|
||||
mthca_free_cq(to_mdev(ibdev), cq);
|
||||
err = -EFAULT;
|
||||
goto err_free;
|
||||
@@ -702,14 +701,14 @@ err_free:
|
||||
kfree(cq);
|
||||
|
||||
err_unmap_arm:
|
||||
if (context)
|
||||
mthca_unmap_user_db(to_mdev(ibdev), &to_mucontext(context)->uar,
|
||||
to_mucontext(context)->db_tab, ucmd.arm_db_index);
|
||||
if (udata)
|
||||
mthca_unmap_user_db(to_mdev(ibdev), &context->uar,
|
||||
context->db_tab, ucmd.arm_db_index);
|
||||
|
||||
err_unmap_set:
|
||||
if (context)
|
||||
mthca_unmap_user_db(to_mdev(ibdev), &to_mucontext(context)->uar,
|
||||
to_mucontext(context)->db_tab, ucmd.set_db_index);
|
||||
if (udata)
|
||||
mthca_unmap_user_db(to_mdev(ibdev), &context->uar,
|
||||
context->db_tab, ucmd.set_db_index);
|
||||
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
@@ -640,22 +640,24 @@ static int nes_mmap(struct ib_ucontext *context, struct vm_area_struct *vma)
|
||||
/**
|
||||
* nes_alloc_pd
|
||||
*/
|
||||
static int nes_alloc_pd(struct ib_pd *pd, struct ib_ucontext *context,
|
||||
struct ib_udata *udata)
|
||||
static int nes_alloc_pd(struct ib_pd *pd, struct ib_udata *udata)
|
||||
{
|
||||
struct ib_device *ibdev = pd->device;
|
||||
struct nes_pd *nespd = to_nespd(pd);
|
||||
struct nes_vnic *nesvnic = to_nesvnic(ibdev);
|
||||
struct nes_device *nesdev = nesvnic->nesdev;
|
||||
struct nes_adapter *nesadapter = nesdev->nesadapter;
|
||||
struct nes_ucontext *nesucontext;
|
||||
struct nes_alloc_pd_resp uresp;
|
||||
u32 pd_num = 0;
|
||||
int err;
|
||||
struct nes_ucontext *nesucontext = rdma_udata_to_drv_context(
|
||||
udata, struct nes_ucontext, ibucontext);
|
||||
|
||||
nes_debug(NES_DBG_PD, "nesvnic=%p, netdev=%p %s, ibdev=%p, context=%p, netdev refcnt=%u\n",
|
||||
nesvnic, nesdev->netdev[0], nesdev->netdev[0]->name, ibdev, context,
|
||||
netdev_refcnt_read(nesvnic->netdev));
|
||||
nes_debug(
|
||||
NES_DBG_PD,
|
||||
"nesvnic=%p, netdev=%p %s, ibdev=%p, context=%p, netdev refcnt=%u\n",
|
||||
nesvnic, nesdev->netdev[0], nesdev->netdev[0]->name, ibdev,
|
||||
&nesucontext->ibucontext, netdev_refcnt_read(nesvnic->netdev));
|
||||
|
||||
err = nes_alloc_resource(nesadapter, nesadapter->allocated_pds,
|
||||
nesadapter->max_pd, &pd_num, &nesadapter->next_pd, NES_RESOURCE_PD);
|
||||
@@ -667,8 +669,7 @@ static int nes_alloc_pd(struct ib_pd *pd, struct ib_ucontext *context,
|
||||
|
||||
nespd->pd_id = (pd_num << (PAGE_SHIFT-12)) + nesadapter->base_pd;
|
||||
|
||||
if (context) {
|
||||
nesucontext = to_nesucontext(context);
|
||||
if (udata) {
|
||||
nespd->mmap_db_index = find_next_zero_bit(nesucontext->allocated_doorbells,
|
||||
NES_MAX_USER_DB_REGIONS, nesucontext->first_free_db);
|
||||
nes_debug(NES_DBG_PD, "find_first_zero_biton doorbells returned %u, mapping pd_id %u.\n",
|
||||
@@ -1375,7 +1376,6 @@ static int nes_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata)
|
||||
*/
|
||||
static struct ib_cq *nes_create_cq(struct ib_device *ibdev,
|
||||
const struct ib_cq_init_attr *attr,
|
||||
struct ib_ucontext *context,
|
||||
struct ib_udata *udata)
|
||||
{
|
||||
int entries = attr->cqe;
|
||||
@@ -1420,9 +1420,10 @@ static struct ib_cq *nes_create_cq(struct ib_device *ibdev,
|
||||
nescq->hw_cq.cq_number = cq_num;
|
||||
nescq->ibcq.cqe = nescq->hw_cq.cq_size - 1;
|
||||
|
||||
if (udata) {
|
||||
struct nes_ucontext *nes_ucontext = rdma_udata_to_drv_context(
|
||||
udata, struct nes_ucontext, ibucontext);
|
||||
|
||||
if (context) {
|
||||
nes_ucontext = to_nesucontext(context);
|
||||
if (ib_copy_from_udata(&req, udata, sizeof (struct nes_create_cq_req))) {
|
||||
nes_free_resource(nesadapter, nesadapter->allocated_cqs, cq_num);
|
||||
kfree(nescq);
|
||||
@@ -1489,7 +1490,7 @@ static struct ib_cq *nes_create_cq(struct ib_device *ibdev,
|
||||
cqp_request = nes_get_cqp_request(nesdev);
|
||||
if (cqp_request == NULL) {
|
||||
nes_debug(NES_DBG_CQ, "Failed to get a cqp_request.\n");
|
||||
if (!context)
|
||||
if (!udata)
|
||||
pci_free_consistent(nesdev->pcidev, nescq->cq_mem_size, mem,
|
||||
nescq->hw_cq.cq_pbase);
|
||||
else {
|
||||
@@ -1518,7 +1519,7 @@ static struct ib_cq *nes_create_cq(struct ib_device *ibdev,
|
||||
if (nesadapter->free_4kpbl == 0) {
|
||||
spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
|
||||
nes_free_cqp_request(nesdev, cqp_request);
|
||||
if (!context)
|
||||
if (!udata)
|
||||
pci_free_consistent(nesdev->pcidev, nescq->cq_mem_size, mem,
|
||||
nescq->hw_cq.cq_pbase);
|
||||
else {
|
||||
@@ -1540,7 +1541,7 @@ static struct ib_cq *nes_create_cq(struct ib_device *ibdev,
|
||||
if (nesadapter->free_256pbl == 0) {
|
||||
spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
|
||||
nes_free_cqp_request(nesdev, cqp_request);
|
||||
if (!context)
|
||||
if (!udata)
|
||||
pci_free_consistent(nesdev->pcidev, nescq->cq_mem_size, mem,
|
||||
nescq->hw_cq.cq_pbase);
|
||||
else {
|
||||
@@ -1566,7 +1567,7 @@ static struct ib_cq *nes_create_cq(struct ib_device *ibdev,
|
||||
set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_ID_IDX,
|
||||
(nescq->hw_cq.cq_number | ((u32)nesdev->ceq_index << 16)));
|
||||
|
||||
if (context) {
|
||||
if (udata) {
|
||||
if (pbl_entries != 1)
|
||||
u64temp = (u64)nespbl->pbl_pbase;
|
||||
else
|
||||
@@ -1597,7 +1598,7 @@ static struct ib_cq *nes_create_cq(struct ib_device *ibdev,
|
||||
nescq->hw_cq.cq_number, ret);
|
||||
if ((!ret) || (cqp_request->major_code)) {
|
||||
nes_put_cqp_request(nesdev, cqp_request);
|
||||
if (!context)
|
||||
if (!udata)
|
||||
pci_free_consistent(nesdev->pcidev, nescq->cq_mem_size, mem,
|
||||
nescq->hw_cq.cq_pbase);
|
||||
else {
|
||||
@@ -1611,7 +1612,7 @@ static struct ib_cq *nes_create_cq(struct ib_device *ibdev,
|
||||
}
|
||||
nes_put_cqp_request(nesdev, cqp_request);
|
||||
|
||||
if (context) {
|
||||
if (udata) {
|
||||
/* free the nespbl */
|
||||
pci_free_consistent(nesdev->pcidev, nespbl->pbl_size, nespbl->pbl_vbase,
|
||||
nespbl->pbl_pbase);
|
||||
|
@@ -47,6 +47,7 @@
|
||||
#include <rdma/ib_umem.h>
|
||||
#include <rdma/ib_addr.h>
|
||||
#include <rdma/ib_cache.h>
|
||||
#include <rdma/uverbs_ioctl.h>
|
||||
|
||||
#include "ocrdma.h"
|
||||
#include "ocrdma_hw.h"
|
||||
@@ -367,6 +368,16 @@ static int ocrdma_get_pd_num(struct ocrdma_dev *dev, struct ocrdma_pd *pd)
|
||||
return status;
|
||||
}
|
||||
|
||||
/*
|
||||
* NOTE:
|
||||
*
|
||||
* ocrdma_ucontext must be used here because this function is also
|
||||
* called from ocrdma_alloc_ucontext where ib_udata does not have
|
||||
* valid ib_ucontext pointer. ib_uverbs_get_context does not call
|
||||
* uobj_{alloc|get_xxx} helpers which are used to store the
|
||||
* ib_ucontext in uverbs_attr_bundle wrapping the ib_udata. so
|
||||
* ib_udata does NOT imply valid ib_ucontext here!
|
||||
*/
|
||||
static int _ocrdma_alloc_pd(struct ocrdma_dev *dev, struct ocrdma_pd *pd,
|
||||
struct ocrdma_ucontext *uctx,
|
||||
struct ib_udata *udata)
|
||||
@@ -593,7 +604,6 @@ int ocrdma_mmap(struct ib_ucontext *context, struct vm_area_struct *vma)
|
||||
}
|
||||
|
||||
static int ocrdma_copy_pd_uresp(struct ocrdma_dev *dev, struct ocrdma_pd *pd,
|
||||
struct ib_ucontext *ib_ctx,
|
||||
struct ib_udata *udata)
|
||||
{
|
||||
int status;
|
||||
@@ -601,7 +611,8 @@ static int ocrdma_copy_pd_uresp(struct ocrdma_dev *dev, struct ocrdma_pd *pd,
|
||||
u64 dpp_page_addr = 0;
|
||||
u32 db_page_size;
|
||||
struct ocrdma_alloc_pd_uresp rsp;
|
||||
struct ocrdma_ucontext *uctx = get_ocrdma_ucontext(ib_ctx);
|
||||
struct ocrdma_ucontext *uctx = rdma_udata_to_drv_context(
|
||||
udata, struct ocrdma_ucontext, ibucontext);
|
||||
|
||||
memset(&rsp, 0, sizeof(rsp));
|
||||
rsp.id = pd->id;
|
||||
@@ -639,18 +650,17 @@ dpp_map_err:
|
||||
return status;
|
||||
}
|
||||
|
||||
int ocrdma_alloc_pd(struct ib_pd *ibpd, struct ib_ucontext *context,
|
||||
struct ib_udata *udata)
|
||||
int ocrdma_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
|
||||
{
|
||||
struct ib_device *ibdev = ibpd->device;
|
||||
struct ocrdma_dev *dev = get_ocrdma_dev(ibdev);
|
||||
struct ocrdma_pd *pd;
|
||||
struct ocrdma_ucontext *uctx = NULL;
|
||||
int status;
|
||||
u8 is_uctx_pd = false;
|
||||
struct ocrdma_ucontext *uctx = rdma_udata_to_drv_context(
|
||||
udata, struct ocrdma_ucontext, ibucontext);
|
||||
|
||||
if (udata && context) {
|
||||
uctx = get_ocrdma_ucontext(context);
|
||||
if (udata) {
|
||||
pd = ocrdma_get_ucontext_pd(uctx);
|
||||
if (pd) {
|
||||
is_uctx_pd = true;
|
||||
@@ -664,8 +674,8 @@ int ocrdma_alloc_pd(struct ib_pd *ibpd, struct ib_ucontext *context,
|
||||
goto exit;
|
||||
|
||||
pd_mapping:
|
||||
if (udata && context) {
|
||||
status = ocrdma_copy_pd_uresp(dev, pd, context, udata);
|
||||
if (udata) {
|
||||
status = ocrdma_copy_pd_uresp(dev, pd, udata);
|
||||
if (status)
|
||||
goto err;
|
||||
}
|
||||
@@ -946,13 +956,17 @@ int ocrdma_dereg_mr(struct ib_mr *ib_mr, struct ib_udata *udata)
|
||||
}
|
||||
|
||||
static int ocrdma_copy_cq_uresp(struct ocrdma_dev *dev, struct ocrdma_cq *cq,
|
||||
struct ib_udata *udata,
|
||||
struct ib_ucontext *ib_ctx)
|
||||
struct ib_udata *udata)
|
||||
{
|
||||
int status;
|
||||
struct ocrdma_ucontext *uctx = get_ocrdma_ucontext(ib_ctx);
|
||||
struct ocrdma_ucontext *uctx = rdma_udata_to_drv_context(
|
||||
udata, struct ocrdma_ucontext, ibucontext);
|
||||
struct ocrdma_create_cq_uresp uresp;
|
||||
|
||||
/* this must be user flow! */
|
||||
if (!udata)
|
||||
return -EINVAL;
|
||||
|
||||
memset(&uresp, 0, sizeof(uresp));
|
||||
uresp.cq_id = cq->id;
|
||||
uresp.page_size = PAGE_ALIGN(cq->len);
|
||||
@@ -983,13 +997,13 @@ err:
|
||||
|
||||
struct ib_cq *ocrdma_create_cq(struct ib_device *ibdev,
|
||||
const struct ib_cq_init_attr *attr,
|
||||
struct ib_ucontext *ib_ctx,
|
||||
struct ib_udata *udata)
|
||||
{
|
||||
int entries = attr->cqe;
|
||||
struct ocrdma_cq *cq;
|
||||
struct ocrdma_dev *dev = get_ocrdma_dev(ibdev);
|
||||
struct ocrdma_ucontext *uctx = NULL;
|
||||
struct ocrdma_ucontext *uctx = rdma_udata_to_drv_context(
|
||||
udata, struct ocrdma_ucontext, ibucontext);
|
||||
u16 pd_id = 0;
|
||||
int status;
|
||||
struct ocrdma_create_cq_ureq ureq;
|
||||
@@ -1011,18 +1025,16 @@ struct ib_cq *ocrdma_create_cq(struct ib_device *ibdev,
|
||||
INIT_LIST_HEAD(&cq->sq_head);
|
||||
INIT_LIST_HEAD(&cq->rq_head);
|
||||
|
||||
if (ib_ctx) {
|
||||
uctx = get_ocrdma_ucontext(ib_ctx);
|
||||
if (udata)
|
||||
pd_id = uctx->cntxt_pd->id;
|
||||
}
|
||||
|
||||
status = ocrdma_mbx_create_cq(dev, cq, entries, ureq.dpp_cq, pd_id);
|
||||
if (status) {
|
||||
kfree(cq);
|
||||
return ERR_PTR(status);
|
||||
}
|
||||
if (ib_ctx) {
|
||||
status = ocrdma_copy_cq_uresp(dev, cq, udata, ib_ctx);
|
||||
if (udata) {
|
||||
status = ocrdma_copy_cq_uresp(dev, cq, udata);
|
||||
if (status)
|
||||
goto ctx_err;
|
||||
}
|
||||
|
@@ -69,13 +69,11 @@ void ocrdma_dealloc_ucontext(struct ib_ucontext *uctx);
|
||||
|
||||
int ocrdma_mmap(struct ib_ucontext *, struct vm_area_struct *vma);
|
||||
|
||||
int ocrdma_alloc_pd(struct ib_pd *pd, struct ib_ucontext *uctx,
|
||||
struct ib_udata *udata);
|
||||
int ocrdma_alloc_pd(struct ib_pd *pd, struct ib_udata *udata);
|
||||
void ocrdma_dealloc_pd(struct ib_pd *pd, struct ib_udata *udata);
|
||||
|
||||
struct ib_cq *ocrdma_create_cq(struct ib_device *ibdev,
|
||||
const struct ib_cq_init_attr *attr,
|
||||
struct ib_ucontext *ib_ctx,
|
||||
struct ib_udata *udata);
|
||||
int ocrdma_resize_cq(struct ib_cq *, int cqe, struct ib_udata *);
|
||||
int ocrdma_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata);
|
||||
|
@@ -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,7 +473,7 @@ 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;
|
||||
}
|
||||
|
||||
@@ -816,9 +818,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);
|
||||
@@ -906,7 +909,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;
|
||||
|
@@ -47,13 +47,11 @@ 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);
|
||||
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 *ibcq, struct ib_udata *udata);
|
||||
|
@@ -447,8 +447,7 @@ int usnic_ib_query_pkey(struct ib_device *ibdev, u8 port, u16 index,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int usnic_ib_alloc_pd(struct ib_pd *ibpd, struct ib_ucontext *context,
|
||||
struct ib_udata *udata)
|
||||
int usnic_ib_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
|
||||
{
|
||||
struct usnic_ib_pd *pd = to_upd(ibpd);
|
||||
void *umem_pd;
|
||||
@@ -590,7 +589,6 @@ out_unlock:
|
||||
|
||||
struct ib_cq *usnic_ib_create_cq(struct ib_device *ibdev,
|
||||
const struct ib_cq_init_attr *attr,
|
||||
struct ib_ucontext *context,
|
||||
struct ib_udata *udata)
|
||||
{
|
||||
struct ib_cq *cq;
|
||||
|
@@ -50,8 +50,7 @@ int usnic_ib_query_gid(struct ib_device *ibdev, u8 port, int index,
|
||||
union ib_gid *gid);
|
||||
int usnic_ib_query_pkey(struct ib_device *ibdev, u8 port, u16 index,
|
||||
u16 *pkey);
|
||||
int usnic_ib_alloc_pd(struct ib_pd *ibpd, struct ib_ucontext *context,
|
||||
struct ib_udata *udata);
|
||||
int usnic_ib_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata);
|
||||
void usnic_ib_dealloc_pd(struct ib_pd *pd, struct ib_udata *udata);
|
||||
struct ib_qp *usnic_ib_create_qp(struct ib_pd *pd,
|
||||
struct ib_qp_init_attr *init_attr,
|
||||
@@ -61,7 +60,6 @@ int usnic_ib_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
|
||||
int attr_mask, struct ib_udata *udata);
|
||||
struct ib_cq *usnic_ib_create_cq(struct ib_device *ibdev,
|
||||
const struct ib_cq_init_attr *attr,
|
||||
struct ib_ucontext *context,
|
||||
struct ib_udata *udata);
|
||||
int usnic_ib_destroy_cq(struct ib_cq *cq, struct ib_udata *udata);
|
||||
struct ib_mr *usnic_ib_reg_mr(struct ib_pd *pd, u64 start, u64 length,
|
||||
|
@@ -49,6 +49,7 @@
|
||||
#include <rdma/ib_addr.h>
|
||||
#include <rdma/ib_smi.h>
|
||||
#include <rdma/ib_user_verbs.h>
|
||||
#include <rdma/uverbs_ioctl.h>
|
||||
|
||||
#include "pvrdma.h"
|
||||
|
||||
@@ -93,7 +94,6 @@ int pvrdma_req_notify_cq(struct ib_cq *ibcq,
|
||||
* pvrdma_create_cq - create completion queue
|
||||
* @ibdev: the device
|
||||
* @attr: completion queue attributes
|
||||
* @context: user context
|
||||
* @udata: user data
|
||||
*
|
||||
* @return: ib_cq completion queue pointer on success,
|
||||
@@ -101,7 +101,6 @@ int pvrdma_req_notify_cq(struct ib_cq *ibcq,
|
||||
*/
|
||||
struct ib_cq *pvrdma_create_cq(struct ib_device *ibdev,
|
||||
const struct ib_cq_init_attr *attr,
|
||||
struct ib_ucontext *context,
|
||||
struct ib_udata *udata)
|
||||
{
|
||||
int entries = attr->cqe;
|
||||
@@ -116,6 +115,8 @@ struct ib_cq *pvrdma_create_cq(struct ib_device *ibdev,
|
||||
struct pvrdma_cmd_create_cq_resp *resp = &rsp.create_cq_resp;
|
||||
struct pvrdma_create_cq_resp cq_resp = {0};
|
||||
struct pvrdma_create_cq ucmd;
|
||||
struct pvrdma_ucontext *context = rdma_udata_to_drv_context(
|
||||
udata, struct pvrdma_ucontext, ibucontext);
|
||||
|
||||
BUILD_BUG_ON(sizeof(struct pvrdma_cqe) != 64);
|
||||
|
||||
@@ -133,7 +134,7 @@ struct ib_cq *pvrdma_create_cq(struct ib_device *ibdev,
|
||||
}
|
||||
|
||||
cq->ibcq.cqe = entries;
|
||||
cq->is_kernel = !context;
|
||||
cq->is_kernel = !udata;
|
||||
|
||||
if (!cq->is_kernel) {
|
||||
if (ib_copy_from_udata(&ucmd, udata, sizeof(ucmd))) {
|
||||
@@ -185,8 +186,7 @@ struct ib_cq *pvrdma_create_cq(struct ib_device *ibdev,
|
||||
memset(cmd, 0, sizeof(*cmd));
|
||||
cmd->hdr.cmd = PVRDMA_CMD_CREATE_CQ;
|
||||
cmd->nchunks = npages;
|
||||
cmd->ctx_handle = (context) ?
|
||||
(u64)to_vucontext(context)->ctx_handle : 0;
|
||||
cmd->ctx_handle = context ? context->ctx_handle : 0;
|
||||
cmd->cqe = entries;
|
||||
cmd->pdir_dma = cq->pdir.dir_dma;
|
||||
ret = pvrdma_cmd_post(dev, &req, &rsp, PVRDMA_CMD_CREATE_CQ_RESP);
|
||||
@@ -204,7 +204,7 @@ struct ib_cq *pvrdma_create_cq(struct ib_device *ibdev,
|
||||
spin_unlock_irqrestore(&dev->cq_tbl_lock, flags);
|
||||
|
||||
if (!cq->is_kernel) {
|
||||
cq->uar = &(to_vucontext(context)->uar);
|
||||
cq->uar = &context->uar;
|
||||
|
||||
/* Copy udata back. */
|
||||
if (ib_copy_to_udata(udata, &cq_resp, sizeof(cq_resp))) {
|
||||
|
@@ -50,6 +50,7 @@
|
||||
#include <rdma/ib_smi.h>
|
||||
#include <rdma/ib_user_verbs.h>
|
||||
#include <rdma/vmw_pvrdma-abi.h>
|
||||
#include <rdma/uverbs_ioctl.h>
|
||||
|
||||
#include "pvrdma.h"
|
||||
|
||||
@@ -419,13 +420,11 @@ int pvrdma_mmap(struct ib_ucontext *ibcontext, struct vm_area_struct *vma)
|
||||
/**
|
||||
* pvrdma_alloc_pd - allocate protection domain
|
||||
* @ibpd: PD pointer
|
||||
* @context: user context
|
||||
* @udata: user data
|
||||
*
|
||||
* @return: the ib_pd protection domain pointer on success, otherwise errno.
|
||||
*/
|
||||
int pvrdma_alloc_pd(struct ib_pd *ibpd, struct ib_ucontext *context,
|
||||
struct ib_udata *udata)
|
||||
int pvrdma_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
|
||||
{
|
||||
struct ib_device *ibdev = ibpd->device;
|
||||
struct pvrdma_pd *pd = to_vpd(ibpd);
|
||||
@@ -436,13 +435,15 @@ int pvrdma_alloc_pd(struct ib_pd *ibpd, struct ib_ucontext *context,
|
||||
struct pvrdma_cmd_create_pd_resp *resp = &rsp.create_pd_resp;
|
||||
struct pvrdma_alloc_pd_resp pd_resp = {0};
|
||||
int ret;
|
||||
struct pvrdma_ucontext *context = rdma_udata_to_drv_context(
|
||||
udata, struct pvrdma_ucontext, ibucontext);
|
||||
|
||||
/* Check allowed max pds */
|
||||
if (!atomic_add_unless(&dev->num_pds, 1, dev->dsr->caps.max_pd))
|
||||
return -ENOMEM;
|
||||
|
||||
cmd->hdr.cmd = PVRDMA_CMD_CREATE_PD;
|
||||
cmd->ctx_handle = (context) ? to_vucontext(context)->ctx_handle : 0;
|
||||
cmd->ctx_handle = context ? context->ctx_handle : 0;
|
||||
ret = pvrdma_cmd_post(dev, &req, &rsp, PVRDMA_CMD_CREATE_PD_RESP);
|
||||
if (ret < 0) {
|
||||
dev_warn(&dev->pdev->dev,
|
||||
@@ -451,12 +452,12 @@ int pvrdma_alloc_pd(struct ib_pd *ibpd, struct ib_ucontext *context,
|
||||
goto err;
|
||||
}
|
||||
|
||||
pd->privileged = !context;
|
||||
pd->privileged = !udata;
|
||||
pd->pd_handle = resp->pd_handle;
|
||||
pd->pdn = resp->pd_handle;
|
||||
pd_resp.pdn = resp->pd_handle;
|
||||
|
||||
if (context) {
|
||||
if (udata) {
|
||||
if (ib_copy_to_udata(udata, &pd_resp, sizeof(pd_resp))) {
|
||||
dev_warn(&dev->pdev->dev,
|
||||
"failed to copy back protection domain\n");
|
||||
|
@@ -398,8 +398,7 @@ int pvrdma_modify_port(struct ib_device *ibdev, u8 port,
|
||||
int pvrdma_mmap(struct ib_ucontext *context, struct vm_area_struct *vma);
|
||||
int pvrdma_alloc_ucontext(struct ib_ucontext *uctx, struct ib_udata *udata);
|
||||
void pvrdma_dealloc_ucontext(struct ib_ucontext *context);
|
||||
int pvrdma_alloc_pd(struct ib_pd *pd, struct ib_ucontext *context,
|
||||
struct ib_udata *udata);
|
||||
int pvrdma_alloc_pd(struct ib_pd *pd, struct ib_udata *udata);
|
||||
void pvrdma_dealloc_pd(struct ib_pd *ibpd, struct ib_udata *udata);
|
||||
struct ib_mr *pvrdma_get_dma_mr(struct ib_pd *pd, int acc);
|
||||
struct ib_mr *pvrdma_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
|
||||
@@ -412,7 +411,6 @@ int pvrdma_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg,
|
||||
int sg_nents, unsigned int *sg_offset);
|
||||
struct ib_cq *pvrdma_create_cq(struct ib_device *ibdev,
|
||||
const struct ib_cq_init_attr *attr,
|
||||
struct ib_ucontext *context,
|
||||
struct ib_udata *udata);
|
||||
int pvrdma_destroy_cq(struct ib_cq *cq, struct ib_udata *udata);
|
||||
int pvrdma_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc);
|
||||
|
在新工单中引用
屏蔽一个用户