aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/tipc/bcast.c30
1 files changed, 29 insertions, 1 deletions
diff --git a/net/tipc/bcast.c b/net/tipc/bcast.c
index 8b010c976b2f..41042de3ae9b 100644
--- a/net/tipc/bcast.c
+++ b/net/tipc/bcast.c
@@ -170,6 +170,30 @@ static void bclink_retransmit_pkt(struct tipc_net *tn, u32 after, u32 to)
170} 170}
171 171
172/** 172/**
173 * bclink_prepare_wakeup - prepare users for wakeup after congestion
174 * @bcl: broadcast link
175 * @resultq: queue for users which can be woken up
176 * Move a number of waiting users, as permitted by available space in
177 * the send queue, from link wait queue to specified queue for wakeup
178 */
179static void bclink_prepare_wakeup(struct tipc_link *bcl, struct sk_buff_head *resultq)
180{
181 int pnd[TIPC_SYSTEM_IMPORTANCE + 1] = {0,};
182 int imp, lim;
183 struct sk_buff *skb, *tmp;
184
185 skb_queue_walk_safe(&bcl->wakeupq, skb, tmp) {
186 imp = TIPC_SKB_CB(skb)->chain_imp;
187 lim = bcl->window + bcl->backlog[imp].limit;
188 pnd[imp] += TIPC_SKB_CB(skb)->chain_sz;
189 if ((pnd[imp] + bcl->backlog[imp].len) >= lim)
190 continue;
191 skb_unlink(skb, &bcl->wakeupq);
192 skb_queue_tail(resultq, skb);
193 }
194}
195
196/**
173 * tipc_bclink_wakeup_users - wake up pending users 197 * tipc_bclink_wakeup_users - wake up pending users
174 * 198 *
175 * Called with no locks taken 199 * Called with no locks taken
@@ -177,8 +201,12 @@ static void bclink_retransmit_pkt(struct tipc_net *tn, u32 after, u32 to)
177void tipc_bclink_wakeup_users(struct net *net) 201void tipc_bclink_wakeup_users(struct net *net)
178{ 202{
179 struct tipc_net *tn = net_generic(net, tipc_net_id); 203 struct tipc_net *tn = net_generic(net, tipc_net_id);
204 struct tipc_link *bcl = tn->bcl;
205 struct sk_buff_head resultq;
180 206
181 tipc_sk_rcv(net, &tn->bclink->link.wakeupq); 207 skb_queue_head_init(&resultq);
208 bclink_prepare_wakeup(bcl, &resultq);
209 tipc_sk_rcv(net, &resultq);
182} 210}
183 211
184/** 212/**