statclock: move profil(2), GPROF code to profclock(), gmonclock()
authorcheloha <cheloha@openbsd.org>
Tue, 25 Jul 2023 18:16:19 +0000 (18:16 +0000)
committercheloha <cheloha@openbsd.org>
Tue, 25 Jul 2023 18:16:19 +0000 (18:16 +0000)
commit671537bfe8bfe713871272c2b93cc174a388053e
tree028f6e9490b1802b3ce3f5df54abdbdd266dd86b
parent32582aa5b7f9a28c272a081b866b0cab4da0b0ff
statclock: move profil(2), GPROF code to profclock(), gmonclock()

This patch isolates profil(2) and GPROF from statclock().  Currently,
statclock() implements both profil(2) and GPROF through a complex
mechanism involving both platform code (setstatclockrate) and the
scheduler (pscnt, psdiv, and psratio).  We have a machine-independent
interface to the clock interrupt hardware now, so we no longer need to
do it this way.

- Move profil(2)-specific code from statclock() to a new clock
  interrupt callback, profclock(), in subr_prof.c.  Each
  schedstate_percpu has its own profclock handle.  The profclock is
  enabled/disabled for a given CPU when it is needed by the running
  thread during mi_switch() and sched_exit().

- Move GPROF-specific code from statclock() to a new clock interrupt
  callback, gmonclock(), in subr_prof.c.  Where available, each cpu_info
  has its own gmonclock handle .  The gmonclock is enabled/disabled for
  a given CPU via sysctl(2) in prof_state_toggle().

- Both profclock() and gmonclock() have a fixed period, profclock_period,
  that is initialized during initclocks().

- Export clockintr_advance(), clockintr_cancel(), clockintr_establish(),
  and clockintr_stagger() via <sys/clockintr.h>.  They have external
  callers now.

- Delete pscnt, psdiv, psratio.  From schedstate_percpu, also delete
  spc_pscnt and spc_psdiv.  The statclock frequency is not dynamic
  anymore so these variables are now useless.

- Delete code/state related to the dynamic statclock frequency from
  kern_clockintr.c.  The statclock frequency can still be pseudo-random,
  so move the contents of clockintr_statvar_init() into clockintr_init().

With input from miod@, deraadt@, and claudio@.  Early revisions
cleaned up by claudio.  Early revisions tested by claudio@.  Tested by
cheloha@ on amd64, arm64, macppc, octeon, and sparc64 (sun4v).
Compile- and boot- tested on i386 by mlarkin@.  riscv64 compilation
bugs found by mlarkin@.  Tested on riscv64 by jca@.  Tested on
powerpc64 by gkoehler@.
37 files changed:
sys/arch/alpha/alpha/clock.c
sys/arch/alpha/include/cpu.h
sys/arch/amd64/include/cpu.h
sys/arch/amd64/isa/clock.c
sys/arch/arm/cortex/agtimer.c
sys/arch/arm/cortex/amptimer.c
sys/arch/arm/include/cpu.h
sys/arch/arm64/dev/agtimer.c
sys/arch/arm64/include/cpu.h
sys/arch/armv7/omap/dmtimer.c
sys/arch/armv7/omap/gptimer.c
sys/arch/armv7/sunxi/sxitimer.c
sys/arch/hppa/dev/clock.c
sys/arch/hppa/include/cpu.h
sys/arch/i386/include/cpu.h
sys/arch/i386/isa/clock.c
sys/arch/luna88k/luna88k/clock.c
sys/arch/m88k/include/cpu.h
sys/arch/macppc/macppc/clock.c
sys/arch/mips64/include/cpu.h
sys/arch/mips64/mips64/mips64_machdep.c
sys/arch/powerpc/include/cpu.h
sys/arch/powerpc64/powerpc64/clock.c
sys/arch/riscv64/include/cpu.h
sys/arch/riscv64/riscv64/clock.c
sys/arch/sh/include/cpu.h
sys/arch/sh/sh/clock.c
sys/arch/sparc64/include/cpu.h
sys/arch/sparc64/sparc64/clock.c
sys/kern/kern_clock.c
sys/kern/kern_clockintr.c
sys/kern/kern_sched.c
sys/kern/sched_bsd.c
sys/kern/subr_prof.c
sys/sys/clockintr.h
sys/sys/resourcevar.h
sys/sys/sched.h