On Thu, Jul 31, 2025 at 10:35:49AM -0600, Theo de Raadt wrote:
> > Modified files:
> > sys/kern : subr_suspend.c
> >
> > Log message:
> > Give the resume_time check in resuming() more headroom.
> >
> > On the Z13 resume by power button will usually trigger an immediate
> > shutdown after resume. When resume succeeds the headroom provided by
> > resume_time + 10 is between 1 to 3 seconds, which is a bit close.
> > Set the ceiling to resume + 15 to give us more time to finish resuming.
> >
> > ok kettenis@
>
> That is surprising.
>
> Are we setting resume_time too early?
The Z13 problem can also be fixed like this, which should not cause
additional penalty for machines which resume fast:
M sys/kern/subr_suspend.c | 9+ 1-
1 file changed, 9 insertions(+), 1 deletion(-)
commit - 3b565b6513502b4d00eb2ea3c0e8d1aa648f5db2
commit + 1021d30f8a4ef71b1ea00cea7b67ab4eb76798a9
blob - 3c83a049cb97e4b3026fd9c3b75d3b1eff2d3caa
blob + ae67b7b2e2af564597eb64892603a6080999bcf4
--- sys/kern/subr_suspend.c
+++ sys/kern/subr_suspend.c
@@ -55,6 +55,7 @@ sleep_state(void *v, int sleepmode)
extern int perflevel;
size_t rndbuflen;
char *rndbuf;
+ time_t now;
#ifdef GPROF
int gmon_state;
#endif
@@ -218,11 +219,18 @@ fail_hiballoc:
cpu_setperf(perflevel); /* Restore hw.setperf */
if (suspend_finish(v) == EAGAIN)
goto top;
+ /*
+ * Rearm the power-button timeout if we have spent
+ * a significant amount of time until here.
+ */
+ now = getuptime();
+ if (resume_time + 5 < now)
+ resume_time = now;
return (error);
}
int
resuming(void)
{
- return (getuptime() < resume_time + 15);
+ return (getuptime() < resume_time + 10);
}