Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 21 Aug 2008 16:07:54 +0200
From:      Ed Schouten <ed@80386.nl>
To:        Kostik Belousov <kostikbel@gmail.com>
Cc:        kevin <kevinxlinuz@163.com>, FreeBSD Current <freebsd-current@freebsd.org>
Subject:   Re: 8.0-CURRENT kernel panic on system boot
Message-ID:  <20080821140754.GL99951@hoeg.nl>
In-Reply-To: <20080821135735.GJ1803@deviant.kiev.zoral.com.ua>
References:  <747dc8f30808201223i46ba04daw34c267574ba7cc99@mail.gmail.com> <20080820201226.GI99951@hoeg.nl> <20080820203238.GF1803@deviant.kiev.zoral.com.ua> <3c1674c90808201438p2751d7f7x3f5ee892310201c8@mail.gmail.com> <747dc8f30808210529s329bed21iea29ae5c0c28b793@mail.gmail.com> <48AD6EC3.5000507@163.com> <20080821135735.GJ1803@deviant.kiev.zoral.com.ua>

next in thread | previous in thread | raw e-mail | index | archive | help

[-- Attachment #1 --]
Hi Kostik, others,

* Kostik Belousov <kostikbel@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@80386.nl>
 WWW: http://80386.nl/

[-- Attachment #2 --]
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (FreeBSD)

iEYEARECAAYFAkitdroACgkQ52SDGA2eCwUoSwCeOdFow6Mw5BzATHk2qdnhmQFF
UZcAn0knRhCTGmfSJK/T0F+J+HVsNi7o
=ellz
-----END PGP SIGNATURE-----

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20080821140754.GL99951>