[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <1168371562.17406.3.camel@stevo-desktop>
Date: Tue, 09 Jan 2007 13:39:22 -0600
From: Steve Wise <swise@...ngridcomputing.com>
To: "Michael S. Tsirkin" <mst@...lanox.co.il>
Cc: netdev@...r.kernel.org, Roland Dreier <rdreier@...co.com>,
Divy Le Ray <divy@...lsio.com>, linux-kernel@...r.kernel.org,
openib-general <openib-general@...nib.org>
Subject: Re: [openib-general] [PATCH 1/10] cxgb3 - main header files
>
> In the interest of expediting this I'll go implement it...
>
> Steve.
>
Here it is. I think this is the correct way to solve the issue (now
that I've implemented it :). This is a delta from the driver patch
series just for reviewing purposes.
commit e6053f2aee764b21e28cbb19f52995cb413cf733
Author: Steve Wise <swise@...ngridcomputing.com>
Date: Tue Jan 9 13:06:13 2007 -0600
Chelsio-specific solution for copying in the user cq_index.
- at cq_create time, user lib passes in the address of its cq rptr u32.
- kernel saves this address in the iwch_cq struct.
- kernel copies in the rptr value in iwch_req_notify_cq().
Signed-off-by: Steve Wise <swise@...ngridcomputing.com>
diff --git a/drivers/infiniband/hw/cxgb3/iwch_provider.c b/drivers/infiniband/hw/cxgb3/iwch_provider.c
index ab99202..28be418 100644
--- a/drivers/infiniband/hw/cxgb3/iwch_provider.c
+++ b/drivers/infiniband/hw/cxgb3/iwch_provider.c
@@ -143,6 +143,7 @@ static struct ib_cq *iwch_create_cq(stru
struct iwch_dev *rhp;
struct iwch_cq *chp;
struct iwch_create_cq_resp uresp;
+ struct iwch_create_cq_req ureq;
PDBG("%s ib_dev %p entries %d\n", __FUNCTION__, ibdev, entries);
rhp = to_iwch_dev(ibdev);
@@ -150,6 +151,14 @@ static struct ib_cq *iwch_create_cq(stru
if (!chp)
return ERR_PTR(-ENOMEM);
+ if (context) {
+ if (ib_copy_from_udata(&ureq, udata, sizeof (ureq))) {
+ kfree(chp);
+ return ERR_PTR(-EFAULT);
+ }
+ chp->user_rptr_addr = (u32 *)(unsigned long)ureq.user_rptr_addr;
+ }
+
if (t3a_device(rhp)) {
/*
@@ -269,15 +278,14 @@ static int iwch_resize_cq(struct ib_cq *
return ret;
}
-static int iwch_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify notify,
- struct ib_udata *udata)
+static int iwch_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify notify)
{
struct iwch_dev *rhp;
struct iwch_cq *chp;
enum t3_cq_opcode cq_op;
int err;
unsigned long flag;
- struct iwch_req_notify_cq ucmd;
+ u32 rptr;
chp = to_iwch_cq(ibcq);
rhp = chp->rhp;
@@ -285,11 +293,11 @@ static int iwch_arm_cq(struct ib_cq *ibc
cq_op = CQ_ARM_SE;
else
cq_op = CQ_ARM_AN;
- if (udata && t3b_device(rhp)) {
- if (ib_copy_from_udata(&ucmd, udata, sizeof ucmd))
+ if (chp->user_rptr_addr) {
+ if (get_user(rptr, chp->user_rptr_addr))
return -EFAULT;
spin_lock_irqsave(&chp->lock, flag);
- chp->cq.rptr = ucmd.rptr;
+ chp->cq.rptr = rptr;
} else
spin_lock_irqsave(&chp->lock, flag);
PDBG("%s rptr 0x%x\n", __FUNCTION__, chp->cq.rptr);
diff --git a/drivers/infiniband/hw/cxgb3/iwch_provider.h b/drivers/infiniband/hw/cxgb3/iwch_provider.h
index f339427..d9d94e3 100644
--- a/drivers/infiniband/hw/cxgb3/iwch_provider.h
+++ b/drivers/infiniband/hw/cxgb3/iwch_provider.h
@@ -105,6 +105,7 @@ struct iwch_cq {
spinlock_t lock;
atomic_t refcnt;
wait_queue_head_t wait;
+ u32 *user_rptr_addr;
};
static inline struct iwch_cq *to_iwch_cq(struct ib_cq *ibcq)
diff --git a/drivers/infiniband/hw/cxgb3/iwch_user.h b/drivers/infiniband/hw/cxgb3/iwch_user.h
index 4e4b9c9..e8ff061 100644
--- a/drivers/infiniband/hw/cxgb3/iwch_user.h
+++ b/drivers/infiniband/hw/cxgb3/iwch_user.h
@@ -42,6 +42,9 @@ #define IWCH_UVERBS_ABI_VERSION 1
* In particular do not use pointer types -- pass pointers in __u64
* instead.
*/
+struct iwch_create_cq_req {
+ __u64 user_rptr_addr;
+};
struct iwch_create_cq_resp {
__u64 physaddr;
@@ -61,8 +64,4 @@ struct iwch_create_qp_resp {
struct iwch_reg_user_mr_resp {
__u32 pbl_addr;
};
-
-struct iwch_req_notify_cq {
- __u32 rptr;
-};
#endif
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists