diff options
Diffstat (limited to 'kernel/irq/manage.c')
| -rw-r--r-- | kernel/irq/manage.c | 17 | 
1 files changed, 9 insertions, 8 deletions
| diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index fa17855ca65..514bcfd855a 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -555,9 +555,9 @@ int can_request_irq(unsigned int irq, unsigned long irqflags)  		return 0;  	if (irq_settings_can_request(desc)) { -		if (desc->action) -			if (irqflags & desc->action->flags & IRQF_SHARED) -				canrequest =1; +		if (!desc->action || +		    irqflags & desc->action->flags & IRQF_SHARED) +			canrequest = 1;  	}  	irq_put_desc_unlock(desc, flags);  	return canrequest; @@ -840,9 +840,6 @@ static void irq_thread_dtor(struct callback_head *unused)  static int irq_thread(void *data)  {  	struct callback_head on_exit_work; -	static const struct sched_param param = { -		.sched_priority = MAX_USER_RT_PRIO/2, -	};  	struct irqaction *action = data;  	struct irq_desc *desc = irq_to_desc(action->irq);  	irqreturn_t (*handler_fn)(struct irq_desc *desc, @@ -854,8 +851,6 @@ static int irq_thread(void *data)  	else  		handler_fn = irq_thread_fn; -	sched_setscheduler(current, SCHED_FIFO, ¶m); -  	init_task_work(&on_exit_work, irq_thread_dtor);  	task_work_add(current, &on_exit_work, false); @@ -950,6 +945,9 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)  	 */  	if (new->thread_fn && !nested) {  		struct task_struct *t; +		static const struct sched_param param = { +			.sched_priority = MAX_USER_RT_PRIO/2, +		};  		t = kthread_create(irq_thread, new, "irq/%d-%s", irq,  				   new->name); @@ -957,6 +955,9 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)  			ret = PTR_ERR(t);  			goto out_mput;  		} + +		sched_setscheduler(t, SCHED_FIFO, ¶m); +  		/*  		 * We keep the reference to the task struct even if  		 * the thread dies to avoid that the interrupt code | 
