|
@@ -126,6 +126,16 @@ static void ccid2_change_l_seq_window(struct sock *sk, u64 val)
|
|
|
DCCPF_SEQ_WMAX));
|
|
|
}
|
|
|
|
|
|
+static void dccp_tasklet_schedule(struct sock *sk)
|
|
|
+{
|
|
|
+ struct tasklet_struct *t = &dccp_sk(sk)->dccps_xmitlet;
|
|
|
+
|
|
|
+ if (!test_and_set_bit(TASKLET_STATE_SCHED, &t->state)) {
|
|
|
+ sock_hold(sk);
|
|
|
+ __tasklet_schedule(t);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static void ccid2_hc_tx_rto_expire(struct timer_list *t)
|
|
|
{
|
|
|
struct ccid2_hc_tx_sock *hc = from_timer(hc, t, tx_rtotimer);
|
|
@@ -166,7 +176,7 @@ static void ccid2_hc_tx_rto_expire(struct timer_list *t)
|
|
|
|
|
|
/* if we were blocked before, we may now send cwnd=1 packet */
|
|
|
if (sender_was_blocked)
|
|
|
- tasklet_schedule(&dccp_sk(sk)->dccps_xmitlet);
|
|
|
+ dccp_tasklet_schedule(sk);
|
|
|
/* restart backed-off timer */
|
|
|
sk_reset_timer(sk, &hc->tx_rtotimer, jiffies + hc->tx_rto);
|
|
|
out:
|
|
@@ -706,7 +716,7 @@ static void ccid2_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
|
|
|
done:
|
|
|
/* check if incoming Acks allow pending packets to be sent */
|
|
|
if (sender_was_blocked && !ccid2_cwnd_network_limited(hc))
|
|
|
- tasklet_schedule(&dccp_sk(sk)->dccps_xmitlet);
|
|
|
+ dccp_tasklet_schedule(sk);
|
|
|
dccp_ackvec_parsed_cleanup(&hc->tx_av_chunks);
|
|
|
}
|
|
|
|