locking in a device driver

Julian Elischer julian at elischer.org
Thu Nov 3 09:48:10 PST 2005


Sergey Babkin wrote:

>>From: "M. Warner Losh" <imp at bsdimp.com>
>>           Scott Long <scottl at samsco.org> writes:
>>: Dinesh Nair wrote:
>>: > 
>>: > 
>>: > On 11/03/05 03:12 Warner Losh said the following:
>>: > 
>>: >> Yes.  if you tsleep with signals enabled, the periodic timer will go
>>: >> off, and you'll return early.  This typically isn't what you want
>>: >> either.
>>: > 
>>: > 
>>: > looks like i've got a lot of work to do, poring thru all the ioctls for 
>>: > the device and trying to use another method to wait instead of tsleep().
>>: 
>>: Note that a thread can block on select/poll in 4.x and still allow other
>>: threads to run.  I used this to solve a very similar problem to your in
>>: a 4.x app of mine.  I have the app thread wait on select() on the device
>>: node for the driver.  When the driver gets to a state when an ioctl
>>: won't block (like data being available to read), then it does the
>>: appropriate magic in it's d_poll method.  select in userland sees this,
>>: allows the thread to resume running, and the thread then calls ioctl.
>>: Of course you have to be careful that you don't have multiple threads
>>: competing for the same data or that the data won't somehow disappear
>>: before the ioctl call runs.  But it does work.  Look at the aac(4)
>>: driver for my example of this.
>>
>>Yes.  If you have the ability to know that an ioctl won't block before
>>you call it, that would work too.  This method is a little trickier,
>>like you say, but can be made to work.  I've also seen ioctls that
>>    
>>
>
>Maybe it can be fixed in the kernel without
>too much trouble. Basically, the trick would be 
>to start another kernel thread  when the first 
>one blocks. Then the original one can be left 
>executing the ioctl while the new one continues 
>the work. Then of cours ethere should be some 
>notification mechanism that the ioctl has 
>completed.
>
>The new thread can start in a signal handler,
>kind of like what UnixWare does (and I believe
>Solaris too): they have an M:N model where M
>user threads are scheduled on N kernel threads.
>When all the kernel threads of a process get 
>blocked, a signal is sent thread which handler
>then starts a new kernel thread if there
>are any runnable user threads.
>
>  
>

so you've just describes KSE in 5,6 and 7

>Hm, suppose we have a per-process property "is 
>threaded" that would be set by the threads library. Any
>blocking calls (tsleep() and such) would check it,
>and if it's set than immediately post this "all
>threads are blocked" signal. Then the library can
>catch it and handle in some useful way, maybe
>doing an rfork() or just running another user thread
>and returning to this one later.
>
>-SB
>
>
>_______________________________________________
>freebsd-hackers at freebsd.org mailing list
>http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
>To unsubscribe, send any mail to "freebsd-hackers-unsubscribe at freebsd.org"
>  
>


More information about the freebsd-hackers mailing list