On Tue, 27 Apr 2010, [UTF-8] Arve Hjønnevåg wrote: > +static void suspend_worker(struct work_struct *work) > +{ > + int ret; > + int entry_event_num; > + > + enable_suspend_blockers = true; > + while (!suspend_is_blocked()) { > + entry_event_num = current_event_num; > + > + if (debug_mask & DEBUG_SUSPEND) > + pr_info("suspend: enter suspend\n"); > + > + ret = pm_suspend(requested_suspend_state); > + > + if (debug_mask & DEBUG_EXIT_SUSPEND) > + pr_info_time("suspend: exit suspend, ret = %d ", ret); > + > + if (current_event_num == entry_event_num) > + pr_info("suspend: pm_suspend returned with no event\n"); > + } > + enable_suspend_blockers = false; > +} Here's a completely new issue. When using opportunistic suspends on an SMP system, it could happen that the system gets a wakeup event and this routine starts running again before the event's IRQ handler has finished (or has enabled a suspend blocker). The system would re-suspend too soon. Is there anything in the PM core that waits until all outstanding IRQs have been handled before unfreezing processes? If there is, I can't find it. Should such a thing be added? Alan Stern _______________________________________________ linux-pm mailing list linux-pm@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/linux-pm