Messages in this thread | | | From | bsegall@google ... | Subject | Re: [PATCH 2/2] sched/fair: Refill bandwidth before scaling | Date | Mon, 20 Apr 2020 10:54:53 -0700 |
| |
Huaixin Chang <changhuaixin@linux.alibaba.com> writes:
> In order to prevent possible hardlockup of sched_cfs_period_timer() > loop, loop count is introduced to denote whether to scale quota and > period or not. However, scale is done between forwarding period timer > and refilling cfs bandwidth runtime, which means that period timer is > forwarded with old "period" while runtime is refilled with scaled > "quota". > > Move do_sched_cfs_period_timer() before scaling to solve this.
Reviewed-by: Ben Segall <bsegall@google.com>
> > Fixes: 2e8e19226398 ("sched/fair: Limit sched_cfs_period_timer() loop to avoid hard lockup") > Signed-off-by: Huaixin Chang <changhuaixin@linux.alibaba.com> > --- > kernel/sched/fair.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c > index 02f323b85b6d..9ace1c5c73a5 100644 > --- a/kernel/sched/fair.c > +++ b/kernel/sched/fair.c > @@ -5152,6 +5152,8 @@ static enum hrtimer_restart sched_cfs_period_timer(struct hrtimer *timer) > if (!overrun) > break; > > + idle = do_sched_cfs_period_timer(cfs_b, overrun, flags); > + > if (++count > 3) { > u64 new, old = ktime_to_ns(cfs_b->period); > > @@ -5181,8 +5183,6 @@ static enum hrtimer_restart sched_cfs_period_timer(struct hrtimer *timer) > /* reset count so we don't come right back in here */ > count = 0; > } > - > - idle = do_sched_cfs_period_timer(cfs_b, overrun, flags); > } > if (idle) > cfs_b->period_active = 0;
| |