PERFORCE change 148002 for review
Ed Schouten
ed at FreeBSD.org
Thu Aug 21 14:17:27 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=148002
Change 148002 by ed at ed_dull on 2008/08/21 14:16:34
Fix lock order reversal in the change to kern_acct.c I committed.
We should not pick up proctree_lock after PROC_LOCK. Fix
acct_process() to pick up the locks in the right order. Because
we should hold proctree_lock as short as possible, drop it after
obtaining the TTY udev.
Submitted by: kib (thanks!)
Affected files ...
.. //depot/projects/mpsafetty/sys/kern/kern_acct.c#3 edit
Differences ...
==== //depot/projects/mpsafetty/sys/kern/kern_acct.c#3 (text+ko) ====
@@ -366,16 +366,25 @@
* Get process accounting information.
*/
+ sx_slock(&proctree_lock);
PROC_LOCK(p);
- /* (1) The name of the command that ran */
+
+ /* (1) The terminal from which the process was started */
+ if ((p->p_flag & P_CONTROLT) && p->p_pgrp->pg_session->s_ttyp)
+ acct.ac_tty = tty_udev(p->p_pgrp->pg_session->s_ttyp);
+ else
+ acct.ac_tty = NODEV;
+ sx_sunlock(&proctree_lock);
+
+ /* (2) The name of the command that ran */
bcopy(p->p_comm, acct.ac_comm, sizeof acct.ac_comm);
- /* (2) The amount of user and system time that was used */
+ /* (3) The amount of user and system time that was used */
rufetchcalc(p, &ru, &ut, &st);
acct.ac_utime = encode_timeval(ut);
acct.ac_stime = encode_timeval(st);
- /* (3) The elapsed time the command ran (and its starting time) */
+ /* (4) The elapsed time the command ran (and its starting time) */
tmp = boottime;
timevaladd(&tmp, &p->p_stats->p_start);
acct.ac_btime = tmp.tv_sec;
@@ -383,7 +392,7 @@
timevalsub(&tmp, &p->p_stats->p_start);
acct.ac_etime = encode_timeval(tmp);
- /* (4) The average amount of memory used */
+ /* (5) The average amount of memory used */
tmp = ut;
timevaladd(&tmp, &st);
/* Convert tmp (i.e. u + s) into hz units to match ru_i*. */
@@ -394,21 +403,13 @@
else
acct.ac_mem = 0;
- /* (5) The number of disk I/O operations done */
+ /* (6) The number of disk I/O operations done */
acct.ac_io = encode_long(ru.ru_inblock + ru.ru_oublock);
- /* (6) The UID and GID of the process */
+ /* (7) The UID and GID of the process */
acct.ac_uid = p->p_ucred->cr_ruid;
acct.ac_gid = p->p_ucred->cr_rgid;
- /* (7) The terminal from which the process was started */
- sx_slock(&proctree_lock);
- if ((p->p_flag & P_CONTROLT) && p->p_pgrp->pg_session->s_ttyp)
- acct.ac_tty = tty_udev(p->p_pgrp->pg_session->s_ttyp);
- else
- acct.ac_tty = NODEV;
- sx_sunlock(&proctree_lock);
-
/* (8) The boolean flags that tell how the process terminated, etc. */
acct.ac_flagx = p->p_acflag;
PROC_UNLOCK(p);
More information about the p4-projects
mailing list