Forums

Synchronizing user space threads with kernel space in linux

Started by Mad...@Spammers April 29, 2004
I want to synchronize a user space thread to an external event that
generates an interrupt. I thought of using the following approach: the
ISR that treats the interrupt does a quick processing (such as data
capture and buffering) and then sends data to the user space thread
through a message queue or signals to the thread waiting on a
semaphore and it gets the buffered data from shared memory or some
similar mechanism. So far I haven't succeded in finding a way to do
it. I've tryed to write a module which uses semaphores (<linux/sem.h>)
but aparently there is no way to use SysV IPC primitives in kernel
modules.

I would appreciate having hints on how to do it or pointers to
documentation and example code if available.

Thank you very much in advance for your help.

Elder.
Mad@Spammers wrote:
> I want to synchronize a user space thread to an external event that > generates an interrupt. I thought of using the following approach: the > ISR that treats the interrupt does a quick processing (such as data > capture and buffering) and then sends data to the user space thread > through a message queue or signals to the thread waiting on a > semaphore and it gets the buffered data from shared memory or some > similar mechanism. So far I haven't succeded in finding a way to do > it. I've tryed to write a module which uses semaphores (<linux/sem.h>) > but aparently there is no way to use SysV IPC primitives in kernel > modules. > > I would appreciate having hints on how to do it or pointers to > documentation and example code if available. > > Thank you very much in advance for your help. > > Elder.
A user-space signal is the equivalent of an interrupt. When user-space drivers are involved, I like to use "send_sig_info()" to send a signal to the user-space task to indicate changes in the state of the driver. I like to model the user/kernel space interface to look like a hardware device in terms of interrupt/signal handling, with ioctl's to acknowledge/enable/disable signals/interrupts from the driver. However, I'm an embedded type that is used to that kind of thing ;-) Getting the data to/from kernel space is another issue, typically done by the read/write driver interface, or by using mmap(). -- Michael N. Moran (h) 770 516 7918 5009 Old Field Ct. (c) 678 521 5460 Kennesaw, GA, USA 30144 http://mnmoran.org "... abstractions save us time working, but they don't save us time learning." Joel Spolsky, The Law of Leaky Abstractions The Beatles were wrong: 1 & 1 & 1 is 1
On 29 Apr 2004, Mad@Spammers wrote:

> I want to synchronize a user space thread to an external event that > generates an interrupt.
Maybe the ongoing work about D-Bus can give you inspiration: <http://freedesktop.org/Software/dbus> One of its motivations was/is exactly to be able to do more driver stuff in user space, and I got the impression that that was what you are looking for... Herman -- K.U.Leuven, Mechanical Eng., Mechatronics & Robotics Research Group <http://people.mech.kuleuven.ac.be/~bruyninc> Tel: +32 16 322480
Michael N. Moran wrote:
>> I want to synchronize a user space thread to an external event that >> generates an interrupt. I thought of using the following approach: the >> ISR that treats the interrupt does a quick processing (such as data >> capture and buffering) and then sends data to the user space thread >> through a message queue or signals to the thread waiting on a >> semaphore and it gets the buffered data from shared memory or some >> similar mechanism. So far I haven't succeded in finding a way to do >> it. I've tryed to write a module which uses semaphores (<linux/sem.h>) >> but aparently there is no way to use SysV IPC primitives in kernel >> modules. > > A user-space signal is the equivalent of an interrupt. > When user-space drivers are involved, I like to use > "send_sig_info()" to send a signal to the user-space > task to indicate changes in the state of the driver. ... > > Getting the data to/from kernel space is another > issue, typically done by the read/write driver > interface, or by using mmap().
What kind of time resolution do you need? One other option is to use netlink sockets. They're pretty easy. One drawback is netlink socket addresses are somewhat precious, a little like signal numbers. - Dan
Hello Elder,

> I want to synchronize a user space thread to an external event that > generates an interrupt. I thought of using the following approach: the > ISR that treats the interrupt does a quick processing (such as data > capture and buffering) and then sends data to the user space thread
- Let your driver register a character interface - from your user space thread, do a synchronous read. - in your interrupt routine, copy the data and wakeup the waiting thread. Very common situation. Works without any problem for me. best regards Wolfgang M&#2013266172;es
Wolfgang M&#2013266172;es wrote:

> Hello Elder, > >> I want to synchronize a user space thread to an external event that >> generates an interrupt. I thought of using the following approach: the >> ISR that treats the interrupt does a quick processing (such as data >> capture and buffering) and then sends data to the user space thread > > - Let your driver register a character interface > - from your user space thread, do a synchronous read. > - in your interrupt routine, copy the data and wakeup the > waiting thread. > > Very common situation. Works without any problem for me. > > best regards > > Wolfgang M&#2013266172;es
Look twice at this approach! This is the UNIX way - everything is a file. Read about the (now) old OSS audio drivers for block devices - same data size on every read or write. Or serial ports for character devices. /RogerL -- Roger Larsson Skellefte&#2013265925; Sweden
Roger Larsson <roger.larsson@skelleftea.mail.telia.com> wrote in message 

> Look twice at this approach! This is the UNIX way - everything is a file.
Is it a good or a bad thing? Cheers. Elder.
Dan Kegel <dank-news@kegel.com> wrote in message 

> What kind of time resolution do you need? >
I presume this question was asked to me. I am just evaluating how well would Linux (either 2.4 with preemption and low latency patches or 2.6 with preemption enabled) perform for my application. Worst case interrupt latency of 400us and thread activation latency of 4ms are more than acceptable in my application. Regards. Elder.
Herman Bruyninckx <Herman.Bruyninckx@mech.kuleuven.ac.be> wrote in message news:<Pine.LNX.4.44.0404291542290.9591-100000@srv04.mech.kuleuven.ac.be>...
> On 29 Apr 2004, Mad@Spammers wrote: > > > I want to synchronize a user space thread to an external event that > > generates an interrupt. > > Maybe the ongoing work about D-Bus can give you inspiration: > <http://freedesktop.org/Software/dbus> > One of its motivations was/is exactly to be able to do more driver stuff in > user space, and I got the impression that that was what you are looking > for... > > Herman
I had a quick look at it. My requirements are much more modest and I'd rather use native linux resources instead. Still I will look at its code for some tips. Elder.
Wolfgang M&#2013266172;es wrote:

> - Let your driver register a character interface > - from your user space thread, do a synchronous read. > - in your interrupt routine, copy the data and wakeup the > waiting thread.
This method would get my vote. The "send a signal" approach is workable, but it can be difficult to get right. This is especially true if your application is already using a number of signals for other things. YMMV... John -- John W. Linville linville@tuxdriver.com