| @@ -1248,6 +1248,31 @@ static void irq_wake_secondary(struct irq_desc *desc, struct irqaction *action) · 1247 unmodified lines |
| 1248 | 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 | 1277 | * Interrupt handler thread |
| 1253 | 1278 | */ |
| @@ -1259,6 +1284,8 @@ static int irq_thread(void *data) · 5 unmodified lines |
| 1259 | 1284 | irqreturn_t (*handler_fn)(struct irq_desc *desc, |
| 1260 | 1285 | struct irqaction *action); |
| 1261 | 1286 | |
| 1287 | + irq_thread_set_ready(desc, action); |
| 1288 | + |
| 1262 | 1289 | sched_set_fifo(current); |
| 1263 | 1290 | |
| 1264 | 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 | 1712 | if (!shared) { |
| 1686 | | − init_waitqueue_head(&desc->wait_for_threads); |
| 1687 | | − |
| 1688 | 1713 | /* Setup the type (level, edge polarity) if configured: */ |
| 1689 | 1714 | if (new->flags & IRQF_TRIGGER_MASK) { |
| 1690 | 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 | 1806 | irq_setup_timings(desc, new); |
| 1782 | 1807 | |
| 1783 | | − /* |
| 1784 | | − * Strictly no need to wake it up, but hung_task complains |
| 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); |
| 1808 | + wake_up_and_wait_for_irq_thread_ready(desc, new); |
| 1809 | + wake_up_and_wait_for_irq_thread_ready(desc, new->secondary); |
| 1791 | 1810 | |
| 1792 | 1811 | register_irq_proc(irq, desc); |
| 1793 | 1812 | new->dir = NULL; |