RDS/IB: Move tx/rx ring init and refill to later
Andy Grover [Fri, 17 Jul 2009 13:13:29 +0000 (13:13 +0000)]
Since RDS 3.0 and 3.1 have different packet formats,
we need to wait until after protocol negotiation
is complete to layout the rx buffers.

Signed-off-by: Andy Grover <andy.grover@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

net/rds/ib_cm.c

index f621086..0ad749c 100644 (file)
@@ -116,6 +116,16 @@ void rds_ib_cm_connect_complete(struct rds_connection *conn, struct rdma_cm_even
                        RDS_PROTOCOL_MINOR(conn->c_version),
                        ic->i_flowctl ? ", flow control" : "");
 
+       /*
+        * Init rings and fill recv. this needs to wait until protocol negotiation
+        * is complete, since ring layout is different from 3.0 to 3.1.
+        */
+       rds_ib_send_init_ring(ic);
+       rds_ib_recv_init_ring(ic);
+       /* Post receive buffers - as a side effect, this will update
+        * the posted credit count. */
+       rds_ib_recv_refill(conn, GFP_KERNEL, GFP_HIGHUSER, 1);
+
        /* Tune RNR behavior */
        rds_ib_tune_rnr(ic, &qp_attr);
 
@@ -324,7 +334,7 @@ static int rds_ib_setup_qp(struct rds_connection *conn)
                rdsdebug("send allocation failed\n");
                goto out;
        }
-       rds_ib_send_init_ring(ic);
+       memset(ic->i_sends, 0, ic->i_send_ring.w_nr * sizeof(struct rds_ib_send_work));
 
        ic->i_recvs = vmalloc(ic->i_recv_ring.w_nr * sizeof(struct rds_ib_recv_work));
        if (ic->i_recvs == NULL) {
@@ -332,14 +342,10 @@ static int rds_ib_setup_qp(struct rds_connection *conn)
                rdsdebug("recv allocation failed\n");
                goto out;
        }
+       memset(ic->i_recvs, 0, ic->i_recv_ring.w_nr * sizeof(struct rds_ib_recv_work));
 
-       rds_ib_recv_init_ring(ic);
        rds_ib_recv_init_ack(ic);
 
-       /* Post receive buffers - as a side effect, this will update
-        * the posted credit count. */
-       rds_ib_recv_refill(conn, GFP_KERNEL, GFP_HIGHUSER, 1);
-
        rdsdebug("conn %p pd %p mr %p cq %p %p\n", conn, ic->i_pd, ic->i_mr,
                 ic->i_send_cq, ic->i_recv_cq);