rds: check for excessive looping in rds_send_xmit

Original commit from 2011 updated to include a change by
Yuval Shaia <yuval.shaia@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.rausch@oracle.com>
Acked-by: Santosh Shilimkar <santosh.shilimkar@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Andy Grover 2011-01-13 11:40:31 -08:00 committed by David S. Miller
parent 55c70ca00c
commit 11740ef448
3 changed files with 14 additions and 1 deletions

View File

@ -717,7 +717,7 @@ struct rds_statistics {
uint64_t s_cong_send_blocked; uint64_t s_cong_send_blocked;
uint64_t s_recv_bytes_added_to_socket; uint64_t s_recv_bytes_added_to_socket;
uint64_t s_recv_bytes_removed_from_socket; uint64_t s_recv_bytes_removed_from_socket;
uint64_t s_send_stuck_rm;
}; };
/* af_rds.c */ /* af_rds.c */

View File

@ -145,6 +145,7 @@ int rds_send_xmit(struct rds_conn_path *cp)
LIST_HEAD(to_be_dropped); LIST_HEAD(to_be_dropped);
int batch_count; int batch_count;
unsigned long send_gen = 0; unsigned long send_gen = 0;
int same_rm = 0;
restart: restart:
batch_count = 0; batch_count = 0;
@ -200,6 +201,17 @@ int rds_send_xmit(struct rds_conn_path *cp)
rm = cp->cp_xmit_rm; 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 * If between sending messages, we can send a pending congestion
* map update. * map update.

View File

@ -78,6 +78,7 @@ static const char *const rds_stat_names[] = {
"cong_send_blocked", "cong_send_blocked",
"recv_bytes_added_to_sock", "recv_bytes_added_to_sock",
"recv_bytes_freed_fromsock", "recv_bytes_freed_fromsock",
"send_stuck_rm",
}; };
void rds_stats_info_copy(struct rds_info_iterator *iter, void rds_stats_info_copy(struct rds_info_iterator *iter,