574}
575
576void tipc_link_wakeup_ports(struct link *l_ptr, int all)
577{
578 struct port *p_ptr;
579 struct port *temp_p_ptr;
580 int win = l_ptr->queue_limit[0] - l_ptr->out_queue_size;
581
582 if (all)
583 win = 100000;
584 if (win <= 0)
585 return;
586 if (!spin_trylock_bh(&tipc_port_list_lock))
587 return;
588 if (link_congested(l_ptr))
589 goto exit;
590 list_for_each_entry_safe(p_ptr, temp_p_ptr, &l_ptr->waiting_ports,
591 wait_list) {
592 if (win <= 0)
593 break;
594 list_del_init(&p_ptr->wait_list);
595 p_ptr->congested_link = NULL;
596 spin_lock_bh(p_ptr->publ.lock);
597 p_ptr->publ.congested = 0;
598 p_ptr->wakeup(&p_ptr->publ);
599 win -= p_ptr->waiting_pkts;
600 spin_unlock_bh(p_ptr->publ.lock);
601 }
602
603exit:
604 spin_unlock_bh(&tipc_port_list_lock);
605}
606
607
608
609
610
611
612static void link_release_outqueue(struct link *l_ptr)
613{
614 struct sk_buff *buf = l_ptr->first_out;