IRQ handler under load - slow response

Kurt Van Dijck kurt.van.dijck at eia.be
Mon Mar 14 10:47:15 EDT 2011


On Mon, Mar 14, 2011 at 02:26:35PM +0100, Arno Steffen wrote:
> 
> Sorry for delay with resonse.
No problem.
> Thanks for your help. Most of this options for ps doesn't work on my
> busybox embedded system.
Yep, we use a regular ps for that.
> Also chrt is not implemented currently. But that inspired me to
try a program with sched_setscheduler(2)
> another idea. I just announced the irqs in a sperate process:
> Is this what you proposed in b) ?
> 
> 	i = fork();
> 	if (i == 0) {
> 		printf("Prio IRQ %d\n",getpriority(PRIO_PROCESS, getpid()));
> 		setpriority(PRIO_PROCESS, getpid(), -10);
> 		printf("Prio IRQ %d\n",getpriority(PRIO_PROCESS, getpid()));
> 		gpio_irq_setup(GPI_IN1, GPIOCFG_FALLINGDETECT_INTR, &irq_handler);
> 		gpio_irq_setup(GPI_IN2, GPIOCFG_RISINGDETECT_INTR, &irq_handler );
> 		printf("all IRQ handlers are setup !\n");
> 		do {sleep(1);} while(1);
> 		exit(0);
> 	}
Euhm, my proposed b) deals in kernel. I think your example is in userspace?
Maybe I don't understand your precise setup well.

Anyway, what I meant was something in kernel like:
  s32Status = request_irq((IH_GPIO_BASE + s32AppRecvGpioNum),
                                     GpioIrqHandler,
-				     0,
+                                     GpioIrqThread,
                                     "GPIOINTR",
                                     NULL);

static irqreturn_t GpioIrqHandler (int irq, void *dev_id)
{
    int s32GpioNumber = 0 ;
    s32GpioNumber = irq - IH_GPIO_BASE;
    set_bit (s32GpioNumber , (volatile unsigned long *) &gsts32GpioIrqStatus);
-   tasklet_schedule (&GpioTasklet);
-   return IRQ_HANDLED;
+   return IRQ_WAKE_THREAD;
}

-DECLARE_TASKLET(GpioTasklet, GpioIntrTasklet, 0);
static irqreturn_t GpioIrqThread(int irq, void *dev_id)
{
	/* do whatever the tasklet was supposed to do */
}

no, you get a seperate kernel thread that you can play with (chrt etc.).

> 
> This helps me reducing the delay to 2ms. Not very fast, but much
> better than before.
I was not aware of that there was a userspace process involved.
setting that process to SCHED_RR too (together with the kernel thread when applicable)
is a good idea.

> Setting the priority doesn't have any effect by the way.
Yep, SCHED_RR or SCHED_FIFO will do.
> 
> Best regards
> Arno



More information about the linux-arm-kernel mailing list