The only raison d'etre of scheduler_fork_hook() is because `p_estcpu' is not at the right place in "struct proc". Diff below fixes that. I reordered the fields to not have implicit padding increase the size of the structure.
ok? Index: sys/proc.h =================================================================== RCS file: /cvs/src/sys/sys/proc.h,v retrieving revision 1.273 diff -u -p -r1.273 proc.h --- sys/proc.h 2 Aug 2019 02:17:35 -0000 1.273 +++ sys/proc.h 15 Oct 2019 14:50:40 -0000 @@ -349,10 +349,7 @@ struct proc { #define p_startzero p_dupfd int p_dupfd; /* Sideways return value from filedescopen. XXX */ - long p_thrslpid; /* for thrsleep syscall */ - /* scheduling */ - u_int p_estcpu; /* [s] Time averaged val of p_cpticks */ int p_cpticks; /* Ticks of cpu time. */ const volatile void *p_wchan; /* [s] Sleep address. */ struct timeout p_sleep_to;/* timeout for tsleep() */ @@ -364,6 +361,8 @@ struct proc { u_int p_iticks; /* Statclock hits processing intr. */ struct cpu_info * volatile p_cpu; /* [s] CPU we're running on. */ + long p_thrslpid; /* for thrsleep syscall */ + struct rusage p_ru; /* Statistics */ struct tusage p_tu; /* accumulated times. */ struct timespec p_rtime; /* Real time. */ @@ -379,6 +378,7 @@ struct proc { u_char p_priority; /* [s] Process priority. */ u_char p_usrpri; /* [s] User-prio based on p_estcpu & ps_nice. */ + u_int p_estcpu; /* [s] Time averaged val of p_cpticks */ int p_pledge_syscall; /* Cache of current syscall */ struct ucred *p_ucred; /* cached credentials */ Index: sys/sched.h =================================================================== RCS file: /cvs/src/sys/sys/sched.h,v retrieving revision 1.55 diff -u -p -r1.55 sched.h --- sys/sched.h 15 Oct 2019 10:05:43 -0000 1.55 +++ sys/sched.h 15 Oct 2019 14:48:45 -0000 @@ -182,11 +182,6 @@ void sched_init_runqueues(void); void setrunqueue(struct cpu_info *, struct proc *, uint8_t); void remrunqueue(struct proc *); -/* Inherit the parent's scheduler history */ -#define scheduler_fork_hook(parent, child) do { \ - (child)->p_estcpu = (parent)->p_estcpu; \ -} while (0) - /* Chargeback parents for the sins of their children. */ #define scheduler_wait_hook(parent, child) do { \ (parent)->p_estcpu = ESTCPULIM((parent)->p_estcpu + (child)->p_estcpu);\ Index: kern/kern_fork.c =================================================================== RCS file: /cvs/src/sys/kern/kern_fork.c,v retrieving revision 1.214 diff -u -p -r1.214 kern_fork.c --- kern/kern_fork.c 15 Oct 2019 10:05:43 -0000 1.214 +++ kern/kern_fork.c 15 Oct 2019 14:48:37 -0000 @@ -170,13 +170,6 @@ thread_new(struct proc *parent, vaddr_t */ timeout_set(&p->p_sleep_to, endtsleep, p); - /* - * set priority of child to be that of parent - * XXX should move p_estcpu into the region of struct proc which gets - * copied. - */ - scheduler_fork_hook(parent, p); - #ifdef WITNESS p->p_sleeplocks = NULL; #endif