tipc: ensure that link congestion and wakeup use same criteria
[cascardo/linux.git] / net / tipc / link.c
index 877d94f..2c6e1b9 100644 (file)
@@ -807,7 +807,7 @@ void link_prepare_wakeup(struct tipc_link *l)
 
        skb_queue_walk_safe(&l->wakeupq, skb, tmp) {
                imp = TIPC_SKB_CB(skb)->chain_imp;
-               lim = l->window + l->backlog[imp].limit;
+               lim = l->backlog[imp].limit;
                pnd[imp] += TIPC_SKB_CB(skb)->chain_sz;
                if ((pnd[imp] + l->backlog[imp].len) >= lim)
                        break;
@@ -873,9 +873,11 @@ int tipc_link_xmit(struct tipc_link *l, struct sk_buff_head *list,
        struct sk_buff *skb, *_skb, *bskb;
 
        /* Match msg importance against this and all higher backlog limits: */
-       for (i = imp; i <= TIPC_SYSTEM_IMPORTANCE; i++) {
-               if (unlikely(l->backlog[i].len >= l->backlog[i].limit))
-                       return link_schedule_user(l, list);
+       if (!skb_queue_empty(backlogq)) {
+               for (i = imp; i <= TIPC_SYSTEM_IMPORTANCE; i++) {
+                       if (unlikely(l->backlog[i].len >= l->backlog[i].limit))
+                               return link_schedule_user(l, list);
+               }
        }
        if (unlikely(msg_size(hdr) > mtu)) {
                skb_queue_purge(list);
@@ -1692,10 +1694,10 @@ void tipc_link_set_queue_limits(struct tipc_link *l, u32 win)
        int max_bulk = TIPC_MAX_PUBLICATIONS / (l->mtu / ITEM_SIZE);
 
        l->window = win;
-       l->backlog[TIPC_LOW_IMPORTANCE].limit      = win / 2;
-       l->backlog[TIPC_MEDIUM_IMPORTANCE].limit   = win;
-       l->backlog[TIPC_HIGH_IMPORTANCE].limit     = win / 2 * 3;
-       l->backlog[TIPC_CRITICAL_IMPORTANCE].limit = win * 2;
+       l->backlog[TIPC_LOW_IMPORTANCE].limit      = max_t(u16, 50, win);
+       l->backlog[TIPC_MEDIUM_IMPORTANCE].limit   = max_t(u16, 100, win * 2);
+       l->backlog[TIPC_HIGH_IMPORTANCE].limit     = max_t(u16, 150, win * 3);
+       l->backlog[TIPC_CRITICAL_IMPORTANCE].limit = max_t(u16, 200, win * 4);
        l->backlog[TIPC_SYSTEM_IMPORTANCE].limit   = max_bulk;
 }