GPROF: sleep_state: disable _mcount() across suspend/resume
authorcheloha <cheloha@openbsd.org>
Wed, 12 Jul 2023 18:40:06 +0000 (18:40 +0000)
committercheloha <cheloha@openbsd.org>
Wed, 12 Jul 2023 18:40:06 +0000 (18:40 +0000)
commit3772e814e0ead154912b1426b780015a463af85c
tree00ea6aa86240a9eeebc5b952b7c6f50bb610cf4b
parent1fdfa8fbc3b8ccd12baa5a752cb083f35501a85b
GPROF: sleep_state: disable _mcount() across suspend/resume

Something in the amd64 resume path doesn't agree with _mcount(), so
suspend/resume always fails if gmoninit is non-zero.  It would be nice
if GPROF kernels didn't crash during resume.

In sleep_state(), (1) clear gmoninit after sched_stop_secondary_cpus()
so the primary CPU isn't racing sysctl(2) on another CPU, and (2)
restore gmoninit just after resume_mp() so the secondary CPUs are out
of cpu_hatch() and away from whatever is causing the crash before
_mcount() is reenabled.

Lots of input from claudio@, deraadt@, and kettenis@.

Thread 1: https://marc.info/?l=openbsd-tech&m=168721453821801&w=2
Thread 2: https://marc.info/?l=openbsd-tech&m=168892518722935&w=2

ok kettenis@ deraadt@
sys/kern/subr_suspend.c