Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How kernel notify a user space program an interrupt occurrs

I'm writing a user space program and a kernel space device driver.

Goal: Once an interrupt occurs, user space program needs to do something quickly.

My naive method: User space program uses ioctl to call wait_event_interruptible(), kernel ISR calls wake_up_interruptible() to wake up user space program. It turns out that it takes too much time from interrupt to user space.

Is there any better way?

Thanks!

like image 548
user1747565 Avatar asked Oct 15 '12 15:10

user1747565


People also ask

How kernel handles an occurrence of an interrupt?

Interrupt handling in Linux. In Linux the interrupt handling is done in three phases: critical, immediate and deferred. In the first phase the kernel will run the generic interrupt handler that determines the interrupt number, the interrupt handler for this particular interrupt and the interrupt controller.

How does user space and kernel space communicate?

And it uses proc, ioctl, and system call to realize the communication between Kernel and User Spaces. But these methods must keep user space synchronizing with kernel space. So, Netlink mechanism is used, and ONU logs are recommended, which is difficult for proc, ioctl, and system call.

Can interrupts occur in kernel mode?

Kernel-mode code is always interruptible: an interrupt with a higher IRQL value can occur at any time, thereby causing another piece of kernel-mode code that has a higher system-assigned IRQL to be run immediately on that processor.

How interrupts work in Linux kernel?

An interrupt is simply a signal that the hardware can send when it wants the processor's attention. Linux handles interrupts in much the same way that it handles signals in user space. For the most part, a driver need only register a handler for its device's interrupts, and handle them properly when they arrive.


1 Answers

There is a similar question asked here:

Notify gpio interrupt to user space from a kernel module

Please check above question. However, i can provide my approach which i suggested there as well.

You can send a signal to user space thread from kernel API, which can help u run non-blocking:

send_sig(int sig, struct task_struct *p, int priv);

You need to be aware of pid of user thread in Kernel. You can over come this by writing pid of user process via /proc and then kernel reading the pid. With this arrangement, when there is an interrupt, kernel can send signal to user thread. In case your process restarts or gets killed, you will have to update the pid via proc. Just for status notification you can use this method; however if you like to transfer data along with status than Netlink or char driver mechanism is good way.

like image 130
Gyan Gupta Avatar answered Oct 23 '22 09:10

Gyan Gupta