diff options
-rw-r--r-- | net/tipc/bcast.c | 30 |
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 | */ | ||
179 | static 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) | |||
177 | void tipc_bclink_wakeup_users(struct net *net) | 201 | void 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 | /** |