On Tue, Aug 29, 2023 at 01:01:10AM +0000, Eric Wong wrote:
> >Synopsis: RLIMIT_CPU doesn't work reliably on mostly idle systems
> >Category: system
> >Environment:
> System : OpenBSD 7.3
> Details : OpenBSD 7.3 (GENERIC.MP) #1242: Sat Mar 25 18:04:31 MDT
> 2023
>
> [email protected]:/usr/src/sys/arch/octeon/compile/GENERIC.MP
>
> Architecture: OpenBSD.octeon
> Machine : octeon
> >Description:
>
> RLIMIT_CPU doesn't work reliably when few/no syscalls are made on an
> otherwise idle system (aside from the test process using up CPU).
> It can take 20-50s to fire SIGKILL with rlim_max=9 (and the SIGXCPU
> from rlim_cur=1 won't even fire).
>
> I can reproduce this on a private amd64 VM and also on gcc231
> on GCC compiler farm <https://cfarm.tetaneutral.net/>.
> I can't reproduce this on a busy system like gcc220 on cfarm,
> however.
Thanks for the report. There is indeed an issue in how the CPU time is
accounted on an idle system. The below diff is a possible fix.
In roundrobin() force a resched and therefor mi_switch() when
SPCF_SHOULDYIELD is set. On an idle CPU mi_switch() will just do all
accounting bits but skip the expensive cpu_switchto() since the proc
remains the same.
--
:wq Claudio
Index: kern/sched_bsd.c
===================================================================
RCS file: /cvs/src/sys/kern/sched_bsd.c,v
retrieving revision 1.84
diff -u -p -r1.84 sched_bsd.c
--- kern/sched_bsd.c 29 Aug 2023 16:19:34 -0000 1.84
+++ kern/sched_bsd.c 29 Aug 2023 16:20:03 -0000
@@ -106,7 +106,7 @@ roundrobin(struct clockintr *cl, void *c
}
}
- if (spc->spc_nrun)
+ if (spc->spc_nrun || spc->spc_schedflags & SPCF_SHOULDYIELD)
need_resched(ci);
}