From: Chris Mason Date: Fri, 3 Feb 2012 16:07:54 +0000 (-0500) Subject: RDS: don't trust the LL_SEND_FULL bit X-Git-Tag: v4.1.12-92~319^2^2~2^2~51 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=aa09605ce7ef5d52d6d787e27bf7a5a9c85c5241;p=users%2Fjedix%2Flinux-maple.git RDS: don't trust the LL_SEND_FULL bit We are seeing connections stuck with the LL_SEND_FULL bit getting set and never cleared. This changes RDS to stop trusting the LL_SEND_FULL bit and kick krdsd after any time we see -ENOMEM from the ring allocation code. Signed-off-by: Chris Mason Signed-off-by: Bang Nguyen --- diff --git a/net/rds/send.c b/net/rds/send.c index 16e26151f3e07..0cbddbc942f51 100644 --- a/net/rds/send.c +++ b/net/rds/send.c @@ -1096,8 +1096,10 @@ int rds_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, */ rds_stats_inc(s_send_queued); - if (!test_bit(RDS_LL_SEND_FULL, &conn->c_flags)) - rds_send_xmit(conn); + ret = rds_send_xmit(conn); + if (ret == -ENOMEM || ret == -EAGAIN) + queue_delayed_work(rds_wq, &conn->c_send_w, 1); + rds_message_put(rm); return payload_len; @@ -1153,8 +1155,9 @@ rds_send_pong(struct rds_connection *conn, __be16 dport) rds_stats_inc(s_send_queued); rds_stats_inc(s_send_pong); - if (!test_bit(RDS_LL_SEND_FULL, &conn->c_flags)) - rds_send_xmit(conn); + ret = rds_send_xmit(conn); + if (ret == -ENOMEM || ret == -EAGAIN) + queue_delayed_work(rds_wq, &conn->c_send_w, 1); rds_message_put(rm); return 0; diff --git a/net/rds/threads.c b/net/rds/threads.c index 21aeecca48316..84a06c6c1964d 100644 --- a/net/rds/threads.c +++ b/net/rds/threads.c @@ -169,7 +169,9 @@ void rds_send_worker(struct work_struct *work) int ret; if (rds_conn_state(conn) == RDS_CONN_UP) { + clear_bit(RDS_LL_SEND_FULL, &conn->c_flags); ret = rds_send_xmit(conn); + cond_resched(); rdsdebug("conn %p ret %d\n", conn, ret); switch (ret) { case -EAGAIN: