Skip to contentSkip to conversation

Delaying an interrupt handler

DISCUSSION Milton Krutt 2 participants 3 messages Mar 23, 2015

lore
Share & tools
lore
#0 lore raw

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.

#1 lore raw
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.

#2 lore raw
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!