Hi, I tested removing some slop (i.e. structure packing/de-holing) on amd64, this went through a full kernel + userland build.
struct proc 20 bytes (6 places) --> 4 bytes (2 places) struct process 28 bytes (6 places) --> 4 bytes (1 place) struct vm_map 8 bytes (2 places) --> 0 bytes Thanks diff --git a/sys/sys/proc.h b/sys/sys/proc.h index 1c7ea4697e2..d2955e2d0f7 100644 --- 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 */ 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; @@ -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 */ #define p_rlimit p_p->ps_limit->pl_rlimit @@ -296,7 +296,6 @@ 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. */ #define p_startzero p_dupfd @@ -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. */ const volatile void *p_wchan;/* Sleep address. */ @@ -315,11 +319,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. */ diff --git a/sys/uvm/uvm_map.h b/sys/uvm/uvm_map.h index 07ca0d0ef45..4a63463d325 100644 --- a/sys/uvm/uvm_map.h +++ b/sys/uvm/uvm_map.h @@ -292,16 +292,15 @@ struct vm_map { struct pmap * pmap; /* Physical map */ struct rwlock lock; /* Lock for map data */ struct mutex mtx; - u_int serial; /* signals stack changes */ - struct uvm_map_addr addr; /* Entry tree, by addr */ + u_int serial; /* signals stack changes */ - vsize_t size; /* virtual size */ int ref_count; /* Reference count */ int flags; /* flags */ - struct mutex flags_lock; /* flags lock */ unsigned int timestamp; /* Version number */ + struct mutex flags_lock; /* flags lock */ + vsize_t size; /* virtual size */ vaddr_t min_offset; /* First address in map. */ vaddr_t max_offset; /* Last address in map. */