From: Andy Grover <andy.gro...@oracle.com>
Date: Thu, 13 Jan 2011 11:40:31 -0800

Original commit from 2011 updated to include a change by
Yuval Shaia <yuval.sh...@oracle.com>
that adds a new statistic counter "send_stuck_rm"
to capture the messages looping exessively
in the send path.

Signed-off-by: Gerd Rausch <gerd.rau...@oracle.com>
---
 net/rds/rds.h   |  2 +-
 net/rds/send.c  | 12 ++++++++++++
 net/rds/stats.c |  1 +
 3 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/net/rds/rds.h b/net/rds/rds.h
index f0066d168499..ad605fd61655 100644
--- a/net/rds/rds.h
+++ b/net/rds/rds.h
@@ -717,7 +717,7 @@ struct rds_statistics {
        uint64_t        s_cong_send_blocked;
        uint64_t        s_recv_bytes_added_to_socket;
        uint64_t        s_recv_bytes_removed_from_socket;
-
+       uint64_t        s_send_stuck_rm;
 };
 
 /* af_rds.c */
diff --git a/net/rds/send.c b/net/rds/send.c
index 031b1e97a466..9ce552abf9e9 100644
--- a/net/rds/send.c
+++ b/net/rds/send.c
@@ -145,6 +145,7 @@ int rds_send_xmit(struct rds_conn_path *cp)
        LIST_HEAD(to_be_dropped);
        int batch_count;
        unsigned long send_gen = 0;
+       int same_rm = 0;
 
 restart:
        batch_count = 0;
@@ -200,6 +201,17 @@ int rds_send_xmit(struct rds_conn_path *cp)
 
                rm = cp->cp_xmit_rm;
 
+               if (!rm) {
+                       same_rm = 0;
+               } else {
+                       same_rm++;
+                       if (same_rm >= 4096) {
+                               rds_stats_inc(s_send_stuck_rm);
+                               ret = -EAGAIN;
+                               break;
+                       }
+               }
+
                /*
                 * If between sending messages, we can send a pending congestion
                 * map update.
diff --git a/net/rds/stats.c b/net/rds/stats.c
index 6bbab4d74c4f..9e87da43c004 100644
--- a/net/rds/stats.c
+++ b/net/rds/stats.c
@@ -78,6 +78,7 @@ static const char *const rds_stat_names[] = {
        "cong_send_blocked",
        "recv_bytes_added_to_sock",
        "recv_bytes_freed_fromsock",
+       "send_stuck_rm",
 };
 
 void rds_stats_info_copy(struct rds_info_iterator *iter,
-- 
2.22.0

Reply via email to