Re: [PATCH 33 of 33] IB/ipath - fix drift between WCs in user and kernel space

2007-03-19 Thread Roland Dreier
For example this seems like it should go in 2.6.21 -- otherwise
userspace verbs are completely broken with ipath, right?  It's really
my fault for breaking it, but I don't see why we want to release with
a bug like that.

 - R.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 33 of 33] IB/ipath - fix drift between WCs in user and kernel space

2007-03-19 Thread Roland Dreier
For example this seems like it should go in 2.6.21 -- otherwise
userspace verbs are completely broken with ipath, right?  It's really
my fault for breaking it, but I don't see why we want to release with
a bug like that.

 - R.
-
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 33 of 33] IB/ipath - fix drift between WCs in user and kernel space

2007-03-15 Thread Bryan O'Sullivan
# HG changeset patch
# User Robert Walsh <[EMAIL PROTECTED]>
# Date 1173994466 25200
# Node ID e61b0123190cfbc01cc34d1c648d1752a89f8f3d
# Parent  c3b5b279bc90e5758da2ac382cbff4ee0245e84b
IB/ipath - fix drift between WCs in user and kernel space

The kernel ib_wc structure now uses a QP pointer, but the user space
equivalent uses a QP number instead.  This means we can no longer use
a simple structure copy to copy stuff into user space.

Signed-off-by: Bryan O'Sullivan <[EMAIL PROTECTED]>

diff -r c3b5b279bc90 -r e61b0123190c drivers/infiniband/hw/ipath/ipath_cq.c
--- a/drivers/infiniband/hw/ipath/ipath_cq.cThu Mar 15 14:34:26 2007 -0700
+++ b/drivers/infiniband/hw/ipath/ipath_cq.cThu Mar 15 14:34:26 2007 -0700
@@ -76,7 +76,20 @@ void ipath_cq_enter(struct ipath_cq *cq,
}
return;
}
-   wc->queue[head] = *entry;
+   wc->queue[head].wr_id = entry->wr_id;
+   wc->queue[head].status = entry->status;
+   wc->queue[head].opcode = entry->opcode;
+   wc->queue[head].vendor_err = entry->vendor_err;
+   wc->queue[head].byte_len = entry->byte_len;
+   wc->queue[head].imm_data = (__u32 __force)entry->imm_data;
+   wc->queue[head].qp_num = entry->qp->qp_num;
+   wc->queue[head].src_qp = entry->src_qp;
+   wc->queue[head].wc_flags = entry->wc_flags;
+   wc->queue[head].pkey_index = entry->pkey_index;
+   wc->queue[head].slid = entry->slid;
+   wc->queue[head].sl = entry->sl;
+   wc->queue[head].dlid_path_bits = entry->dlid_path_bits;
+   wc->queue[head].port_num = entry->port_num;
wc->head = next;
 
