From: Eric Dumazet <eric.duma...@gmail.com> Date: Mon, 23 May 2016 14:24:56 -0700
> From: Eric Dumazet <eduma...@google.com> > > I found a serious performance bug in packet schedulers using hrtimers. > > sch_htb and sch_fq are definitely impacted by this problem. > > We constantly rearm high resolution timers if some packets are throttled > in one (or more) class, and other packets are flying through qdisc on > another (non throttled) class. > > hrtimer_start() does not have the mod_timer() trick of doing nothing if > expires value does not change : > > if (timer_pending(timer) && > timer->expires == expires) > return 1; > > This issue is particularly visible when multiple cpus can queue/dequeue > packets on the same qdisc, as hrtimer code has to lock a remote base. > > I used following fix : > > 1) Change htb to use qdisc_watchdog_schedule_ns() instead of open-coding > it. > > 2) Cache watchdog prior expiration. hrtimer might provide this, but I > prefer to not rely on some hrtimer internal. > > Signed-off-by: Eric Dumazet <eduma...@google.com> This looks fine, applied, thanks Eric.