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 +                    \

Reply via email to