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.
On Mon, Mar 23, 2015 at 2:18 PM, Milton Krutt <milton@krutt.org> wrote:
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.
Perhaps spinlocks could be the solution :). 2.6.10 please no - :), Linux kernel is now at 4.0. Daniel.
On Mon, Mar 23, 2015 at 2:18 PM, Milton Krutt <milton@krutt.org> wrote:
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.
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!
participants (2)
-
Daniel Baluta -
Milton Krutt