--- x/net/sched/sch_taprio.c +++ y/net/sched/sch_taprio.c @@ -918,7 +918,7 @@ static enum hrtimer_restart advance_sche int num_tc = netdev_get_num_tc(dev); struct sched_entry *entry, *next; struct Qdisc *sch = q->root; - ktime_t end_time; + ktime_t end_time, now; int tc; spin_lock(&q->current_entry_lock); @@ -980,6 +980,11 @@ first_run: rcu_assign_pointer(q->current_entry, next); spin_unlock(&q->current_entry_lock); + now = timer->base->get_time(); + now = ktime_add_us(now, 2); + /* is end_time sane? */ + if (ktime_after(now, end_time)) + end_time = now; hrtimer_set_expires(&q->advance_timer, end_time); rcu_read_lock();