Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 12 Jan 2015 11:16:09 -0500
From:      John Baldwin <jhb@FreeBSD.org>
To:        Hans Petter Selasky <hps@selasky.org>
Cc:        arch@freebsd.org
Subject:   Re: devctl(8): A device control utility
Message-ID:  <54B3F349.9050703@FreeBSD.org>
In-Reply-To: <6155572.yV5dxPJznD@ralph.baldwin.cx>
References:  <3200196.9ZgXApgRdA@ralph.baldwin.cx> <54AAF60A.9070609@FreeBSD.org> <54AAFAEB.2090505@selasky.org> <6155572.yV5dxPJznD@ralph.baldwin.cx>

next in thread | previous in thread | raw e-mail | index | archive | help
On 1/5/15 4:18 PM, John Baldwin wrote:
> On Monday, January 05, 2015 09:58:19 PM Hans Petter Selasky wrote:
>> On 01/05/15 21:37, John Baldwin wrote:
>>> On 1/5/15 3:13 PM, Hans Petter Selasky wrote:
>>>> On 01/05/15 21:01, John Baldwin wrote:
>>>>> The devctl(8) utility is then a thin wrapper around libdevctl (and
>>>>> does not
>>>>> yet have a manpage).
>>>>>
>>>>> Do folks have any feedback?
>>>>
>>>> Hi,
>>>>
>>>> In the USB area attach and detach must be synchronized to the USB stack
>>>> and "usbconfig -d X.Y set_config Z" or "usbconfig -d X.Y reset" should
>>>> be used to avoid races attaching and detaching drivers!
>>>
>>> I think this points to one or more missing bus methods so that the bus
>>> can hook into device_probe_and_attach() to reset a device as needed.
>>> (e.g. if you had bus_probe_started / bus_probe_finished and possibly
>>> similar methods for attach.  PCI could use a bus_attach_finished()
>>> callback so that it could clean up any dangling resources and possibly
>>> power down on a failed attach the way it does in bus_child_detached as
>>> well).
>>
>> Hi,
>>
>> USB has its own threads to allocate/free devices. Another problem is how
>> to atomically get a reference count across multiple layers like PCI and
>> USB. It doesn't allow probe/attach when called from outside these threads.
> 
> That just means you need to use some locks. :)  Cardbus also uses an event
> thread to handle auto-attach of devices when it detected a card change event,
> but that doesn't prevent it from servicing an ioctl request.

Another option btw would be to add bus methods that wrap probe and
attach (rather than pre and post event hooks).  I wish bus_add_child()
were done this way such that device_add_child_ordered() were renamed to
bus_generic_add_child() (and was the default add_child method) and that
device_add_child_ordered() called 'BUS_ADD_CHILD()' so that
'device_add_child()' was the proper public API (instead of exposing
BUS_ADD_CHILD()).  Similarly, I think that 'device_attach()' and
'device_probe_and_attach()' should be the public API and that one way or
another we should add hooks to allow bus drivers to modify their
behavior if needed.  However, they should be fine for devctl ioctls to
invoke as well as other kernel bits.

-- 
John Baldwin



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