--- x/net/sched/sch_fq_pie.c +++ s/net/sched/sch_fq_pie.c @@ -372,19 +372,22 @@ 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; root_lock = qdisc_lock(qdisc_root_sleeping(sch)); - spin_lock(root_lock); + if (!spin_trylock(root_lock)) + return; - for (idx = 0; idx < q->flows_cnt; idx++) + ts = jiffies + 2; + for (idx = 0; idx < q->flows_cnt; idx++) { pie_calculate_probability(&q->p_params, &q->flows[idx].vars, q->flows[idx].backlog); - /* reset the timer to fire after 'tupdate' jiffies. */ - if (q->p_params.tupdate) - mod_timer(&q->adapt_timer, jiffies + q->p_params.tupdate); - + if (time_after(jiffies, ts)) + break; + } spin_unlock(root_lock); + mod_timer(&q->adapt_timer, jiffies + HZ / 2); } static int fq_pie_init(struct Qdisc *sch, struct nlattr *opt,