diff options
| -rw-r--r-- | include/linux/sched.h | 10 | ||||
| -rw-r--r-- | kernel/irq/manage.c | 19 | 
2 files changed, 16 insertions, 13 deletions
diff --git a/include/linux/sched.h b/include/linux/sched.h index 7d379a6bfd8..07f537a371c 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -1319,6 +1319,11 @@ struct task_struct {  	unsigned sched_reset_on_fork:1;  	unsigned sched_contributes_to_load:1; +#ifdef CONFIG_GENERIC_HARDIRQS +	/* IRQ handler threads */ +	unsigned irq_thread:1; +#endif +  	pid_t pid;  	pid_t tgid; @@ -1427,11 +1432,6 @@ struct task_struct {   * mempolicy */  	spinlock_t alloc_lock; -#ifdef CONFIG_GENERIC_HARDIRQS -	/* IRQ handler threads */ -	struct irqaction *irqaction; -#endif -  	/* Protection of the PI data structures: */  	raw_spinlock_t pi_lock; 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)  |