On Wed, Apr 11, 2012 at 19:30 +0200, Mike Belopuhov wrote: > This moves the accounting flag to struct process where it belongs. > The main rationale is that accounting flags are being collected on > the program exit. Ok? >
don't set AFORK when forking threads pointed out by guenther; missed suser bits. Index: kern/kern_acct.c =================================================================== RCS file: /cvs/src/sys/kern/kern_acct.c,v retrieving revision 1.24 diff -u -p -r1.24 kern_acct.c --- kern/kern_acct.c 23 Mar 2012 15:51:26 -0000 1.24 +++ kern/kern_acct.c 12 Apr 2012 10:00:08 -0000 @@ -224,7 +224,7 @@ acct_process(struct proc *p) acct.ac_tty = NODEV; /* (8) The boolean flags that tell how the process terminated, etc. */ - acct.ac_flag = p->p_acflag; + acct.ac_flag = pr->ps_acflag; /* * Now, just write the accounting information to the file. Index: kern/kern_exec.c =================================================================== RCS file: /cvs/src/sys/kern/kern_exec.c,v retrieving revision 1.127 diff -u -p -r1.127 kern_exec.c --- kern/kern_exec.c 26 Mar 2012 04:19:55 -0000 1.127 +++ kern/kern_exec.c 12 Apr 2012 10:00:08 -0000 @@ -475,7 +475,7 @@ sys_execve(struct proc *p, void *v, regi bzero(p->p_comm, sizeof(p->p_comm)); len = min(nid.ni_cnd.cn_namelen, MAXCOMLEN); bcopy(nid.ni_cnd.cn_nameptr, p->p_comm, len); - p->p_acflag &= ~AFORK; + pr->ps_acflag &= ~AFORK; /* record proc's vnode, for use by procfs and others */ if (p->p_textvp) Index: kern/kern_fork.c =================================================================== RCS file: /cvs/src/sys/kern/kern_fork.c,v retrieving revision 1.136 diff -u -p -r1.136 kern_fork.c --- kern/kern_fork.c 10 Apr 2012 15:50:52 -0000 1.136 +++ kern/kern_fork.c 12 Apr 2012 10:00:09 -0000 @@ -501,7 +501,8 @@ fork1(struct proc *curp, int exitsig, in */ SCHED_LOCK(s); getmicrotime(&pr->ps_start); - p->p_acflag = AFORK; + if ((flags & FORK_THREAD) == 0) + pr->ps_acflag = AFORK; p->p_stat = SRUN; p->p_cpu = sched_choosecpu_fork(curp, flags); setrunqueue(p); Index: kern/kern_prot.c =================================================================== RCS file: /cvs/src/sys/kern/kern_prot.c,v retrieving revision 1.53 diff -u -p -r1.53 kern_prot.c --- kern/kern_prot.c 10 Apr 2012 15:50:52 -0000 1.53 +++ kern/kern_prot.c 12 Apr 2012 10:00:09 -0000 @@ -763,7 +763,7 @@ suser(struct proc *p, u_int flags) if (cred->cr_uid == 0) { if (!(flags & SUSER_NOACCT)) - p->p_acflag |= ASU; + p->p_p->ps_acflag |= ASU; return (0); } return (EPERM); Index: kern/kern_sig.c =================================================================== RCS file: /cvs/src/sys/kern/kern_sig.c,v retrieving revision 1.139 diff -u -p -r1.139 kern_sig.c --- kern/kern_sig.c 11 Apr 2012 15:28:50 -0000 1.139 +++ kern/kern_sig.c 12 Apr 2012 10:00:09 -0000 @@ -1345,7 +1345,7 @@ sigexit(struct proc *p, int signum) /* Mark process as going away */ atomic_setbits_int(&p->p_flag, P_WEXIT); - p->p_acflag |= AXSIG; + p->p_p->ps_acflag |= AXSIG; if (sigprop[signum] & SA_CORE) { p->p_sisig = signum; @@ -1444,7 +1444,7 @@ coredump(struct proc *p) VATTR_NULL(&vattr); vattr.va_size = 0; VOP_SETATTR(vp, &vattr, cred, p); - p->p_acflag |= ACORE; + p->p_p->ps_acflag |= ACORE; io.io_proc = p; io.io_vp = vp; Index: sys/proc.h =================================================================== RCS file: /cvs/src/sys/sys/proc.h,v retrieving revision 1.155 diff -u -p -r1.155 proc.h --- sys/proc.h 11 Apr 2012 15:28:50 -0000 1.155 +++ sys/proc.h 12 Apr 2012 10:00:09 -0000 @@ -202,6 +202,8 @@ struct process { u_int pr_scale; /* pc scaling */ } ps_prof; + u_short ps_acflag; /* Accounting flags. */ + /* End area that is copied on creation. */ #define ps_endcopy ps_refcnt @@ -344,7 +346,6 @@ struct proc { u_long p_prof_ticks; /* temp storage for profiling ticks util AST */ u_short p_xstat; /* Exit status for wait; also stop signal. */ - u_short p_acflag; /* Accounting flags. */ }; /* Status values. */ Index: sys/sysctl.h =================================================================== RCS file: /cvs/src/sys/sys/sysctl.h,v retrieving revision 1.122 diff -u -p -r1.122 sysctl.h --- sys/sysctl.h 10 Apr 2012 15:50:52 -0000 1.122 +++ sys/sysctl.h 12 Apr 2012 10:00:09 -0000 @@ -519,7 +519,7 @@ do { \ (kp)->p_nice = (pr)->ps_nice; \ \ (kp)->p_xstat = (p)->p_xstat; \ - (kp)->p_acflag = (p)->p_acflag; \ + (kp)->p_acflag = (pr)->ps_acflag; \ \ /* XXX depends on e_name being an array and not a pointer */ \ copy_str((kp)->p_emul, (char *)(p)->p_emul + \