Re: git: aa52c6bdd7b1 - main - newbus: Create a knob to disable devices that fail to attach.
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 05 Dec 2022 21:01:14 UTC
I think I'll just revert the default change... but in a few hours when I'm back home. Warner On Mon, Dec 5, 2022, 12:51 PM Cy Schubert <Cy.Schubert@cschubert.com> wrote: > In message <202212042333.2B4NX1JM089126@gitrepo.freebsd.org>, Warner Losh > write > s: > > The branch main has been updated by imp: > > > > URL: > https://cgit.FreeBSD.org/src/commit/?id=aa52c6bdd7b157b7c5d9612e4feac5c9 > > 4f376df6 > > > > commit aa52c6bdd7b157b7c5d9612e4feac5c94f376df6 > > Author: Warner Losh <imp@FreeBSD.org> > > AuthorDate: 2022-12-04 23:20:24 +0000 > > Commit: Warner Losh <imp@FreeBSD.org> > > CommitDate: 2022-12-04 23:20:24 +0000 > > > > newbus: Create a knob to disable devices that fail to attach. > > > > Normally, when a device fails to attach, we tear down the newbus > state > > for that device so that future driver loads can try again (maybe > with a > > different driver, or maybe with a re-loaded and fixed kld). > > > > Sometimes, however, it is desirable to have the device fail > > permanantly. We do this by calling device_disable() on a failed > > attached, as well as keeping the device in DS_ATTACHING forever. This > > prevents retries on that device. This is enabled via > > hw.bus.disable_failed_devices=1 in either a hint via the loader, or > at > > runtime with a sysctl setting. Setting from 1 -> 0 at runtime will > not > > affect previously disabled devices, however: they remain disabled. > > They can be re-enabled manually with devctl enable, however. > > > > Sponsored by: Netflix > > > > Reviewed by: gallatin, hselasky, jhb > > Differential Revision: https://reviews.freebsd.org/D37517 > > --- > > sys/kern/subr_bus.c | 33 +++++++++++++++++++++++++++------ > > 1 file changed, 27 insertions(+), 6 deletions(-) > > > > diff --git a/sys/kern/subr_bus.c b/sys/kern/subr_bus.c > > index 739484ad849a..b9615b033007 100644 > > --- a/sys/kern/subr_bus.c > > +++ b/sys/kern/subr_bus.c > > @@ -69,6 +69,10 @@ SYSCTL_NODE(_hw, OID_AUTO, bus, CTLFLAG_RW | > CTLFLAG_MPSAF > > E, NULL, > > SYSCTL_ROOT_NODE(OID_AUTO, dev, CTLFLAG_RW | CTLFLAG_MPSAFE, NULL, > > NULL); > > > > +static bool disable_failed_devs = false; > > +SYSCTL_BOOL(_hw_bus, OID_AUTO, disable_failed_devices, CTLFLAG_RWTUN, > &disab > > le_failed_devs, > > + 0, "Do not retry attaching devices that return an error from > DEVICE_ATTA > > CH the first time"); > > + > > /* > > * Used to attach drivers to devclasses. > > */ > > @@ -2533,12 +2537,29 @@ device_attach(device_t dev) > > if ((error = DEVICE_ATTACH(dev)) != 0) { > > printf("device_attach: %s%d attach returned %d\n", > > dev->driver->name, dev->unit, error); > > - if (!(dev->flags & DF_FIXEDCLASS)) > > - devclass_delete_device(dev->devclass, dev); > > - (void)device_set_driver(dev, NULL); > > - device_sysctl_fini(dev); > > - KASSERT(dev->busy == 0, ("attach failed but busy")); > > - dev->state = DS_NOTPRESENT; > > + if (disable_failed_devs) { > > + /* > > + * When the user has asked to disable failed > devices, w > > e > > + * directly disable the device, but leave it in the > > + * attaching state. It will not try to > probe/attach the > > + * device further. This leaves the device numbering > > + * intact for other similar devices in the system. > It > > + * can be removed from this state with devctl. > > + */ > > + device_disable(dev); > > + } else { > > + /* > > + * Otherwise, when attach fails, tear down the > state > > + * around that so we can retry when, for example, > new > > + * drivers are loaded. > > + */ > > + if (!(dev->flags & DF_FIXEDCLASS)) > > + devclass_delete_device(dev->devclass, dev); > > + (void)device_set_driver(dev, NULL); > > + device_sysctl_fini(dev); > > + KASSERT(dev->busy == 0, ("attach failed but > busy")); > > + dev->state = DS_NOTPRESENT; > > + } > > return (error); > > } > > dev->flags |= DF_ATTACHED_ONCE; > > > > When switching a KVM console from a FreeBSD machine to another machine > attached to the KVM the FreeBSD machine will panic. Photo attached. > > This probably needs an UPDATING entry explaining that > hw.bus.disable_failed_devices sysctl/kenv must be zero (0) to avoid the > panic. > > Sorry for taking so long to report this. Had an appointment this morning. > > > Cheers, > Cy Schubert <Cy.Schubert@cschubert.com> > FreeBSD UNIX: <cy@FreeBSD.org> Web: https://FreeBSD.org > NTP: <cy@nwtime.org> Web: https://nwtime.org > > e^(i*pi)+1=0 >