Re: git: cb1f5d11366d - main - Reduce minimum idle hardclock rate from 2Hz to 1Hz.
Date: Mon, 10 Jan 2022 02:33:34 UTC
On Mon, Jan 10, 2022 at 12:26:01AM +0000, Alexander Motin wrote: > The branch main has been updated by mav: > > URL: https://cgit.FreeBSD.org/src/commit/?id=cb1f5d11366dc9b803f2755d83fe02599830882a > > commit cb1f5d11366dc9b803f2755d83fe02599830882a > Author: Alexander Motin <mav@FreeBSD.org> > AuthorDate: 2022-01-10 00:17:43 +0000 > Commit: Alexander Motin <mav@FreeBSD.org> > CommitDate: 2022-01-10 00:25:56 +0000 > > Reduce minimum idle hardclock rate from 2Hz to 1Hz. > > On idle 80-thread system it allows to improve package-level idle state > residency and so power consumption by several percent. Are you sure that this is safe? Our timecounters are tailored to wrap at 1sec, at least the most precise/ important TSC-low is. If idle system interrupts with 1Hz frequency, it probably comes dangerously close to situations where tc_windup() could be missed. > > MFC after: 2 weeks > --- > sys/kern/kern_clocksource.c | 5 +++-- > sys/kern/kern_timeout.c | 5 ++--- > 2 files changed, 5 insertions(+), 5 deletions(-) > > diff --git a/sys/kern/kern_clocksource.c b/sys/kern/kern_clocksource.c > index dfc9081ba9f6..48e06ee082fc 100644 > --- a/sys/kern/kern_clocksource.c > +++ b/sys/kern/kern_clocksource.c > @@ -239,13 +239,14 @@ getnextcpuevent(int idle) > /* Handle hardclock() events, skipping some if CPU is idle. */ > event = state->nexthard; > if (idle) { > - hardfreq = (u_int)hz / 2; > - if (tc_min_ticktock_freq > 2 > + if (tc_min_ticktock_freq > 1 > #ifdef SMP > && curcpu == CPU_FIRST() > #endif > ) > hardfreq = hz / tc_min_ticktock_freq; > + else > + hardfreq = hz; > if (hardfreq > 1) > event += tick_sbt * (hardfreq - 1); > } > diff --git a/sys/kern/kern_timeout.c b/sys/kern/kern_timeout.c > index 91882ddb5fba..d0fb19661fa4 100644 > --- a/sys/kern/kern_timeout.c > +++ b/sys/kern/kern_timeout.c > @@ -434,8 +434,7 @@ callout_process(sbintime_t now) > struct callout_cpu *cc; > struct callout_list *sc; > struct thread *td; > - sbintime_t first, last, max, tmp_max; > - uint32_t lookahead; > + sbintime_t first, last, lookahead, max, tmp_max; > u_int firstb, lastb, nowb; > #ifdef CALLOUT_PROFILING > int depth_dir = 0, mpcalls_dir = 0, lockcalls_dir = 0; > @@ -455,7 +454,7 @@ callout_process(sbintime_t now) > else if (nowb - firstb == 1) > lookahead = (SBT_1S / 8); > else > - lookahead = (SBT_1S / 2); > + lookahead = SBT_1S; > first = last = now; > first += (lookahead / 2); > last += lookahead;