On Thu, 17 May 2007, Hans Petter Selasky wrote: > If you need to do Async stuff, then you have to do it in a separate thread or > in a so-called task-queue. Else you are in for great trouble! That was the > big "sin" in the old USB stack on FreeBSD: Calling synchronous USB callbacks > from everywhere, like ioctl/read/write - callbacks. > > Is that a problem on Linux also?
It's hard to answer; your use of terminology is peculiar. The word "synchronous" does not mean capable of blocking; it means that the routine waits until a result is received. It is not directly related to whether the routine runs in a process context (which can sleep) vs. an atomic context (one which isn't allowed to sleep). Referring to a callback as "synchronous" doesn't make sense. A callback doesn't send a message -- it _receives_ a message -- and hence it doesn't need to wait for any result. In Linux, the USB callbacks are generally atomic. Does that answer your question? > On Linux I see no locks used in the USB drivers, so they are solely protected > by interrupt-level mechanisms. That's an awfully strange thing to say. No locks used in the USB drivers? Good lord, they are full of locks! Semaphores, mutexes, spinlocks -- you name it, it's in there. > My rule is that: Synchronous or blocking calls _must_ happen in a config > thread that you can wait for. Else asynchronous calls on pre-allocated > transfers can happen anywhere. What distinguishes a "config" thread from any other kind of thread? What distingishes threads you can wait for from threads you can't wait for? What's wrong with a config thread that you can't wait for making a blocking call? Who cares if you can't wait for it? -- the thread will still carry out the call okay. > The problem clearly appears on Linux SMP because: What problem? Or should I say, Which problem? > a) No locks are in the USB drivers (then they must be all so-called "Giant" > locked) You must be living in some sort of fantasy land if you really believe this. Or else you're looking at a version of Linux from 8 years ago. > b) You don't pre-allocate transfers, resulting in synchronous/blocking calls > everywhere, and no-one thinks about what can happen then :-) Your reasoning is illogical. Why does allocation have to be blocking? In code paths which can't block, we do non-blocking late allocation. And we do think about what can happen. Alan Stern ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ _______________________________________________ linux-usb-devel@lists.sourceforge.net To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel