RDS/IW+IB: Allow max credit advertise window.
authorSteve Wise <swise@opengridcomputing.com>
Thu, 9 Apr 2009 14:09:39 +0000 (14:09 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 10 Apr 2009 00:21:17 +0000 (17:21 -0700)
Fix hack that restricts the credit advertisement to 127.

Signed-off-by: Steve Wise <swise@opengridcomputing.com>
Signed-off-by: Andy Grover <andy.grover@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/rds/ib.h
net/rds/ib_recv.c
net/rds/ib_send.c
net/rds/iw.h
net/rds/iw_recv.c
net/rds/iw_send.c
net/rds/rds.h

index 069206cae733c3a9a88b5efda1b6478a92355b85..455ae73047fe738858eda2166456db0a46da48ac 100644 (file)
@@ -333,7 +333,7 @@ int rds_ib_xmit_rdma(struct rds_connection *conn, struct rds_rdma_op *op);
 void rds_ib_send_add_credits(struct rds_connection *conn, unsigned int credits);
 void rds_ib_advertise_credits(struct rds_connection *conn, unsigned int posted);
 int rds_ib_send_grab_credits(struct rds_ib_connection *ic, u32 wanted,
-                            u32 *adv_credits, int need_posted);
+                            u32 *adv_credits, int need_posted, int max_posted);
 
 /* ib_stats.c */
 DECLARE_PER_CPU(struct rds_ib_statistics, rds_ib_stats);
index 36d931573ff4f4cb52aec684564e142bbea388e9..5709bad28329d2c6d0304e7e85b2728f19cc9e6f 100644 (file)
@@ -524,7 +524,7 @@ void rds_ib_attempt_ack(struct rds_ib_connection *ic)
        }
 
        /* Can we get a send credit? */
-       if (!rds_ib_send_grab_credits(ic, 1, &adv_credits, 0)) {
+       if (!rds_ib_send_grab_credits(ic, 1, &adv_credits, 0, RDS_MAX_ADV_CREDIT)) {
                rds_ib_stats_inc(s_ib_tx_throttle);
                clear_bit(IB_ACK_IN_FLIGHT, &ic->i_ack_flags);
                return;
index fa684b7fc748092346810b45fa6056242c78e094..23bf830db2d5a74987c507f2b8d39e20940eefda 100644 (file)
@@ -311,7 +311,7 @@ void rds_ib_send_cq_comp_handler(struct ib_cq *cq, void *context)
  * and using atomic_cmpxchg when updating the two counters.
  */
 int rds_ib_send_grab_credits(struct rds_ib_connection *ic,
-                            u32 wanted, u32 *adv_credits, int need_posted)
+                            u32 wanted, u32 *adv_credits, int need_posted, int max_posted)
 {
        unsigned int avail, posted, got = 0, advertise;
        long oldval, newval;
@@ -351,7 +351,7 @@ try_again:
         * available.
         */
        if (posted && (got || need_posted)) {
-               advertise = min_t(unsigned int, posted, RDS_MAX_ADV_CREDIT);
+               advertise = min_t(unsigned int, posted, max_posted);
                newval -= IB_SET_POST_CREDITS(advertise);
        }
 
@@ -498,7 +498,7 @@ int rds_ib_xmit(struct rds_connection *conn, struct rds_message *rm,
 
        credit_alloc = work_alloc;
        if (ic->i_flowctl) {
-               credit_alloc = rds_ib_send_grab_credits(ic, work_alloc, &posted, 0);
+               credit_alloc = rds_ib_send_grab_credits(ic, work_alloc, &posted, 0, RDS_MAX_ADV_CREDIT);
                adv_credits += posted;
                if (credit_alloc < work_alloc) {
                        rds_ib_ring_unalloc(&ic->i_send_ring, work_alloc - credit_alloc);
@@ -571,7 +571,7 @@ int rds_ib_xmit(struct rds_connection *conn, struct rds_message *rm,
                /*
                 * Update adv_credits since we reset the ACK_REQUIRED bit.
                 */
-               rds_ib_send_grab_credits(ic, 0, &posted, 1);
+               rds_ib_send_grab_credits(ic, 0, &posted, 1, RDS_MAX_ADV_CREDIT - adv_credits);
                adv_credits += posted;
                BUG_ON(adv_credits > 255);
        } else if (ic->i_rm != rm)
index b4fb27252895adb45a1cf635ee441741b392cc5d..0715dde323e77c88a56f50e591bb065a900efbca 100644 (file)
@@ -361,7 +361,7 @@ int rds_iw_xmit_rdma(struct rds_connection *conn, struct rds_rdma_op *op);
 void rds_iw_send_add_credits(struct rds_connection *conn, unsigned int credits);
 void rds_iw_advertise_credits(struct rds_connection *conn, unsigned int posted);
 int rds_iw_send_grab_credits(struct rds_iw_connection *ic, u32 wanted,
-                            u32 *adv_credits, int need_posted);
+                            u32 *adv_credits, int need_posted, int max_posted);
 
 /* ib_stats.c */
 DECLARE_PER_CPU(struct rds_iw_statistics, rds_iw_stats);
index fde470fa50d5457c72226d0336e00aeed8df534d..8683f5f66c4b2931583b84e1f40daeeecaf2e64b 100644 (file)
@@ -524,7 +524,7 @@ void rds_iw_attempt_ack(struct rds_iw_connection *ic)
        }
 
        /* Can we get a send credit? */
-       if (!rds_iw_send_grab_credits(ic, 1, &adv_credits, 0)) {
+       if (!rds_iw_send_grab_credits(ic, 1, &adv_credits, 0, RDS_MAX_ADV_CREDIT)) {
                rds_iw_stats_inc(s_iw_tx_throttle);
                clear_bit(IB_ACK_IN_FLIGHT, &ic->i_ack_flags);
                return;
index 626290bc7e97aa729fd4f7d77eb439248436fe37..44a6a0551f28951f8bb69fb2e224e308a7f99fc1 100644 (file)
@@ -347,7 +347,7 @@ void rds_iw_send_cq_comp_handler(struct ib_cq *cq, void *context)
  * and using atomic_cmpxchg when updating the two counters.
  */
 int rds_iw_send_grab_credits(struct rds_iw_connection *ic,
-                            u32 wanted, u32 *adv_credits, int need_posted)
+                            u32 wanted, u32 *adv_credits, int need_posted, int max_posted)
 {
        unsigned int avail, posted, got = 0, advertise;
        long oldval, newval;
@@ -387,7 +387,7 @@ try_again:
         * available.
         */
        if (posted && (got || need_posted)) {
-               advertise = min_t(unsigned int, posted, RDS_MAX_ADV_CREDIT);
+               advertise = min_t(unsigned int, posted, max_posted);
                newval -= IB_SET_POST_CREDITS(advertise);
        }
 
@@ -541,7 +541,7 @@ int rds_iw_xmit(struct rds_connection *conn, struct rds_message *rm,
 
        credit_alloc = work_alloc;
        if (ic->i_flowctl) {
-               credit_alloc = rds_iw_send_grab_credits(ic, work_alloc, &posted, 0);
+               credit_alloc = rds_iw_send_grab_credits(ic, work_alloc, &posted, 0, RDS_MAX_ADV_CREDIT);
                adv_credits += posted;
                if (credit_alloc < work_alloc) {
                        rds_iw_ring_unalloc(&ic->i_send_ring, work_alloc - credit_alloc);
@@ -614,7 +614,7 @@ int rds_iw_xmit(struct rds_connection *conn, struct rds_message *rm,
                /*
                 * Update adv_credits since we reset the ACK_REQUIRED bit.
                 */
-               rds_iw_send_grab_credits(ic, 0, &posted, 1);
+               rds_iw_send_grab_credits(ic, 0, &posted, 1, RDS_MAX_ADV_CREDIT - adv_credits);
                adv_credits += posted;
                BUG_ON(adv_credits > 255);
        } else if (ic->i_rm != rm)
index 619f0a30a4e566952642e27e1d2b49f5f546ad11..1f82ec0d2066a879a7ea030a071decde4903f25d 100644 (file)
@@ -132,7 +132,7 @@ struct rds_connection {
 #define RDS_FLAG_CONG_BITMAP   0x01
 #define RDS_FLAG_ACK_REQUIRED  0x02
 #define RDS_FLAG_RETRANSMITTED 0x04
-#define RDS_MAX_ADV_CREDIT     127
+#define RDS_MAX_ADV_CREDIT     255
 
 /*
  * Maximum space available for extension headers.