Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 10 Feb 2009 21:59:34 -0700 (MST)
From:      "M. Warner Losh" <imp@bsdimp.com>
To:        mav@freebsd.org
Cc:        svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org
Subject:   Re: svn commit: r188464 - head/sys/kern
Message-ID:  <20090210.215934.1159135034.imp@bsdimp.com>
In-Reply-To: <200902102322.n1ANMTgW007393@svn.freebsd.org>
References:  <200902102322.n1ANMTgW007393@svn.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
In message: <200902102322.n1ANMTgW007393@svn.freebsd.org>
            Alexander Motin <mav@freebsd.org> writes:
: Author: mav
: Date: Tue Feb 10 23:22:29 2009
: New Revision: 188464
: URL: http://svn.freebsd.org/changeset/base/188464
: 
: Log:
:   Check for device_set_devclass() errors and skip driver probe/attach if any.
:   Attach call without devclass set crashes the system.
:   
:   On resume AHCI driver sometimes tries to create duplicate adX device.
:   It is surely his own problem, but IMHO it is not a reason to crash here.
:   Other reasons are also possible.
: 
: Modified:
:   head/sys/kern/subr_bus.c
: 
: Modified: head/sys/kern/subr_bus.c
: ==============================================================================
: --- head/sys/kern/subr_bus.c	Tue Feb 10 23:17:20 2009	(r188463)
: +++ head/sys/kern/subr_bus.c	Tue Feb 10 23:22:29 2009	(r188464)
: @@ -1756,8 +1756,13 @@ device_probe_child(device_t dev, device_
:  		     dl = next_matching_driver(dc, child, dl)) {
:  			PDEBUG(("Trying %s", DRIVERNAME(dl->driver)));
:  			device_set_driver(child, dl->driver);
: -			if (!hasclass)
: -				device_set_devclass(child, dl->driver->name);
: +			if (!hasclass) {
: +				if (device_set_devclass(child, dl->driver->name)) {
: +					PDEBUG(("Unable to set device class"));
: +					device_set_driver(child, NULL);
: +					continue;
: +				}
: +			}
:  
:  			/* Fetch any flags for the device before probing. */
:  			resource_int_value(dl->driver->name, child->unit,

I'd prefer applying this patch to make it whine louder so we don't
forget about it:

Index: subr_bus.c
===================================================================
--- subr_bus.c	(revision 188476)
+++ subr_bus.c	(working copy)
@@ -1758,7 +1758,8 @@
 			device_set_driver(child, dl->driver);
 			if (!hasclass) {
 				if (device_set_devclass(child, dl->driver->name)) {
-					PDEBUG(("Unable to set device class"));
+					printf("driver bug: Unable to set devclass (devname: %s)\n",
+					    DEVICENAME(child));
 					device_set_driver(child, NULL);
 					continue;
 				}

Comments?

Warner



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