Hi,
Is there any feedback on this?
Thanks
> > > I tested removing some slop (i.e. structure packing/de-holing) on amd64,
> > > this went through a full kernel + userland build.
> > >
> >
> > Parts of this are probably okay, but there's some stuff which needs better
> > placement vs comments and at least one move which needs a justification for
> > it being safe (or not).
>
> Thanks for your feedback!
>
> > > --- a/sys/sys/proc.h
> > > +++ b/sys/sys/proc.h
> > > @@ -170,8 +170,8 @@ struct process {
> > >
> > > /* The following fields are all zeroed upon creation in process_new. */
> > > #define ps_startzero ps_klist
> > > - struct klist ps_klist; /* knotes attached to this process
> > > */
> > > int ps_flags; /* PS_* flags. */
> > > + struct klist ps_klist; /* knotes attached to this process
> > > */
> > >
> >
> > Nope: you've moved ps_flags from inside the "zeroed out on fork" region to
> > outside of it
> > a) without justifying why that's safe, and
> > b) while leaving it below the comment saying that it's zeroed, when it no
> > longer is.
>
> My fault, I didn't read the defines properly before sending. Fixed by
> defining ps_startzero to point to ps_flags, so it is zero'd out as before.
>
> >
> > Do any of the other moves here cross a start/end zero/copy marker?
>
> Thanks for the hint. I re-checked now from the process_new() and thread_new()
> functions in kern_fork.c. All the moves have been made within the
> startcopy/startzero and endcopy/endzero defines in both struct proc and
> struct process. So the memset to 0, and memcpy from parents will work as
> before. I updated a comment to point to thread_new() function, so it is clear
> where struct proc is inited. Please let me know if I have overlooked anything.
>
> >
> > > @@ -285,6 +284,7 @@ struct proc {
> > > struct futex *p_futex; /* Current sleeping futex. */
> > >
> > > /* substructures: */
> > > + LIST_ENTRY(proc) p_hash; /* Hash chain. */
> > > struct filedesc *p_fd; /* copy of p_p->ps_fd */
> > > struct vmspace *p_vmspace; /* copy of p_p->ps_vmspace */
> > >
> >
> > p_hash isn't a substructure, so putting it below the /* substructures: */
> > comment is wrong. Please pay attention to the comments and consider how
> > the apply (or don't) to the members you're moving.
>
> Fixed.
>
> >
> > > @@ -305,6 +304,11 @@ struct proc {
> > > long p_thrslpid; /* for thrsleep syscall */
> > >
> > > /* scheduling */
> > > + struct cpu_info * volatile p_cpu; /* CPU we're running on. */
> > > +
> > > + struct rusage p_ru; /* Statistics */
> > > + struct tusage p_tu; /* accumulated times. */
> > > + struct timespec p_rtime; /* Real time. */
> > > u_int p_estcpu; /* Time averaged value of p_cpticks. */
> > > int p_cpticks; /* Ticks of cpu time. */
> > >
> >
> > Again, you've separated the scheduling parameter from the /* scheduling */
> > comment, putting member that aren't about scheduling between them.
>
> Fixed. The structs rusage/tusage/timespec are not part of scheduling, so I
> moved them before the scheduling comment.
>
> Updated diff follows. This survived a kernel compile, reboot, and use for
> quite some time.
>
>
> diff --git a/sys/sys/proc.h b/sys/sys/proc.h
> index 1c7ea4697e2..d6082cb0551 100644
> --- a/sys/sys/proc.h
> +++ b/sys/sys/proc.h
> @@ -169,9 +169,9 @@ struct process {
> pid_t ps_pid; /* Process identifier. */
>
> /* The following fields are all zeroed upon creation in process_new. */
> -#define ps_startzero ps_klist
> - struct klist ps_klist; /* knotes attached to this process */
> +#define ps_startzero ps_flags
> int ps_flags; /* PS_* flags. */
> + struct klist ps_klist; /* knotes attached to this process */
>
> struct proc *ps_single; /* Single threading to this thread. */
> int ps_singlecount; /* Not yet suspended threads. */
> @@ -200,15 +200,6 @@ struct process {
> struct pgrp *ps_pgrp; /* Pointer to process group. */
> struct emul *ps_emul; /* Emulation information */
>
> - char ps_comm[MAXCOMLEN+1];
> -
> - vaddr_t ps_strings; /* User pointers to argv/env */
> - vaddr_t ps_sigcode; /* User pointer to the signal code */
> - vaddr_t ps_sigcoderet; /* User pointer to sigreturn retPC */
> - u_long ps_sigcookie;
> - u_int ps_rtableid; /* Process routing table/domain. */
> - char ps_nice; /* Process "nice" value. */
> -
> struct uprof { /* profile arguments */
> caddr_t pr_base; /* buffer base */
> size_t pr_size; /* buffer size */
> @@ -216,7 +207,15 @@ struct process {
> u_int pr_scale; /* pc scaling */
> } ps_prof;
>
> + char ps_comm[MAXCOMLEN+1];
> + char ps_nice; /* Process "nice" value. */
> u_short ps_acflag; /* Accounting flags. */
> + u_int ps_rtableid; /* Process routing table/domain. */
> +
> + vaddr_t ps_strings; /* User pointers to argv/env */
> + vaddr_t ps_sigcode; /* User pointer to the signal code */
> + vaddr_t ps_sigcoderet; /* User pointer to sigreturn retPC */
> + u_long ps_sigcookie;
>
> uint64_t ps_pledge;
> uint64_t ps_execpledge;
> @@ -284,6 +283,8 @@ struct proc {
> TAILQ_ENTRY(proc) p_fut_link; /* Threads in a futex linkage. */
> struct futex *p_futex; /* Current sleeping futex. */
>
> + LIST_ENTRY(proc) p_hash; /* Hash chain. */
> +
> /* substructures: */
> struct filedesc *p_fd; /* copy of p_p->ps_fd */
> struct vmspace *p_vmspace; /* copy of p_p->ps_vmspace */
> @@ -296,15 +297,19 @@ struct proc {
> u_char p_descfd; /* if not 255, fdesc permits this fd */
>
> pid_t p_tid; /* Thread identifier. */
> - LIST_ENTRY(proc) p_hash; /* Hash chain. */
>
> -/* The following fields are all zeroed upon creation in fork. */
> +/* The following fields are all zeroed upon creation in thread_new. */
> #define p_startzero p_dupfd
> int p_dupfd; /* Sideways return value from filedescopen.
> XXX */
>
> long p_thrslpid; /* for thrsleep syscall */
>
> + struct rusage p_ru; /* Statistics */
> + struct tusage p_tu; /* accumulated times. */
> + struct timespec p_rtime; /* Real time. */
> +
> /* scheduling */
> + struct cpu_info * volatile p_cpu; /* CPU we're running on. */
> u_int p_estcpu; /* Time averaged value of p_cpticks. */
> int p_cpticks; /* Ticks of cpu time. */
> const volatile void *p_wchan;/* Sleep address. */
> @@ -315,11 +320,6 @@ struct proc {
> u_int p_uticks; /* Statclock hits in user mode. */
> u_int p_sticks; /* Statclock hits in system mode. */
> u_int p_iticks; /* Statclock hits processing intr. */
> - struct cpu_info * volatile p_cpu; /* CPU we're running on. */
> -
> - struct rusage p_ru; /* Statistics */
> - struct tusage p_tu; /* accumulated times. */
> - struct timespec p_rtime; /* Real time. */
>
> int p_siglist; /* Signals arrived but not delivered. */
>