<br><font size=2 face="sans-serif">Here is a first version of the IPOIB_CM_NOSRQ
patch for review. Will benefit adapters that do not (yet) support shared
receive queues. This patch works in </font>
<br><font size=2 face="sans-serif">conjunction with the IPOIB CM patches
submitted by Michael Tsirkin. That has now been integrated into Roland's
2.6.21-rc1 git tree and so this can be</font>
<br><font size=2 face="sans-serif">applied on top of that tree.</font>
<br>
<br><font size=2 face="sans-serif">Instead of the srq hanging off ipoib_cm_dev_priv,
this patch introduces an rx_ring hanging off ipoib_cm_rx. There are some
changes in the initialization</font>
<br><font size=2 face="sans-serif">and cleanup paths since srqs are not
used.</font>
<br>
<br><font size=2 face="sans-serif">This has been tested on the IBM HCA
with the ehca driver. Please note another small patch (not in this one)
is needed to the ehca driver for it to work on the IBM HCAs.</font>
<br>
<br><font size=2 face="sans-serif">Signed-off-by: Pradeep Satyanarayana
<pradeep@us.ibm.com></font>
<br><font size=2 face="sans-serif">-----------------------------------------------------------------------------------------------</font>
<br>
<br><font size=2 face="Courier New">--- linux-2.6.21-rc1-mst/drivers/infiniband/ulp/ipoib/Makefile
2007-03-08 17:09:48.000000000 -0800</font>
<br><font size=2 face="Courier New">+++ linux-2.6.21-rc1/drivers/infiniband/ulp/ipoib/Makefile
2007-03-09 08:51:41.000000000 -0800</font>
<br><font size=2 face="Courier New">@@ -1,3 +1,4 @@</font>
<br><font size=2 face="Courier New">+EXTRA_CFLAGS += -DIPOIB_CM_NOSRQ</font>
<br><font size=2 face="Courier New"> obj-$(CONFIG_INFINIBAND_IPOIB)
+= ib_ipoib.o</font>
<br><font size=2 face="Courier New"> </font>
<br><font size=2 face="Courier New"> ib_ipoib-y
:= ipoib_main.o \</font>
<br><font size=2 face="Courier New">--- linux-2.6.21-rc1-mst/drivers/infiniband/ulp/ipoib/ipoib.h
2007-03-08 17:09:48.000000000 -0800</font>
<br><font size=2 face="Courier New">+++ linux-2.6.21-rc1/drivers/infiniband/ulp/ipoib/ipoib.h
2007-03-08 17:35:07.000000000 -0800</font>
<br><font size=2 face="Courier New">@@ -98,7 +98,11 @@ enum {</font>
<br><font size=2 face="Courier New"> </font>
<br><font size=2 face="Courier New"> #define
IPOIB_OP_RECV (1ul << 31)</font>
<br><font size=2 face="Courier New"> #ifdef CONFIG_INFINIBAND_IPOIB_CM</font>
<br><font size=2 face="Courier New">+#ifdef IPOIB_CM_NOSRQ</font>
<br><font size=2 face="Courier New">+#define IPOIB_CM_OP_NOSRQ
(1ul << 30)</font>
<br><font size=2 face="Courier New">+#else</font>
<br><font size=2 face="Courier New"> #define
IPOIB_CM_OP_SRQ (1ul << 30)</font>
<br><font size=2 face="Courier New">+#endif</font>
<br><font size=2 face="Courier New"> #else</font>
<br><font size=2 face="Courier New"> #define
IPOIB_CM_OP_SRQ (0)</font>
<br><font size=2 face="Courier New"> #endif</font>
<br><font size=2 face="Courier New">@@ -136,6 +140,9 @@ struct ipoib_cm_data
{</font>
<br><font size=2 face="Courier New"> struct ipoib_cm_rx {</font>
<br><font size=2 face="Courier New"> struct
ib_cm_id *id;</font>
<br><font size=2 face="Courier New"> struct
ib_qp *qp;</font>
<br><font size=2 face="Courier New">+#ifdef IPOIB_CM_NOSRQ</font>
<br><font size=2 face="Courier New">+ struct
ipoib_cm_rx_buf *rx_ring;</font>
<br><font size=2 face="Courier New">+#endif</font>
<br><font size=2 face="Courier New"> struct
list_head list;</font>
<br><font size=2 face="Courier New"> struct
net_device *dev;</font>
<br><font size=2 face="Courier New"> unsigned
long jiffies;</font>
<br><font size=2 face="Courier New">@@ -163,8 +170,10 @@ struct ipoib_cm_rx_buf
{</font>
<br><font size=2 face="Courier New"> };</font>
<br><font size=2 face="Courier New"> </font>
<br><font size=2 face="Courier New"> struct ipoib_cm_dev_priv {</font>
<br><font size=2 face="Courier New">+#ifndef IPOIB_CM_NOSRQ</font>
<br><font size=2 face="Courier New"> struct
ib_srq
*srq;</font>
<br><font size=2 face="Courier New"> struct
ipoib_cm_rx_buf *srq_ring;</font>
<br><font size=2 face="Courier New">+#endif</font>
<br><font size=2 face="Courier New"> struct
ib_cm_id *id;</font>
<br><font size=2 face="Courier New"> struct
list_head passive_ids;</font>
<br><font size=2 face="Courier New"> struct
work_struct start_task;</font>
<br><font size=2 face="Courier New">--- linux-2.6.21-rc1-mst/drivers/infiniband/ulp/ipoib/ipoib_cm.c
2007-03-08 17:09:48.000000000 -0800</font>
<br><font size=2 face="Courier New">+++ linux-2.6.21-rc1/drivers/infiniband/ulp/ipoib/ipoib_cm.c
2007-03-09 08:39:00.000000000 -0800</font>
<br><font size=2 face="Courier New">@@ -76,12 +76,47 @@ static void ipoib_cm_dma_unmap_rx(struct</font>
<br><font size=2 face="Courier New">
ib_dma_unmap_single(priv->ca, mapping[i
+ 1], PAGE_SIZE, DMA_FROM_DEVICE);</font>
<br><font size=2 face="Courier New"> }</font>
<br><font size=2 face="Courier New"> </font>
<br><font size=2 face="Courier New">+#ifdef IPOIB_CM_NOSRQ</font>
<br><font size=2 face="Courier New">+static int ipoib_cm_post_receive(struct
net_device *dev, u64 id)</font>
<br><font size=2 face="Courier New">+#else</font>
<br><font size=2 face="Courier New"> static int ipoib_cm_post_receive(struct
net_device *dev, int id)</font>
<br><font size=2 face="Courier New">+#endif</font>
<br><font size=2 face="Courier New"> {</font>
<br><font size=2 face="Courier New"> struct
ipoib_dev_priv *priv = netdev_priv(dev);</font>
<br><font size=2 face="Courier New"> struct
ib_recv_wr *bad_wr;</font>
<br><font size=2 face="Courier New"> int
i, ret;</font>
<br><font size=2 face="Courier New">+#ifdef IPOIB_CM_NOSRQ</font>
<br><font size=2 face="Courier New">+ unsigned
long flags;</font>
<br><font size=2 face="Courier New">+ struct
ipoib_cm_rx *rx_ptr;</font>
<br><font size=2 face="Courier New">+ u32 qp_num
= id & 0xffffffff;</font>
<br><font size=2 face="Courier New">+ u64 wr_id
= id >> 32;</font>
<br><font size=2 face="Courier New">+ int
found = 0;</font>
<br><font size=2 face="Courier New">+</font>
<br><font size=2 face="Courier New">+ spin_lock_irqsave(&priv->lock,
flags);</font>
<br><font size=2 face="Courier New">+ list_for_each_entry(rx_ptr,
&priv->cm.passive_ids, list) </font>
<br><font size=2 face="Courier New">+
if (qp_num == rx_ptr->qp->qp_num) {</font>
<br><font size=2 face="Courier New">+
found
= 1;</font>
<br><font size=2 face="Courier New">+
break;</font>
<br><font size=2 face="Courier New">+
}</font>
<br><font size=2 face="Courier New">+ spin_unlock_irqrestore(&priv->lock,
flags);</font>
<br><font size=2 face="Courier New">+ if
(!found)</font>
<br><font size=2 face="Courier New">+
printk(KERN_WARNING "qp not on
passive_ids list!!\n");</font>
<br><font size=2 face="Courier New"> </font>
<br><font size=2 face="Courier New">+ priv->cm.rx_wr.wr_id
= wr_id << 32 | qp_num | IPOIB_CM_OP_NOSRQ; </font>
<br><font size=2 face="Courier New">+</font>
<br><font size=2 face="Courier New">+ for
(i = 0; i < IPOIB_CM_RX_SG; ++i)</font>
<br><font size=2 face="Courier New">+
priv->cm.rx_sge[i].addr = rx_ptr->rx_ring[wr_id].mapping[i];</font>
<br><font size=2 face="Courier New">+</font>
<br><font size=2 face="Courier New">+ ret
= ib_post_recv(rx_ptr->qp, &priv->cm.rx_wr, &bad_wr);</font>
<br><font size=2 face="Courier New">+ if
(unlikely(ret)) {</font>
<br><font size=2 face="Courier New">+
ipoib_warn(priv, "post recv failed
for buf %d (%d)\n", </font>
<br><font size=2 face="Courier New">+
wr_id, ret);</font>
<br><font size=2 face="Courier New">+
ipoib_cm_dma_unmap_rx(priv, IPOIB_CM_RX_SG
- 1, </font>
<br><font size=2 face="Courier New">+
rx_ptr->rx_ring[wr_id].mapping);</font>
<br><font size=2 face="Courier New">+
dev_kfree_skb_any(rx_ptr->rx_ring[wr_id].skb);</font>
<br><font size=2 face="Courier New">+
rx_ptr->rx_ring[wr_id].skb = NULL;</font>
<br><font size=2 face="Courier New">+ }</font>
<br><font size=2 face="Courier New">+#else</font>
<br><font size=2 face="Courier New"> priv->cm.rx_wr.wr_id
= id | IPOIB_CM_OP_SRQ;</font>
<br><font size=2 face="Courier New"> </font>
<br><font size=2 face="Courier New"> for
(i = 0; i < IPOIB_CM_RX_SG; ++i)</font>
<br><font size=2 face="Courier New">@@ -96,15 +131,30 @@ static int ipoib_cm_post_receive(struct
</font>
<br><font size=2 face="Courier New">
priv->cm.srq_ring[id].skb = NULL;</font>
<br><font size=2 face="Courier New"> }</font>
<br><font size=2 face="Courier New"> </font>
<br><font size=2 face="Courier New">+#endif</font>
<br><font size=2 face="Courier New"> return
ret;</font>
<br><font size=2 face="Courier New"> }</font>
<br><font size=2 face="Courier New"> </font>
<br><font size=2 face="Courier New">+#ifdef IPOIB_CM_NOSRQ</font>
<br><font size=2 face="Courier New">+static struct sk_buff *ipoib_cm_alloc_rx_skb(struct
net_device *dev, u64 id, </font>
<br><font size=2 face="Courier New">+
int frags,</font>
<br><font size=2 face="Courier New">+
u64 mapping[IPOIB_CM_RX_SG])</font>
<br><font size=2 face="Courier New">+#else</font>
<br><font size=2 face="Courier New"> static struct sk_buff *ipoib_cm_alloc_rx_skb(struct
net_device *dev, int id, int frags,</font>
<br><font size=2 face="Courier New">
u64 mapping[IPOIB_CM_RX_SG])</font>
<br><font size=2 face="Courier New">+#endif</font>
<br><font size=2 face="Courier New"> {</font>
<br><font size=2 face="Courier New"> struct
ipoib_dev_priv *priv = netdev_priv(dev);</font>
<br><font size=2 face="Courier New"> struct
sk_buff *skb;</font>
<br><font size=2 face="Courier New"> int
i;</font>
<br><font size=2 face="Courier New">+#ifdef IPOIB_CM_NOSRQ</font>
<br><font size=2 face="Courier New">+ unsigned
long flags;</font>
<br><font size=2 face="Courier New">+ struct
ipoib_cm_rx *rx_ptr;</font>
<br><font size=2 face="Courier New">+ u32 qp_num
= id & 0xffffffff;</font>
<br><font size=2 face="Courier New">+ u32 wr_id
= id >> 32;</font>
<br><font size=2 face="Courier New">+ int found = 0;</font>
<br><font size=2 face="Courier New">+#endif</font>
<br><font size=2 face="Courier New">+</font>
<br><font size=2 face="Courier New"> </font>
<br><font size=2 face="Courier New"> skb
= dev_alloc_skb(IPOIB_CM_HEAD_SIZE + 12);</font>
<br><font size=2 face="Courier New"> if
(unlikely(!skb))</font>
<br><font size=2 face="Courier New">@@ -136,7 +186,25 @@ static struct
sk_buff *ipoib_cm_alloc_rx</font>
<br><font size=2 face="Courier New">
goto
partial_error;</font>
<br><font size=2 face="Courier New"> }</font>
<br><font size=2 face="Courier New"> </font>
<br><font size=2 face="Courier New">+#ifdef IPOIB_CM_NOSRQ</font>
<br><font size=2 face="Courier New">+</font>
<br><font size=2 face="Courier New">+ spin_lock_irqsave(&priv->lock,
flags);</font>
<br><font size=2 face="Courier New">+ list_for_each_entry(rx_ptr,
&priv->cm.passive_ids, list)</font>
<br><font size=2 face="Courier New">+
if(qp_num == rx_ptr->qp->qp_num) {</font>
<br><font size=2 face="Courier New">+
found = 1;</font>
<br><font size=2 face="Courier New">+
break;</font>
<br><font size=2 face="Courier New">+
}</font>
<br><font size=2 face="Courier New">+ spin_unlock_irqrestore(&priv->lock,
flags);</font>
<br><font size=2 face="Courier New">+</font>
<br><font size=2 face="Courier New">+ if (!found)</font>
<br><font size=2 face="Courier New">+
printk(KERN_WARNING "qp not on passive_ids list!!\n");</font>
<br><font size=2 face="Courier New">+</font>
<br><font size=2 face="Courier New">+ /* Use
the rx_ptr to get the requisite entry */</font>
<br><font size=2 face="Courier New">+ rx_ptr->rx_ring[wr_id].skb
= skb;</font>
<br><font size=2 face="Courier New">+</font>
<br><font size=2 face="Courier New">+#else</font>
<br><font size=2 face="Courier New"> priv->cm.srq_ring[id].skb
= skb;</font>
<br><font size=2 face="Courier New">+#endif</font>
<br><font size=2 face="Courier New"> return
skb;</font>
<br><font size=2 face="Courier New"> </font>
<br><font size=2 face="Courier New"> partial_error:</font>
<br><font size=2 face="Courier New">@@ -157,9 +225,16 @@ static struct
ib_qp *ipoib_cm_create_rx_</font>
<br><font size=2 face="Courier New"> struct
ib_qp_init_attr attr = {</font>
<br><font size=2 face="Courier New">
.send_cq = priv->cq, /* does not
matter, we never send anything */</font>
<br><font size=2 face="Courier New">
.recv_cq = priv->cq,</font>
<br><font size=2 face="Courier New">+#ifdef IPOIB_CM_NOSRQ</font>
<br><font size=2 face="Courier New">+
.srq = NULL,</font>
<br><font size=2 face="Courier New">+#else</font>
<br><font size=2 face="Courier New">
.srq = priv->cm.srq,</font>
<br><font size=2 face="Courier New">+#endif</font>
<br><font size=2 face="Courier New">
.cap.max_send_wr = 1, /* FIXME: 0 Seems
not to work */</font>
<br><font size=2 face="Courier New">+
.cap.max_recv_wr = ipoib_recvq_size
+ 1,</font>
<br><font size=2 face="Courier New">
.cap.max_send_sge = 1, /* FIXME: 0 Seems
not to work */</font>
<br><font size=2 face="Courier New">+
/* .cap.max_recv_sge = 1, */ /* Is this
correct? */</font>
<br><font size=2 face="Courier New">+
.cap.max_recv_sge = IPOIB_CM_RX_SG,
/* Is this correct? */</font>
<br><font size=2 face="Courier New">
.sq_sig_type = IB_SIGNAL_ALL_WR,</font>
<br><font size=2 face="Courier New">
.qp_type = IB_QPT_RC,</font>
<br><font size=2 face="Courier New">
.qp_context = p,</font>
<br><font size=2 face="Courier New">@@ -217,7 +292,11 @@ static int ipoib_cm_send_rep(struct
net_</font>
<br><font size=2 face="Courier New"> rep.flow_control
= 0;</font>
<br><font size=2 face="Courier New"> rep.rnr_retry_count
= req->rnr_retry_count;</font>
<br><font size=2 face="Courier New"> rep.target_ack_delay
= 20; /* FIXME */</font>
<br><font size=2 face="Courier New">+#ifdef IPOIB_CM_NOSRQ</font>
<br><font size=2 face="Courier New">+ rep.srq
= 0;</font>
<br><font size=2 face="Courier New">+#else</font>
<br><font size=2 face="Courier New"> rep.srq
= 1;</font>
<br><font size=2 face="Courier New">+#endif</font>
<br><font size=2 face="Courier New"> rep.qp_num
= qp->qp_num;</font>
<br><font size=2 face="Courier New"> rep.starting_psn
= psn;</font>
<br><font size=2 face="Courier New"> return
ib_send_cm_rep(cm_id, &rep);</font>
<br><font size=2 face="Courier New">@@ -231,6 +310,12 @@ static int ipoib_cm_req_handler(struct
i</font>
<br><font size=2 face="Courier New"> unsigned
long flags;</font>
<br><font size=2 face="Courier New"> unsigned
psn;</font>
<br><font size=2 face="Courier New"> int
ret;</font>
<br><font size=2 face="Courier New">+ struct
ib_qp_attr qp_attr;</font>
<br><font size=2 face="Courier New">+ int
qp_attr_mask;</font>
<br><font size=2 face="Courier New">+#ifdef IPOIB_CM_NOSRQ</font>
<br><font size=2 face="Courier New">+ u32 qp_num;</font>
<br><font size=2 face="Courier New">+ u64 i;</font>
<br><font size=2 face="Courier New">+#endif</font>
<br><font size=2 face="Courier New"> </font>
<br><font size=2 face="Courier New"> ipoib_dbg(priv,
"REQ arrived\n");</font>
<br><font size=2 face="Courier New"> p
= kzalloc(sizeof *p, GFP_KERNEL);</font>
<br><font size=2 face="Courier New">@@ -244,10 +329,46 @@ static int ipoib_cm_req_handler(struct
i</font>
<br><font size=2 face="Courier New">
goto err_qp;</font>
<br><font size=2 face="Courier New"> }</font>
<br><font size=2 face="Courier New"> </font>
<br><font size=2 face="Courier New">+#ifdef IPOIB_CM_NOSRQ</font>
<br><font size=2 face="Courier New">+ qp_num
= p->qp->qp_num;</font>
<br><font size=2 face="Courier New">+</font>
<br><font size=2 face="Courier New">+ /* Allocate
space for the rx_ring here */</font>
<br><font size=2 face="Courier New">+ p->rx_ring
= kzalloc(ipoib_recvq_size * sizeof *p->rx_ring,</font>
<br><font size=2 face="Courier New">+
GFP_KERNEL);</font>
<br><font size=2 face="Courier New">+</font>
<br><font size=2 face="Courier New">+ cm_id->context
= p;</font>
<br><font size=2 face="Courier New">+ p->jiffies
= jiffies;</font>
<br><font size=2 face="Courier New">+ spin_lock_irqsave(&priv->lock,
flags);</font>
<br><font size=2 face="Courier New">+ list_add(&p->list,
&priv->cm.passive_ids);</font>
<br><font size=2 face="Courier New">+ spin_unlock_irqrestore(&priv->lock,
flags);</font>
<br><font size=2 face="Courier New">+</font>
<br><font size=2 face="Courier New">+ psn
= random32() & 0xffffff;</font>
<br><font size=2 face="Courier New">+ ret =
ipoib_cm_modify_rx_qp(dev, cm_id, p->qp, psn);</font>
<br><font size=2 face="Courier New">+ if (ret)</font>
<br><font size=2 face="Courier New">+
goto err_modify;</font>
<br><font size=2 face="Courier New">+</font>
<br><font size=2 face="Courier New">+ for (i
= 0; i < ipoib_recvq_size; ++i) {</font>
<br><font size=2 face="Courier New">+
if (!ipoib_cm_alloc_rx_skb(dev, i << 32 | qp_num,
</font>
<br><font size=2 face="Courier New">+
IPOIB_CM_RX_SG - 1,</font>
<br><font size=2 face="Courier New">+
p->rx_ring[i].mapping)) {</font>
<br><font size=2 face="Courier New">+
ipoib_warn(priv, "failed
to allocate receive buffer %d\n", i);</font>
<br><font size=2 face="Courier New">+
ipoib_cm_dev_cleanup(dev);</font>
<br><font size=2 face="Courier New">+
return -ENOMEM;</font>
<br><font size=2 face="Courier New">+
}</font>
<br><font size=2 face="Courier New">+</font>
<br><font size=2 face="Courier New">+
if (ipoib_cm_post_receive(dev, i << 32 | qp_num))
{</font>
<br><font size=2 face="Courier New">+
ipoib_warn(priv, "ipoib_ib_post_receive
failed for buf %d\n", i);</font>
<br><font size=2 face="Courier New">+
ipoib_cm_dev_cleanup(dev);</font>
<br><font size=2 face="Courier New">+
return -EIO;</font>
<br><font size=2 face="Courier New">+
}</font>
<br><font size=2 face="Courier New">+ }</font>
<br><font size=2 face="Courier New">+</font>
<br><font size=2 face="Courier New">+#else</font>
<br><font size=2 face="Courier New"> psn
= random32() & 0xffffff;</font>
<br><font size=2 face="Courier New"> ret
= ipoib_cm_modify_rx_qp(dev, cm_id, p->qp, psn);</font>
<br><font size=2 face="Courier New"> if
(ret)</font>
<br><font size=2 face="Courier New">
goto err_modify;</font>
<br><font size=2 face="Courier New">+#endif</font>
<br><font size=2 face="Courier New"> </font>
<br><font size=2 face="Courier New"> ret
= ipoib_cm_send_rep(dev, cm_id, p->qp, &event->param.req_rcvd,
psn);</font>
<br><font size=2 face="Courier New"> if
(ret) {</font>
<br><font size=2 face="Courier New">@@ -255,11 +376,28 @@ static int ipoib_cm_req_handler(struct
i</font>
<br><font size=2 face="Courier New">
goto err_rep;</font>
<br><font size=2 face="Courier New"> }</font>
<br><font size=2 face="Courier New"> </font>
<br><font size=2 face="Courier New">+ /*
This is missing in Michael's code -Do we need this */</font>
<br><font size=2 face="Courier New">+ qp_attr.qp_state
= IB_QPS_RTS;</font>
<br><font size=2 face="Courier New">+</font>
<br><font size=2 face="Courier New">+ ret =
ib_cm_init_qp_attr(cm_id, &qp_attr, &qp_attr_mask);</font>
<br><font size=2 face="Courier New">+ if (ret)
{</font>
<br><font size=2 face="Courier New">+
ipoib_warn(priv, "failed to init QP attr for RTS:
%d\n", ret);</font>
<br><font size=2 face="Courier New">+
return ret;</font>
<br><font size=2 face="Courier New">+ }</font>
<br><font size=2 face="Courier New">+ ret =
ib_modify_qp(p->qp, &qp_attr, qp_attr_mask);</font>
<br><font size=2 face="Courier New">+ if (ret)
{</font>
<br><font size=2 face="Courier New">+
ipoib_warn(priv, "failed to modify QP to RTS:
%d\n", ret);</font>
<br><font size=2 face="Courier New">+
return ret;</font>
<br><font size=2 face="Courier New">+ }</font>
<br><font size=2 face="Courier New">+ /***
missing end ***/</font>
<br><font size=2 face="Courier New">+</font>
<br><font size=2 face="Courier New">+#ifndef IPOIB_CM_NOSRQ</font>
<br><font size=2 face="Courier New"> cm_id->context
= p;</font>
<br><font size=2 face="Courier New"> p->jiffies
= jiffies;</font>
<br><font size=2 face="Courier New"> spin_lock_irqsave(&priv->lock,
flags);</font>
<br><font size=2 face="Courier New"> list_add(&p->list,
&priv->cm.passive_ids);</font>
<br><font size=2 face="Courier New"> spin_unlock_irqrestore(&priv->lock,
flags);</font>
<br><font size=2 face="Courier New">+#endif</font>
<br><font size=2 face="Courier New"> queue_delayed_work(ipoib_workqueue,</font>
<br><font size=2 face="Courier New">
&priv->cm.stale_task, IPOIB_CM_RX_DELAY);</font>
<br><font size=2 face="Courier New"> return
0;</font>
<br><font size=2 face="Courier New">@@ -344,7 +482,14 @@ static void skb_put_frags(struct
sk_buff</font>
<br><font size=2 face="Courier New"> void ipoib_cm_handle_rx_wc(struct
net_device *dev, struct ib_wc *wc)</font>
<br><font size=2 face="Courier New"> {</font>
<br><font size=2 face="Courier New"> struct
ipoib_dev_priv *priv = netdev_priv(dev);</font>
<br><font size=2 face="Courier New">+#ifdef IPOIB_CM_NOSRQ</font>
<br><font size=2 face="Courier New">+ struct
ipoib_cm_rx *rx_ptr;</font>
<br><font size=2 face="Courier New">+ u32 qp_num
= (wc->wr_id & ~IPOIB_CM_OP_NOSRQ) & 0xffffffff;</font>
<br><font size=2 face="Courier New">+ u64 wr_id
= wc->wr_id >> 32;</font>
<br><font size=2 face="Courier New">+ int found
= 0;</font>
<br><font size=2 face="Courier New">+#else</font>
<br><font size=2 face="Courier New"> unsigned
int wr_id = wc->wr_id & ~IPOIB_CM_OP_SRQ;</font>
<br><font size=2 face="Courier New">+#endif</font>
<br><font size=2 face="Courier New"> struct
sk_buff *skb, *newskb;</font>
<br><font size=2 face="Courier New"> struct
ipoib_cm_rx *p;</font>
<br><font size=2 face="Courier New"> unsigned
long flags;</font>
<br><font size=2 face="Courier New">@@ -360,7 +505,23 @@ void ipoib_cm_handle_rx_wc(struct
net_de</font>
<br><font size=2 face="Courier New">
return;</font>
<br><font size=2 face="Courier New"> }</font>
<br><font size=2 face="Courier New"> </font>
<br><font size=2 face="Courier New">+#ifdef IPOIB_CM_NOSRQ</font>
<br><font size=2 face="Courier New">+ spin_lock_irqsave(&priv->lock,
flags);</font>
<br><font size=2 face="Courier New">+ list_for_each_entry(rx_ptr,
&priv->cm.passive_ids, list)</font>
<br><font size=2 face="Courier New">+
if(qp_num == rx_ptr->qp->qp_num) {</font>
<br><font size=2 face="Courier New">+
found
= 1;</font>
<br><font size=2 face="Courier New">+
break;</font>
<br><font size=2 face="Courier New">+
}</font>
<br><font size=2 face="Courier New">+ spin_unlock_irqrestore(&priv->lock,
flags);</font>
<br><font size=2 face="Courier New">+ </font>
<br><font size=2 face="Courier New">+ if
(!found)</font>
<br><font size=2 face="Courier New">+
printk(KERN_WARNING "qp not on
passive_ids list!!\n");</font>
<br><font size=2 face="Courier New">+</font>
<br><font size=2 face="Courier New">+ /* Use
the rx_ptr to get the requisite entry */</font>
<br><font size=2 face="Courier New">+ skb
= rx_ptr->rx_ring[wr_id].skb;</font>
<br><font size=2 face="Courier New">+#else</font>
<br><font size=2 face="Courier New"> skb
= priv->cm.srq_ring[wr_id].skb;</font>
<br><font size=2 face="Courier New">+#endif</font>
<br><font size=2 face="Courier New"> </font>
<br><font size=2 face="Courier New"> if
(unlikely(wc->status != IB_WC_SUCCESS)) {</font>
<br><font size=2 face="Courier New">
ipoib_dbg(priv, "cm recv error
"</font>
<br><font size=2 face="Courier New">@@ -371,7 +532,12 @@ void ipoib_cm_handle_rx_wc(struct
net_de</font>
<br><font size=2 face="Courier New"> }</font>
<br><font size=2 face="Courier New"> </font>
<br><font size=2 face="Courier New"> if
(!likely(wr_id & IPOIB_CM_RX_UPDATE_MASK)) {</font>
<br><font size=2 face="Courier New">+#ifdef IPOIB_CM_NOSRQ</font>
<br><font size=2 face="Courier New">+
/* Temporary hack till ehca fixes wc->qp = NULL
*/</font>
<br><font size=2 face="Courier New">+
p = rx_ptr;</font>
<br><font size=2 face="Courier New">+#else</font>
<br><font size=2 face="Courier New">
p = wc->qp->qp_context;</font>
<br><font size=2 face="Courier New">+#endif</font>
<br><font size=2 face="Courier New">
if (time_after_eq(jiffies, p->jiffies
+ IPOIB_CM_RX_UPDATE_TIME)) {</font>
<br><font size=2 face="Courier New">
spin_lock_irqsave(&priv->lock,
flags);</font>
<br><font size=2 face="Courier New">
p->jiffies
= jiffies;</font>
<br><font size=2 face="Courier New">@@ -388,7 +554,12 @@ void ipoib_cm_handle_rx_wc(struct
net_de</font>
<br><font size=2 face="Courier New"> frags
= PAGE_ALIGN(wc->byte_len - min(wc->byte_len,</font>
<br><font size=2 face="Courier New">
(unsigned)IPOIB_CM_HEAD_SIZE)) / PAGE_SIZE;</font>
<br><font size=2 face="Courier New"> </font>
<br><font size=2 face="Courier New">+#ifdef IPOIB_CM_NOSRQ</font>
<br><font size=2 face="Courier New">+ newskb
= ipoib_cm_alloc_rx_skb(dev, wr_id << 32 | qp_num, frags,</font>
<br><font size=2 face="Courier New">+
mapping);</font>
<br><font size=2 face="Courier New">+#else</font>
<br><font size=2 face="Courier New"> newskb
= ipoib_cm_alloc_rx_skb(dev, wr_id, frags, mapping);</font>
<br><font size=2 face="Courier New">+#endif</font>
<br><font size=2 face="Courier New"> if
(unlikely(!newskb)) {</font>
<br><font size=2 face="Courier New">
/*</font>
<br><font size=2 face="Courier New">
* If we can't allocate a new RX buffer,
dump</font>
<br><font size=2 face="Courier New">@@ -399,8 +570,13 @@ void ipoib_cm_handle_rx_wc(struct
net_de</font>
<br><font size=2 face="Courier New">
goto repost;</font>
<br><font size=2 face="Courier New"> }</font>
<br><font size=2 face="Courier New"> </font>
<br><font size=2 face="Courier New">+#ifdef IPOIB_CM_NOSRQ</font>
<br><font size=2 face="Courier New">+ ipoib_cm_dma_unmap_rx(priv,
frags, rx_ptr->rx_ring[wr_id].mapping);</font>
<br><font size=2 face="Courier New">+ memcpy(rx_ptr->rx_ring[wr_id].mapping,
mapping, (frags + 1) * sizeof *mapping);</font>
<br><font size=2 face="Courier New">+#else</font>
<br><font size=2 face="Courier New"> ipoib_cm_dma_unmap_rx(priv,
frags, priv->cm.srq_ring[wr_id].mapping);</font>
<br><font size=2 face="Courier New"> memcpy(priv->cm.srq_ring[wr_id].mapping,
mapping, (frags + 1) * sizeof *mapping);</font>
<br><font size=2 face="Courier New">+#endif</font>
<br><font size=2 face="Courier New"> </font>
<br><font size=2 face="Courier New"> ipoib_dbg_data(priv,
"received %d bytes, SLID 0x%04x\n",</font>
<br><font size=2 face="Courier New">
wc->byte_len,
wc->slid);</font>
<br><font size=2 face="Courier New">@@ -421,7 +597,11 @@ void ipoib_cm_handle_rx_wc(struct
net_de</font>
<br><font size=2 face="Courier New"> netif_rx_ni(skb);</font>
<br><font size=2 face="Courier New"> </font>
<br><font size=2 face="Courier New"> repost:</font>
<br><font size=2 face="Courier New">+#ifdef IPOIB_CM_NOSRQ</font>
<br><font size=2 face="Courier New">+ if (unlikely(ipoib_cm_post_receive(dev,
wr_id << 32 | qp_num)))</font>
<br><font size=2 face="Courier New">+#else</font>
<br><font size=2 face="Courier New"> if
(unlikely(ipoib_cm_post_receive(dev, wr_id)))</font>
<br><font size=2 face="Courier New">+#endif</font>
<br><font size=2 face="Courier New">
ipoib_warn(priv, "ipoib_cm_post_receive
failed "</font>
<br><font size=2 face="Courier New">
"for buf %d\n", wr_id);</font>
<br><font size=2 face="Courier New"> }</font>
<br><font size=2 face="Courier New">@@ -613,6 +793,9 @@ void ipoib_cm_dev_stop(struct
net_device</font>
<br><font size=2 face="Courier New"> struct
ipoib_dev_priv *priv = netdev_priv(dev);</font>
<br><font size=2 face="Courier New"> struct
ipoib_cm_rx *p;</font>
<br><font size=2 face="Courier New"> unsigned
long flags;</font>
<br><font size=2 face="Courier New">+#ifdef IPOIB_CM_NOSRQ</font>
<br><font size=2 face="Courier New">+ int
i;</font>
<br><font size=2 face="Courier New">+#endif</font>
<br><font size=2 face="Courier New"> </font>
<br><font size=2 face="Courier New"> if
(!IPOIB_CM_SUPPORTED(dev->dev_addr))</font>
<br><font size=2 face="Courier New">
return;</font>
<br><font size=2 face="Courier New">@@ -621,6 +804,16 @@ void ipoib_cm_dev_stop(struct
net_device</font>
<br><font size=2 face="Courier New"> spin_lock_irqsave(&priv->lock,
flags);</font>
<br><font size=2 face="Courier New"> while
(!list_empty(&priv->cm.passive_ids)) {</font>
<br><font size=2 face="Courier New">
p = list_entry(priv->cm.passive_ids.next,
typeof(*p), list);</font>
<br><font size=2 face="Courier New">+#ifdef IPOIB_CM_NOSRQ</font>
<br><font size=2 face="Courier New">+
for(i = 0; i < ipoib_recvq_size; ++i)</font>
<br><font size=2 face="Courier New">+
if(p->rx_ring[i].skb)
{</font>
<br><font size=2 face="Courier New">+
ipoib_cm_dma_unmap_rx(priv, IPOIB_CM_RX_SG
- 1,</font>
<br><font size=2 face="Courier New">+
p->rx_ring[i].mapping);</font>
<br><font size=2 face="Courier New">+
dev_kfree_skb_any(p->rx_ring[i].skb);</font>
<br><font size=2 face="Courier New">+
p->rx_ring[i].skb
= NULL;</font>
<br><font size=2 face="Courier New">+
}</font>
<br><font size=2 face="Courier New">+
kfree(p->rx_ring); </font>
<br><font size=2 face="Courier New">+#endif</font>
<br><font size=2 face="Courier New">
list_del_init(&p->list);</font>
<br><font size=2 face="Courier New">
spin_unlock_irqrestore(&priv->lock,
flags);</font>
<br><font size=2 face="Courier New">
ib_destroy_cm_id(p->id);</font>
<br><font size=2 face="Courier New">@@ -707,7 +900,11 @@ static struct
ib_qp *ipoib_cm_create_tx_</font>
<br><font size=2 face="Courier New"> struct
ipoib_dev_priv *priv = netdev_priv(dev);</font>
<br><font size=2 face="Courier New"> struct
ib_qp_init_attr attr = {};</font>
<br><font size=2 face="Courier New"> attr.recv_cq
= priv->cq;</font>
<br><font size=2 face="Courier New">+#ifdef IPOIB_CM_NOSRQ</font>
<br><font size=2 face="Courier New">+ attr.srq
= NULL;</font>
<br><font size=2 face="Courier New">+#else</font>
<br><font size=2 face="Courier New"> attr.srq
= priv->cm.srq;</font>
<br><font size=2 face="Courier New">+#endif</font>
<br><font size=2 face="Courier New"> attr.cap.max_send_wr
= ipoib_sendq_size;</font>
<br><font size=2 face="Courier New"> attr.cap.max_send_sge
= 1;</font>
<br><font size=2 face="Courier New"> attr.sq_sig_type
= IB_SIGNAL_ALL_WR;</font>
<br><font size=2 face="Courier New">@@ -749,7 +946,11 @@ static int ipoib_cm_send_req(struct
net_</font>
<br><font size=2 face="Courier New"> req.retry_count
= 0; /* RFC draft
warns against retries */</font>
<br><font size=2 face="Courier New"> req.rnr_retry_count
= 0; /* RFC draft
warns against retries */</font>
<br><font size=2 face="Courier New"> req.max_cm_retries
= 15;</font>
<br><font size=2 face="Courier New">+#ifdef IPOIB_CM_NOSRQ</font>
<br><font size=2 face="Courier New">+ req.srq
= 0;</font>
<br><font size=2 face="Courier New">+#else</font>
<br><font size=2 face="Courier New"> req.srq
= 1;</font>
<br><font size=2 face="Courier New">+#endif</font>
<br><font size=2 face="Courier New"> return
ib_send_cm_req(id, &req);</font>
<br><font size=2 face="Courier New"> }</font>
<br><font size=2 face="Courier New"> </font>
<br><font size=2 face="Courier New">@@ -1089,6 +1290,9 @@ static void ipoib_cm_stale_task(struct
w</font>
<br><font size=2 face="Courier New">
cm.stale_task.work);</font>
<br><font size=2 face="Courier New"> struct
ipoib_cm_rx *p;</font>
<br><font size=2 face="Courier New"> unsigned
long flags;</font>
<br><font size=2 face="Courier New">+#ifdef IPOIB_CM_NOSRQ</font>
<br><font size=2 face="Courier New">+ int
i;</font>
<br><font size=2 face="Courier New">+#endif</font>
<br><font size=2 face="Courier New"> </font>
<br><font size=2 face="Courier New"> spin_lock_irqsave(&priv->lock,
flags);</font>
<br><font size=2 face="Courier New"> while
(!list_empty(&priv->cm.passive_ids)) {</font>
<br><font size=2 face="Courier New">@@ -1097,6 +1301,17 @@ static void
ipoib_cm_stale_task(struct w</font>
<br><font size=2 face="Courier New">
p = list_entry(priv->cm.passive_ids.prev,
typeof(*p), list);</font>
<br><font size=2 face="Courier New">
if (time_after_eq(jiffies, p->jiffies
+ IPOIB_CM_RX_TIMEOUT))</font>
<br><font size=2 face="Courier New">
break;</font>
<br><font size=2 face="Courier New">+#ifdef IPOIB_CM_NOSRQ</font>
<br><font size=2 face="Courier New">+
for(i = 0; i < ipoib_recvq_size; ++i)</font>
<br><font size=2 face="Courier New">+
if(p->rx_ring[i].skb)
{</font>
<br><font size=2 face="Courier New">+
ipoib_cm_dma_unmap_rx(priv, IPOIB_CM_RX_SG
- 1,</font>
<br><font size=2 face="Courier New">+
p->rx_ring[i].mapping);</font>
<br><font size=2 face="Courier New">+
dev_kfree_skb_any(p->rx_ring[i].skb);</font>
<br><font size=2 face="Courier New">+
p->rx_ring[i].skb
= NULL;</font>
<br><font size=2 face="Courier New">+
}</font>
<br><font size=2 face="Courier New">+
/* Free the rx_ring */</font>
<br><font size=2 face="Courier New">+
kfree(p->rx_ring);</font>
<br><font size=2 face="Courier New">+#endif</font>
<br><font size=2 face="Courier New">
list_del_init(&p->list);</font>
<br><font size=2 face="Courier New">
spin_unlock_irqrestore(&priv->lock,
flags);</font>
<br><font size=2 face="Courier New">
ib_destroy_cm_id(p->id);</font>
<br><font size=2 face="Courier New">@@ -1154,12 +1369,14 @@ int ipoib_cm_add_mode_attr(struct
net_de</font>
<br><font size=2 face="Courier New"> int ipoib_cm_dev_init(struct
net_device *dev)</font>
<br><font size=2 face="Courier New"> {</font>
<br><font size=2 face="Courier New"> struct
ipoib_dev_priv *priv = netdev_priv(dev);</font>
<br><font size=2 face="Courier New">+#ifndef IPOIB_CM_NOSRQ</font>
<br><font size=2 face="Courier New"> struct
ib_srq_init_attr srq_init_attr = {</font>
<br><font size=2 face="Courier New">
.attr = {</font>
<br><font size=2 face="Courier New">
.max_wr
= ipoib_recvq_size,</font>
<br><font size=2 face="Courier New">
.max_sge
= IPOIB_CM_RX_SG</font>
<br><font size=2 face="Courier New">
}</font>
<br><font size=2 face="Courier New"> };</font>
<br><font size=2 face="Courier New">+#endif</font>
<br><font size=2 face="Courier New"> int
ret, i;</font>
<br><font size=2 face="Courier New"> </font>
<br><font size=2 face="Courier New"> INIT_LIST_HEAD(&priv->cm.passive_ids);</font>
<br><font size=2 face="Courier New">@@ -1172,6 +1389,7 @@ int ipoib_cm_dev_init(struct
net_device </font>
<br><font size=2 face="Courier New"> </font>
<br><font size=2 face="Courier New"> skb_queue_head_init(&priv->cm.skb_queue);</font>
<br><font size=2 face="Courier New"> </font>
<br><font size=2 face="Courier New">+#ifndef IPOIB_CM_NOSRQ</font>
<br><font size=2 face="Courier New"> priv->cm.srq
= ib_create_srq(priv->pd, &srq_init_attr);</font>
<br><font size=2 face="Courier New"> if
(IS_ERR(priv->cm.srq)) {</font>
<br><font size=2 face="Courier New">
ret = PTR_ERR(priv->cm.srq);</font>
<br><font size=2 face="Courier New">@@ -1187,6 +1405,7 @@ int ipoib_cm_dev_init(struct
net_device </font>
<br><font size=2 face="Courier New">
ipoib_cm_dev_cleanup(dev);</font>
<br><font size=2 face="Courier New">
return -ENOMEM;</font>
<br><font size=2 face="Courier New"> }</font>
<br><font size=2 face="Courier New">+#endif</font>
<br><font size=2 face="Courier New"> </font>
<br><font size=2 face="Courier New"> for
(i = 0; i < IPOIB_CM_RX_SG; ++i)</font>
<br><font size=2 face="Courier New">
priv->cm.rx_sge[i].lkey
= priv->mr->lkey;</font>
<br><font size=2 face="Courier New">@@ -1198,6 +1417,10 @@ int ipoib_cm_dev_init(struct
net_device </font>
<br><font size=2 face="Courier New"> priv->cm.rx_wr.sg_list
= priv->cm.rx_sge;</font>
<br><font size=2 face="Courier New"> priv->cm.rx_wr.num_sge
= IPOIB_CM_RX_SG;</font>
<br><font size=2 face="Courier New"> </font>
<br><font size=2 face="Courier New">+#ifndef IPOIB_CM_NOSRQ</font>
<br><font size=2 face="Courier New">+ /* In
the case of IPOIB_CM_NOSRQ we do the rest of the init in</font>
<br><font size=2 face="Courier New">+
ipoib_cm_req_handler() */</font>
<br><font size=2 face="Courier New">+</font>
<br><font size=2 face="Courier New"> for
(i = 0; i < ipoib_recvq_size; ++i) {</font>
<br><font size=2 face="Courier New">
if (!ipoib_cm_alloc_rx_skb(dev, i, IPOIB_CM_RX_SG
- 1,</font>
<br><font size=2 face="Courier New">
priv->cm.srq_ring[i].mapping)) {</font>
<br><font size=2 face="Courier New">@@ -1211,6 +1434,7 @@ int ipoib_cm_dev_init(struct
net_device </font>
<br><font size=2 face="Courier New">
return
-EIO;</font>
<br><font size=2 face="Courier New">
}</font>
<br><font size=2 face="Courier New"> }</font>
<br><font size=2 face="Courier New">+#endif</font>
<br><font size=2 face="Courier New"> </font>
<br><font size=2 face="Courier New"> priv->dev->dev_addr[0]
= IPOIB_FLAGS_RC;</font>
<br><font size=2 face="Courier New"> return
0;</font>
<br><font size=2 face="Courier New">@@ -1221,10 +1445,21 @@ void ipoib_cm_dev_cleanup(struct
net_dev</font>
<br><font size=2 face="Courier New"> struct
ipoib_dev_priv *priv = netdev_priv(dev);</font>
<br><font size=2 face="Courier New"> int
i, ret;</font>
<br><font size=2 face="Courier New"> </font>
<br><font size=2 face="Courier New">+ ipoib_dbg(priv,
"Cleanup ipoib connected mode.\n");</font>
<br><font size=2 face="Courier New">+</font>
<br><font size=2 face="Courier New">+#ifdef IPOIB_CM_NOSRQ</font>
<br><font size=2 face="Courier New">+ /* We
need to destroy all the qps associated with the ipoib_cm_rx</font>
<br><font size=2 face="Courier New">+ linked
list hanging off the ipoib_cm_dev_priv. We also need to</font>
<br><font size=2 face="Courier New">+ kfree
the associated skb and also the ipoib_cm_rx structures</font>
<br><font size=2 face="Courier New">+ themselves
*/</font>
<br><font size=2 face="Courier New">+ /* We
actually do this in ipoib_cm_dev_stop(). Since srq is</font>
<br><font size=2 face="Courier New">+ common
to all qps it is done here for SRQ. For us the</font>
<br><font size=2 face="Courier New">+ right
place is to do it in ipoib_cm_dev_stop() */</font>
<br><font size=2 face="Courier New">+</font>
<br><font size=2 face="Courier New">+#else</font>
<br><font size=2 face="Courier New"> if
(!priv->cm.srq)</font>
<br><font size=2 face="Courier New">
return;</font>
<br><font size=2 face="Courier New"> </font>
<br><font size=2 face="Courier New">- ipoib_dbg(priv,
"Cleanup ipoib connected mode.\n");</font>
<br><font size=2 face="Courier New"> </font>
<br><font size=2 face="Courier New"> ret
= ib_destroy_srq(priv->cm.srq);</font>
<br><font size=2 face="Courier New"> if
(ret)</font>
<br><font size=2 face="Courier New">@@ -1242,4 +1477,5 @@ void ipoib_cm_dev_cleanup(struct
net_dev</font>
<br><font size=2 face="Courier New">
}</font>
<br><font size=2 face="Courier New"> kfree(priv->cm.srq_ring);</font>
<br><font size=2 face="Courier New"> priv->cm.srq_ring
= NULL;</font>
<br><font size=2 face="Courier New">+#endif</font>
<br><font size=2 face="Courier New"> }</font>
<br><font size=2 face="Courier New">--- linux-2.6.21-rc1-mst/drivers/infiniband/ulp/ipoib/ipoib_ib.c
2007-03-08 17:09:48.000000000 -0800</font>
<br><font size=2 face="Courier New">+++ linux-2.6.21-rc1/drivers/infiniband/ulp/ipoib/ipoib_ib.c
2007-03-08 17:35:07.000000000 -0800</font>
<br><font size=2 face="Courier New">@@ -282,12 +282,21 @@ static void ipoib_ib_handle_tx_wc(struct</font>
<br><font size=2 face="Courier New"> </font>
<br><font size=2 face="Courier New"> static void ipoib_ib_handle_wc(struct
net_device *dev, struct ib_wc *wc)</font>
<br><font size=2 face="Courier New"> {</font>
<br><font size=2 face="Courier New">+#ifdef IPOIB_CM_NOSRQ</font>
<br><font size=2 face="Courier New">+ if
(wc->wr_id & IPOIB_CM_OP_NOSRQ)</font>
<br><font size=2 face="Courier New">+
ipoib_cm_handle_rx_wc(dev, wc);</font>
<br><font size=2 face="Courier New">+ else
if (wc->wr_id & IPOIB_OP_RECV)</font>
<br><font size=2 face="Courier New">+
ipoib_ib_handle_rx_wc(dev, wc);</font>
<br><font size=2 face="Courier New">+ else</font>
<br><font size=2 face="Courier New">+
ipoib_ib_handle_tx_wc(dev, wc);</font>
<br><font size=2 face="Courier New">+#else</font>
<br><font size=2 face="Courier New"> if
(wc->wr_id & IPOIB_CM_OP_SRQ)</font>
<br><font size=2 face="Courier New">
ipoib_cm_handle_rx_wc(dev, wc);</font>
<br><font size=2 face="Courier New"> else
if (wc->wr_id & IPOIB_OP_RECV)</font>
<br><font size=2 face="Courier New">
ipoib_ib_handle_rx_wc(dev, wc);</font>
<br><font size=2 face="Courier New"> else</font>
<br><font size=2 face="Courier New">
ipoib_ib_handle_tx_wc(dev, wc);</font>
<br><font size=2 face="Courier New">+#endif</font>
<br><font size=2 face="Courier New"> }</font>
<br><font size=2 face="Courier New"> </font>
<br><font size=2 face="Courier New"> void ipoib_ib_completion(struct
ib_cq *cq, void *dev_ptr)</font>
<br>
<br>
<br>
<br>
<br>
<br><font size=2 face="sans-serif">Pradeep</font>
<br><font size=2 face="sans-serif">pradeep@us.ibm.com</font>