if (cq->notify == IB_CQ_NEXT_COMP ||
@@ -122,9 +135,30 @@ int ipath_poll_cq(struct ib_cq *ibcq, in
if (tail > (u32) cq->ibcq.cqe)
tail = (u32) cq->ibcq.cqe;
for (npolled = 0; npolled < num_entries; ++npolled, ++entry) {
+   struct ipath_qp *qp;
+
if (tail == wc->head)
break;
-   *entry = wc->queue[tail];
+
+   qp = ipath_lookup_qpn(_idev(cq->ibcq.device)->qp_table,
+ wc->queue[tail].qp_num);
+   entry->qp = >ibqp;
+   if (atomic_dec_and_test(>refcount))
+   wake_up(>wait);
+
+   entry->wr_id = wc->queue[tail].wr_id;
+   entry->status = wc->queue[tail].status;
+   entry->opcode = wc->queue[tail].opcode;
+   entry->vendor_err = wc->queue[tail].vendor_err;
+   entry->byte_len = wc->queue[tail].byte_len;
+   entry->imm_data = wc->queue[tail].imm_data;
+   entry->src_qp = wc->queue[tail].src_qp;
+   entry->wc_flags = wc->queue[tail].wc_flags;
+   entry->pkey_index = wc->queue[tail].pkey_index;
+   entry->slid = wc->queue[tail].slid;
+   entry->sl = wc->queue[tail].sl;
+   entry->dlid_path_bits = wc->queue[tail].dlid_path_bits;
+   entry->port_num = wc->queue[tail].port_num;
if (tail >= cq->ibcq.cqe)
tail = 0;
else
diff -r c3b5b279bc90 -r e61b0123190c drivers/infiniband/hw/ipath/ipath_verbs.h
--- a/drivers/infiniband/hw/ipath/ipath_verbs.h Thu Mar 15 14:34:26 2007 -0700
+++ b/drivers/infiniband/hw/ipath/ipath_verbs.h Thu Mar 15 14:34:26 2007 -0700
@@ -40,6 +40,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include "ipath_layer.h"
 
@@ -188,7 +189,7 @@ struct ipath_cq_wc {
 struct ipath_cq_wc {
u32 head;   /* index of next entry to fill */
u32 tail;   /* index of next ib_poll_cq() entry */
-   struct ib_wc queue[1];  /* this is actually size ibcq.cqe + 1 */
+   struct ib_uverbs_wc queue[1]; /* this is actually size ibcq.cqe + 1 */
 };
 
 /*
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 33 of 33] IB/ipath - fix drift between WCs in user and kernel space

2007-03-15 Thread Bryan O'Sullivan
# HG changeset patch
# User Robert Walsh [EMAIL PROTECTED]
# Date 1173994466 25200
# Node ID e61b0123190cfbc01cc34d1c648d1752a89f8f3d
# Parent  c3b5b279bc90e5758da2ac382cbff4ee0245e84b
IB/ipath - fix drift between WCs in user and kernel space

The kernel ib_wc structure now uses a QP pointer, but the user space
equivalent uses a QP number instead.  This means we can no longer use
a simple structure copy to copy stuff into user space.

Signed-off-by: Bryan O'Sullivan [EMAIL PROTECTED]

diff -r c3b5b279bc90 -r e61b0123190c drivers/infiniband/hw/ipath/ipath_cq.c
--- a/drivers/infiniband/hw/ipath/ipath_cq.cThu Mar 15 14:34:26 2007 -0700
+++ b/drivers/infiniband/hw/ipath/ipath_cq.cThu Mar 15 14:34:26 2007 -0700
@@ -76,7 +76,20 @@ void ipath_cq_enter(struct ipath_cq *cq,
}
return;
}
-   wc-queue[head] = *entry;
+   wc-queue[head].wr_id = entry-wr_id;
+   wc-queue[head].status = entry-status;
+   wc-queue[head].opcode = entry-opcode;
+   wc-queue[head].vendor_err = entry-vendor_err;
+   wc-queue[head].byte_len = entry-byte_len;
+   wc-queue[head].imm_data = (__u32 __force)entry-imm_data;
+   wc-queue[head].qp_num = entry-qp-qp_num;
+   wc-queue[head].src_qp = entry-src_qp;
+   wc-queue[head].wc_flags = entry-wc_flags;
+   wc-queue[head].pkey_index = entry-pkey_index;
+   wc-queue[head].slid = entry-slid;
+   wc-queue[head].sl = entry-sl;
+   wc-queue[head].dlid_path_bits = entry-dlid_path_bits;
+   wc-queue[head].port_num = entry-port_num;
wc-head = next;
 
if (cq-notify == IB_CQ_NEXT_COMP ||
@@ -122,9 +135,30 @@ int ipath_poll_cq(struct ib_cq *ibcq, in
if (tail  (u32) cq-ibcq.cqe)
tail = (u32) cq-ibcq.cqe;
for (npolled = 0; npolled  num_entries; ++npolled, ++entry) {
+   struct ipath_qp *qp;
+
if (tail == wc-head)
break;
-   *entry = wc-queue[tail];
+
+   qp = ipath_lookup_qpn(to_idev(cq-ibcq.device)-qp_table,
+ wc-queue[tail].qp_num);
+   entry-qp = qp-ibqp;
+   if (atomic_dec_and_test(qp-refcount))
+   wake_up(qp-wait);
+
+   entry-wr_id = wc-queue[tail].wr_id;
+   entry-status = wc-queue[tail].status;
+   entry-opcode = wc-queue[tail].opcode;
+   entry-vendor_err = wc-queue[tail].vendor_err;
+   entry-byte_len = wc-queue[tail].byte_len;
+   entry-imm_data = wc-queue[tail].imm_data;
+   entry-src_qp = wc-queue[tail].src_qp;
+   entry-wc_flags = wc-queue[tail].wc_flags;
+   entry-pkey_index = wc-queue[tail].pkey_index;
+   entry-slid = wc-queue[tail].slid;
+   entry-sl = wc-queue[tail].sl;
+   entry-dlid_path_bits = wc-queue[tail].dlid_path_bits;
+   entry-port_num = wc-queue[tail].port_num;
if (tail = cq-ibcq.cqe)
tail = 0;
else
diff -r c3b5b279bc90 -r e61b0123190c drivers/infiniband/hw/ipath/ipath_verbs.h
--- a/drivers/infiniband/hw/ipath/ipath_verbs.h Thu Mar 15 14:34:26 2007 -0700
+++ b/drivers/infiniband/hw/ipath/ipath_verbs.h Thu Mar 15 14:34:26 2007 -0700
@@ -40,6 +40,7 @@
 #include linux/interrupt.h
 #include linux/kref.h
 #include rdma/ib_pack.h
+#include rdma/ib_user_verbs.h
 
 #include ipath_layer.h
 
@@ -188,7 +189,7 @@ struct ipath_cq_wc {
 struct ipath_cq_wc {
u32 head;   /* index of next entry to fill */
u32 tail;   /* index of next ib_poll_cq() entry */
-   struct ib_wc queue[1];  /* this is actually size ibcq.cqe + 1 */
+   struct ib_uverbs_wc queue[1]; /* this is actually size ibcq.cqe + 1 */
 };
 
 /*
-
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/