Delaying an interrupt handler
Hi.
It is known that no semaphore synchronization should be used inside an interrupt handler.
Anyway, I am looking at a freeBSD device driver (written by a profesionist) and there are semaphores inside an interrupt handler's subroutine.
Since I should port to linux that driver, I ask you how can I reach such synchronization under linux; I tried to use semaphores inside my handler but I got complains, and I don't want to break the law, so no semaphores for me.
The scenario is the following:
firmware downloader {
while(fw_blocks--){
/* the call below will cause an interrupt */load_block();
/* sleep unitl the int handler ackn's the previous operation, and prevent ANY int. handler operations until the process goes actually to sleep through the following call */
sleep(); }
}
int handler {
if(the process is NOT asleep)
wait();
wake up the process.
}
NOTE: I am on a 2.6.10 in order to be closely tutored by LDD3.
Quoted 4 lines · Milton Krutt
Hi.
It is known that no semaphore synchronization should be used inside an interrupt handler.
Quoted 8 lines
Anyway, I am looking at a freeBSD device driver (written by a profesionist) and there are semaphores inside an interrupt handler's subroutine.
Since I should port to linux that driver, I ask you how can I reach such synchronization under linux; I tried to use semaphores inside my handler but I got complains, and I don't want to break the law, so no semaphores for me.
Perhaps spinlocks could be the solution :).
2.6.10 please no - :), Linux kernel is now at 4.0.
Daniel.
Quoted 14 lines · Milton Krutt
Quoted 4 lines
Hi.
It is known that no semaphore synchronization should be used inside an interrupt handler.Quoted 8 lines
Anyway, I am looking at a freeBSD device driver (written by a profesionist) and there are semaphores inside an interrupt handler's subroutine.
Since I should port to linux that driver, I ask you how can I reach such synchronization under linux; I tried to use semaphores inside my handler but I got complains, and I don't want to break the law, so no semaphores for me.
Quoted 5 lines
Perhaps spinlocks could be the solution :).
2.6.10 please no - :), Linux kernel is now at 4.0.
Daniel.
Yes and no. The routine the int. handler's delay depends on has to make some non atomic work. So if I lock a spinlock and then I do some "lengthy" (i.e. non atomic) job, then I get a warning message like "spinlock held while being preempted" (or similar). In symbols, you suggest something like
process P{
spin_lock(lock);non_atomic_function();spin_unlock(lock);
}
int. handler {
spin_lock(lock);do_things(); /* preferably atomically */spin_unlock(lock);
}
My first attempt is still to avoid both semaphores and the above remedy, in order to delay the int. handler up to a desired point.
Thanks!