On Tue, Oct 15, 2019 at 05:19:15PM +0200, Martin Pieuchot wrote:
> 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?
OK bluhm@
> 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