Until now, in tipc_link_rcv() the sockets are woken only when we were
able to release a frame from the link's transmit queue.
However link_prepare_wakeup(), wakes only as many users as permitted
by the current link window and the rest of the users are woken the
next time a frame is released. In case of the released frame being
the last frame in the transmit queue i.e the queue becomes empty, we
miss to wake the users and they experience permanent congestion.

In this commit, we wakeup the users if link's transmit queue is empty.

Signed-off-by: Parthasarathy Bhuvaragan <parthasarathy.bhuvara...@ericsson.com>
---
 net/tipc/link.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/net/tipc/link.c b/net/tipc/link.c
index b36e16cdc945..28f9376ce6d7 100644
--- a/net/tipc/link.c
+++ b/net/tipc/link.c
@@ -1251,6 +1251,10 @@ int tipc_link_rcv(struct tipc_link *l, struct sk_buff 
*skb,
                                link_prepare_wakeup(l);
                }
 
+               if (skb_queue_empty(&l->transmq) &&
+                   !skb_queue_empty(&l->wakeupq))
+                       link_prepare_wakeup(l);
+
                /* Defer delivery if sequence gap */
                if (unlikely(seqno != rcv_nxt)) {
                        __tipc_skb_queue_sorted(defq, seqno, skb);
-- 
2.1.4


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most 
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
tipc-discussion mailing list
tipc-discussion@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tipc-discussion

Reply via email to