NEWBUS states (was Re: svn commit: r196779 - in head/sys: kern sys)

Hans Petter Selasky hselasky at c2i.net
Sat Sep 12 09:09:05 UTC 2009


On Tuesday 08 September 2009 15:36:37 John Baldwin wrote:
> On Friday 04 September 2009 6:46:03 pm Attilio Rao wrote:
> > We all agreed the one-state was the better option but it can't be done
> > in this way because of the device_is_attached() used in the detach
> > virtual functions. Using just one transition state will break
> > device_is_attached() in those parts.
> > The right fix, as pointed out in other e-mails, is to not use
> > device_is_attached() in detach virtual functions. The better fix, in
> > my idea would involve:
> > - replace the device_is_attached() usage in detach virtual functions,
> > with a more functional support
> > - use one-state transition
> >
> > But that is just too much job to push in before then 8.0-REL and if
> > that would mean to not commit a patch and make impossible a future
> > MFC, I prefer to go with a lesser-perfect-but-still-working-approach.
>
> Wait, all you need to MFC is the change to the enum.  Fixing the various
> detach routines does _not_ have to be in 8.0.  That could be merged after
> the release.

Hi,

http://svn.freebsd.org/viewvc/base/head/sys/kern/subr_bus.c?r1=196529&r2=196779

I'm sorry to say that the latest patches to subr_bus.c have broken USB. I've 
got several reports on memory used after free, due to bus_generic_detach() 
returning EBUSY when called from uhub_detach().

...
bus_generic_detach(device_t dev)
{
        device_t child;
        int error;

        if (dev->state != DS_ATTACHED)
                return (EBUSY);

        TAILQ_FOREACH(child, &dev->children, link) {
                if ((error = device_detach(child)) != 0)
                        return (error);
        }

        return (0);
}

A fix for USB is available here:

http://perforce.freebsd.org/chv.cgi?CH=168387


--HPS



More information about the freebsd-arch mailing list