i386/78929: atapicam prevents boot, system hangs
Andrew Watkins
awatkins at ejungle.us
Mon Sep 19 17:20:22 PDT 2005
The following reply was made to PR i386/78929; it has been noted by GNATS.
From: "Andrew Watkins" <awatkins at ejungle.us>
To: <bug-followup at FreeBSD.org>,
<harrycoin at quietfountain.com>
Cc:
Subject: Re: i386/78929: atapicam prevents boot, system hangs
Date: Mon, 19 Sep 2005 17:19:08 -0700
This is a multi-part message in MIME format.
------=_NextPart_000_0185_01C5BD3E.3F2AF8D0
Content-Type: text/plain;
charset="us-ascii"
Content-Transfer-Encoding: 7bit
This happened on both i386 for me and amd64 with 5.4, both using SMP and not
for dual processor support (dell sc1425) with a QSI-DVD burner. Dump of the
kernel provided this:
_mtx_lock_sleep+0x77 (kern_mutex.c, 521)
Get_softc+0x80 (atapi-cam.c, 776)
Atapi_cam_reinit_bus+0x16 (atapi-cam.c, 195)
I read through the code to see where the mutex is initialized and found that
the only place it is done is atapi_cam_attach_bus. I guess its possible for
the code to reach the atapi_cam_reinit_bus which calls get_softc before the
bus is attached? Anyway, I changed get_softc to look to see if the mutex is
initialized before locking and that did the trick. Below is my modified
code:
static struct atapi_xpt_softc *
get_softc(struct ata_channel *ata_ch) {
struct atapi_xpt_softc *scp = NULL;
/* There could be a race condition where the atapi mtx has not been
initialized */
if (mtx_initialized(&atapicam_softc_mtx) == 0)
mtx_init(&atapicam_softc_mtx, "ATAPI/CAM softc mutex", NULL,
MTX_DEF);
mtx_lock(&atapicam_softc_mtx);
LIST_FOREACH(scp, &all_buses, chain) {
if (scp->ata_ch == ata_ch)
break;
}
mtx_unlock(&atapicam_softc_mtx);
return scp;
}
After that it booted no problem and burned a DVD like a champ.
I don't think this change can impact the rest of the system, but can someone
let me know as this is going to be a production box. Let me know if you
need anymore information as I have trace and the kernel.debug (burned on a
dvd as my trophy).
Andrew
------=_NextPart_000_0185_01C5BD3E.3F2AF8D0
Content-Type: text/html;
charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
<html xmlns:o=3D"urn:schemas-microsoft-com:office:office" =
xmlns:w=3D"urn:schemas-microsoft-com:office:word" =
xmlns=3D"http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv=3DContent-Type content=3D"text/html; =
charset=3Dus-ascii">
<meta name=3DGenerator content=3D"Microsoft Word 11 (filtered medium)">
<style>
<!--
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
margin-bottom:.0001pt;
font-size:12.0pt;
font-family:"Times New Roman";}
a:link, span.MsoHyperlink
{color:blue;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{color:purple;
text-decoration:underline;}
span.EmailStyle17
{mso-style-type:personal-compose;
font-family:Arial;
color:windowtext;}
@page Section1
{size:8.5in 11.0in;
margin:1.0in 1.25in 1.0in 1.25in;}
div.Section1
{page:Section1;}
-->
</style>
</head>
<body lang=3DEN-US link=3Dblue vlink=3Dpurple>
<div class=3DSection1>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'>This happened on both i386 for me and amd64 with 5.4, =
both
using SMP and not for dual processor support (dell sc1425) with a =
QSI-DVD
burner. Dump of the kernel provided =
this:<o:p></o:p></span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'><o:p> </o:p></span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'>_<i><span =
style=3D'font-style:italic'>mtx</span></i>_lock_sleep+0x77
(kern_mutex.c, 521)<o:p></o:p></span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'>Get_softc+0x80 (atapi-cam.c, =
776)<o:p></o:p></span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'>Atapi_cam_reinit_bus+0x16 (atapi-cam.c, =
195)<o:p></o:p></span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'><o:p> </o:p></span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'>I read through the code to see where the mutex is
initialized and found that the only place it is done is =
atapi_cam_attach_bus.
I guess its possible for the code to reach the atapi_cam_reinit_bus =
which calls
get_softc before the bus is attached? Anyway, I changed get_softc =
to look
to see if the mutex is initialized before locking and that did the =
trick.
Below is my modified code:<o:p></o:p></span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'><o:p> </o:p></span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'>static struct atapi_xpt_softc =
*<o:p></o:p></span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'>get_softc(struct ata_channel *ata_ch) =
{<o:p></o:p></span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'> struct atapi_xpt_softc *scp =3D =
NULL;<o:p></o:p></span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'><o:p> </o:p></span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'> /* There could be a race condition =
where
the atapi mtx has not been initialized */<o:p></o:p></span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'><o:p> </o:p></span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'> if
(mtx_initialized(&atapicam_softc_mtx) =3D=3D =
0)<o:p></o:p></span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'>
mtx_init(&atapicam_softc_mtx, "ATAPI/CAM softc mutex", =
NULL,
MTX_DEF);<o:p></o:p></span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'><o:p> </o:p></span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'><o:p> </o:p></span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'> =
mtx_lock(&atapicam_softc_mtx);<o:p></o:p></span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'> LIST_FOREACH(scp, &all_buses, =
chain)
{<o:p></o:p></span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'> =
if
(scp->ata_ch =3D=3D ata_ch)<o:p></o:p></span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'> =
break;<o:p></o:p></span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'> }<o:p></o:p></span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'> =
mtx_unlock(&atapicam_softc_mtx);<o:p></o:p></span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'> return =
scp;<o:p></o:p></span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'>}<o:p></o:p></span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'><o:p> </o:p></span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'>After that it booted no problem and burned a DVD like =
a
champ.<o:p></o:p></span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'>I don’t think this change can impact the rest =
of the
system, but can someone let me know as this is going to be a production =
box.
Let me know if you need anymore information as I have trace and the
kernel.debug (burned on a dvd as my =
trophy).<o:p></o:p></span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'><o:p> </o:p></span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'>Andrew<o:p></o:p></span></font></p>
</div>
</body>
</html>
------=_NextPart_000_0185_01C5BD3E.3F2AF8D0--
More information about the freebsd-i386
mailing list