diff options
Diffstat (limited to 'kernel/irq/manage.c')
| -rw-r--r-- | kernel/irq/manage.c | 9 | 
1 files changed, 6 insertions, 3 deletions
| diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 67ce837ae52c..a9a9dbe49fea 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -623,8 +623,9 @@ static irqreturn_t irq_nested_primary_handler(int irq, void *dev_id)  static int irq_wait_for_interrupt(struct irqaction *action)  { +	set_current_state(TASK_INTERRUPTIBLE); +  	while (!kthread_should_stop()) { -		set_current_state(TASK_INTERRUPTIBLE);  		if (test_and_clear_bit(IRQTF_RUNTHREAD,  				       &action->thread_flags)) { @@ -632,7 +633,9 @@ static int irq_wait_for_interrupt(struct irqaction *action)  			return 0;  		}  		schedule(); +		set_current_state(TASK_INTERRUPTIBLE);  	} +	__set_current_state(TASK_RUNNING);  	return -1;  } @@ -1289,7 +1292,7 @@ EXPORT_SYMBOL(free_irq);   *	and to set up the interrupt handler in the right order.   *   *	If you want to set up a threaded irq handler for your device - *	then you need to supply @handler and @thread_fn. @handler ist + *	then you need to supply @handler and @thread_fn. @handler is   *	still called in hard interrupt context and has to check   *	whether the interrupt originates from the device. If yes it   *	needs to disable the interrupt on the device and return @@ -1596,7 +1599,7 @@ int request_percpu_irq(unsigned int irq, irq_handler_t handler,  		return -ENOMEM;  	action->handler = handler; -	action->flags = IRQF_PERCPU; +	action->flags = IRQF_PERCPU | IRQF_NO_SUSPEND;  	action->name = devname;  	action->percpu_dev_id = dev_id; | 
