8.0-CURRENT kernel panic on system boot
Ed Schouten
ed at 80386.nl
Thu Aug 21 14:07:55 UTC 2008
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
> @@ -366,16 +366,25 @@ 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;
> @@ -383,7 +392,7 @@ 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*. */
> @@ -394,21 +403,13 @@ 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/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 195 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-current/attachments/20080821/85cce6d0/attachment.pgp
More information about the freebsd-current
mailing list