| @@ -1248,6 +1248,31 @@ static void irq_wake_secondary(struct irq_desc *desc, struct irqaction *action) · 1247 unmodified lines |
| 1248 | raw_spin_unlock_irq(&desc->lock); | 1248 | raw_spin_unlock_irq(&desc->lock); |
| 1249 | } | 1249 | } |
| 1250 | | 1250 | |
| | 1251 | /* |
| | 1252 | * Internal function to notify that a interrupt thread is ready. |
| | 1253 | */ |
| | 1254 | static void irq_thread_set_ready(struct irq_desc *desc, |
| | 1255 | struct irqaction *action) |
| | 1256 | { |
| | 1257 | set_bit(IRQTF_READY, &action->thread_flags); |
| | 1258 | wake_up(&desc->wait_for_threads); |
| | 1259 | } |
| | 1260 | |
| | 1261 | /* |
| | 1262 | * Internal function to wake up a interrupt thread and wait until it is |
| | 1263 | * ready. |
| | 1264 | */ |
| | 1265 | static void wake_up_and_wait_for_irq_thread_ready(struct irq_desc *desc, |
| | 1266 | struct irqaction *action) |
| | 1267 | { |
| | 1268 | if (!action || !action->thread) |
| | 1269 | return; |
| | 1270 | |
| | 1271 | wake_up_process(action->thread); |
| | 1272 | wait_event(desc->wait_for_threads, |
| | 1273 | test_bit(IRQTF_READY, &action->thread_flags)); |
| | 1274 | } |
| | 1275 | |
| 1251 | /* | 1276 | /* |
| 1252 | * Interrupt handler thread | 1277 | * Interrupt handler thread |
| 1253 | */ | 1278 | */ |
| @@ -1259,6 +1284,8 @@ static int irq_thread(void *data) · 5 unmodified lines |
| 1259 | irqreturn_t (*handler_fn)(struct irq_desc *desc, | 1284 | irqreturn_t (*handler_fn)(struct irq_desc *desc, |
| 1260 | struct irqaction *action); | 1285 | struct irqaction *action); |
| 1261 | | 1286 | |
| | 1287 | irq_thread_set_ready(desc, action); |
| | 1288 | |
| 1262 | sched_set_fifo(current); | 1289 | sched_set_fifo(current); |
| 1263 | | 1290 | |
| 1264 | if (force_irqthreads() && test_bit(IRQTF_FORCED_THREAD, | 1291 | if (force_irqthreads() && test_bit(IRQTF_FORCED_THREAD, |
| @@ -1683,8 +1710,6 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new) · 418 unmodified lines |
| 1683 | } | 1710 | } |
| 1684 | | 1711 | |
| 1685 | if (!shared) { | 1712 | if (!shared) { |
| 1686 | init_waitqueue_head(&desc->wait_for_threads); | | |
| 1687 | | | |
| 1688 | /* Setup the type (level, edge polarity) if configured: */ | 1713 | /* Setup the type (level, edge polarity) if configured: */ |
| 1689 | if (new->flags & IRQF_TRIGGER_MASK) { | 1714 | if (new->flags & IRQF_TRIGGER_MASK) { |
| 1690 | ret = __irq_set_trigger(desc, | 1715 | ret = __irq_set_trigger(desc, |
| @@ -1780,14 +1805,8 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new) · 89 unmodified lines |
| 1780 | | 1805 | |
| 1781 | irq_setup_timings(desc, new); | 1806 | irq_setup_timings(desc, new); |
| 1782 | | 1807 | |
| 1783 | /* | 1808 | wake_up_and_wait_for_irq_thread_ready(desc, new); |
| 1784 | * Strictly no need to wake it up, but hung_task complains | 1809 | wake_up_and_wait_for_irq_thread_ready(desc, new->secondary); |
| 1785 | * when no hard interrupt wakes the thread up. | | |
| 1786 | */ | | |
| 1787 | if (new->thread) | | |
| 1788 | wake_up_process(new->thread); | | |
| 1789 | if (new->secondary) | | |
| 1790 | wake_up_process(new->secondary->thread); | | |
| 1791 | | 1810 | |
| 1792 | register_irq_proc(irq, desc); | 1811 | register_irq_proc(irq, desc); |
| 1793 | new->dir = NULL; | 1812 | new->dir = NULL; |