diff options
Diffstat (limited to 'kernel/irq/manage.c')
-rw-r--r-- | kernel/irq/manage.c | 9 |
1 files changed, 4 insertions, 5 deletions
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 591cfe901162..123a227d3357 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c | |||
@@ -1025,10 +1025,7 @@ static int irq_thread(void *data) | |||
1025 | * This is the regular exit path. __free_irq() is stopping the | 1025 | * This is the regular exit path. __free_irq() is stopping the |
1026 | * thread via kthread_stop() after calling | 1026 | * thread via kthread_stop() after calling |
1027 | * synchronize_irq(). So neither IRQTF_RUNTHREAD nor the | 1027 | * synchronize_irq(). So neither IRQTF_RUNTHREAD nor the |
1028 | * oneshot mask bit can be set. We cannot verify that as we | 1028 | * oneshot mask bit can be set. |
1029 | * cannot touch the oneshot mask at this point anymore as | ||
1030 | * __setup_irq() might have given out currents thread_mask | ||
1031 | * again. | ||
1032 | */ | 1029 | */ |
1033 | task_work_cancel(current, irq_thread_dtor); | 1030 | task_work_cancel(current, irq_thread_dtor); |
1034 | return 0; | 1031 | return 0; |
@@ -1245,7 +1242,9 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new) | |||
1245 | /* | 1242 | /* |
1246 | * Protects against a concurrent __free_irq() call which might wait | 1243 | * Protects against a concurrent __free_irq() call which might wait |
1247 | * for synchronize_irq() to complete without holding the optional | 1244 | * for synchronize_irq() to complete without holding the optional |
1248 | * chip bus lock and desc->lock. | 1245 | * chip bus lock and desc->lock. Also protects against handing out |
1246 | * a recycled oneshot thread_mask bit while it's still in use by | ||
1247 | * its previous owner. | ||
1249 | */ | 1248 | */ |
1250 | mutex_lock(&desc->request_mutex); | 1249 | mutex_lock(&desc->request_mutex); |
1251 | 1250 | ||