diff options
Diffstat (limited to 'kernel/irq/manage.c')
| -rw-r--r-- | kernel/irq/manage.c | 19 | 
1 files changed, 11 insertions, 8 deletions
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index c0730ad8a11..0fa3ce998ec 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -780,7 +780,7 @@ static int irq_thread(void *data)  		handler_fn = irq_thread_fn;  	sched_setscheduler(current, SCHED_FIFO, ¶m); -	current->irqaction = action; +	current->irq_thread = 1;  	while (!irq_wait_for_interrupt(action)) { @@ -818,10 +818,10 @@ static int irq_thread(void *data)  	irq_finalize_oneshot(desc, action, true);  	/* -	 * Clear irqaction. Otherwise exit_irq_thread() would make +	 * Clear irq_thread. Otherwise exit_irq_thread() would make  	 * fuzz about an active irq thread going into nirvana.  	 */ -	current->irqaction = NULL; +	current->irq_thread = 0;  	return 0;  } @@ -832,27 +832,30 @@ void exit_irq_thread(void)  {  	struct task_struct *tsk = current;  	struct irq_desc *desc; +	struct irqaction *action; -	if (!tsk->irqaction) +	if (!tsk->irq_thread)  		return; +	action = kthread_data(tsk); +  	printk(KERN_ERR  	       "exiting task \"%s\" (%d) is an active IRQ thread (irq %d)\n", -	       tsk->comm ? tsk->comm : "", tsk->pid, tsk->irqaction->irq); +	       tsk->comm ? tsk->comm : "", tsk->pid, action->irq); -	desc = irq_to_desc(tsk->irqaction->irq); +	desc = irq_to_desc(action->irq);  	/*  	 * Prevent a stale desc->threads_oneshot. Must be called  	 * before setting the IRQTF_DIED flag.  	 */ -	irq_finalize_oneshot(desc, tsk->irqaction, true); +	irq_finalize_oneshot(desc, action, true);  	/*  	 * Set the THREAD DIED flag to prevent further wakeups of the  	 * soon to be gone threaded handler.  	 */ -	set_bit(IRQTF_DIED, &tsk->irqaction->flags); +	set_bit(IRQTF_DIED, &action->flags);  }  static void irq_setup_forced_threading(struct irqaction *new)  |