--- x/net/sched/sch_fq_pie.c +++ y/net/sched/sch_fq_pie.c @@ -378,14 +378,18 @@ static void fq_pie_timer(struct timer_li struct Qdisc *sch = q->sch; spinlock_t *root_lock; /* to lock qdisc for probability calculations */ u32 idx; + unsigned long ts = jiffies + 20; rcu_read_lock(); root_lock = qdisc_lock(qdisc_root_sleeping(sch)); spin_lock(root_lock); - for (idx = 0; idx < q->flows_cnt; idx++) + for (idx = 0; idx < q->flows_cnt; idx++) { pie_calculate_probability(&q->p_params, &q->flows[idx].vars, q->flows[idx].backlog); + if (jiffies > ts) + break; + } /* reset the timer to fire after 'tupdate' jiffies. */ if (q->p_params.tupdate)