Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 13 Apr 2011 17:33:45 +0300
From:      Jaakko Heinonen <jh@FreeBSD.org>
To:        Alexander Motin <mav@FreeBSD.org>
Cc:        svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org
Subject:   Re: svn commit: r220454 - in head: share/man/man4 sys/cam/ata sys/conf
Message-ID:  <20110413143345.GA1553@a91-153-123-205.elisa-laajakaista.fi>
In-Reply-To: <201104081442.p38EgUhl083322@svn.freebsd.org>
References:  <201104081442.p38EgUhl083322@svn.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On 2011-04-08, Alexander Motin wrote:
>   - Add kern.cam.ada.X.write_cache tunables/sysctls to control write caching
>   on per-device basis.

> --- head/sys/cam/ata/ata_da.c	Fri Apr  8 14:39:41 2011	(r220453)
> +++ head/sys/cam/ata/ata_da.c	Fri Apr  8 14:42:29 2011	(r220454)
> @@ -738,6 +773,10 @@ adaregister(struct cam_periph *periph, v
>  		softc->quirks = ((struct ada_quirk_entry *)match)->quirks;
>  	else
>  		softc->quirks = ADA_Q_NONE;
> +	softc->write_cache = -1;
> +	snprintf(announce_buf, sizeof(announce_buf),
> +	    "kern.cam.ada.%d.writa_cache", periph->unit_number);
                                ^^^
Typo.

> +	TUNABLE_INT_FETCH(announce_buf, &softc->write_cache);

TUNABLE_INT_FETCH() uses getenv() which may sleep (due to M_WAITOK
allocation). You will get a witness warning (see below) on a WITNESS
enabled kernel because the sim mutex is held in adaregister(). The
tunable must exist, otherwise getenv() doesn't allocate memory.

cd(4) has the same problem for kern.cam.cd.%d.minimum_cmd_size tunable
and da(4) for kern.cam.da.%d.minimum_cmd_size tunable.

I am considering adding WITNESS_WARN() to getenv() to expose these bugs
early.

uma_zalloc_arg: zone "16" with the following non-sleepable locks held:
exclusive sleep mutex ATA state lock (ATA state lock) r = 0 (0xc42e0174) locked @ /home/jaakko/src/head/sys/cam/cam_xpt.c:1991
KDB: stack backtrace:
db_trace_self_wrapper(c0cccf87,c0cca676,192,0,0,...) at db_trace_self_wrapper+0x26
kdb_backtrace(7c7,0,ffffffff,c0f8d60c,d8cc8cfc,...) at kdb_backtrace+0x2a
_witness_debugger(c0ccfeaa,d8cc8d10,4,1,0,...) at _witness_debugger+0x25
witness_warn(5,0,c0d0361e,c0c81bfe,c0cbef65,...) at witness_warn+0x1fe
uma_zalloc_arg(c15b99c0,0,2,2,0,...) at uma_zalloc_arg+0x34
malloc(2,c0dd29f0,2,156,310000,...) at malloc+0x113
getenv(d8cc90b8,d8cc8ec4,a,d8cc8efc,d8cc90b8,...) at getenv+0xea
getenv_quad(d8cc90b8,d8cc8ee0,d8cc8efc,d8cc8efc,d8cc9118,...) at getenv_quad+0x1a
getenv_int(d8cc90b8,c456b044,c0c2a8fe,0,c048d560,...) at getenv_int+0x18
adaregister(c4219080,d8cc9694,d8cc9170,0,0,...) at adaregister+0x1ef

-- 
Jaakko



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