Hi Kostik, others, * Kostik Belousov <kostikbel_at_gmail.com> wrote: > No, this is a consequence of taking sx after proc lock in kern_acct.c, > acct_process(). You may turn off accounting, or try this patch: > > diff --git a/sys/kern/kern_acct.c b/sys/kern/kern_acct.c > index e505f62..d45e3b7 100644 > --- a/sys/kern/kern_acct.c > +++ b/sys/kern/kern_acct.c > _at__at_ -366,16 +366,25 _at__at_ acct_process(struct thread *td) > * 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; > _at__at_ -383,7 +392,7 _at__at_ acct_process(struct thread *td) > 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*. */ > _at__at_ -394,21 +403,13 _at__at_ acct_process(struct thread *td) > 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); Indeed. It seems I introduced this problem when importing the MPSAFE TTY layer: http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/kern/kern_acct.c.diff?r1=1.98;r2=1.99 Kevin, let me know if this fixes the problem for you. If it does, I'll commit it to SVN. Thanks! -- Ed Schouten <ed_at_80386.nl> WWW: http://80386.nl/
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:39:34 UTC