• Rafael J. Wysocki's avatar
    ACPI: sleep: Avoid breaking S3 wakeup due to might_sleep() · 22db0633
    Rafael J. Wysocki authored
    The addition of might_sleep() to down_timeout() caused the latter to
    enable interrupts unconditionally in some cases, which in turn broke
    the ACPI S3 wakeup path in acpi_suspend_enter(), where down_timeout()
    is called by acpi_disable_all_gpes() via acpi_ut_acquire_mutex().
    
    Namely, if CONFIG_DEBUG_ATOMIC_SLEEP is set, might_sleep() causes
    might_resched() to be used and if CONFIG_PREEMPT_VOLUNTARY is set,
    this triggers __cond_resched() which may call preempt_schedule_common(),
    so __schedule() gets invoked and it ends up with enabled interrupts (in
    the prev == next case).
    
    Now, enabling interrupts early in the S3 wakeup path causes the kernel
    to crash.
    
    Address this by modifying acpi_suspend_enter() to disable GPEs without
    attempting to acquire the sleeping lock which is not needed in that code
    path anyway.
    
    Fixes: 99409b93 ("locking/semaphore: Add might_sleep() to down_*() family")
    Reported-by: default avatarSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    Acked-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: 5.15+ <stable@vger.kernel.org> # 5.15+
    22db0633
sleep.c 27.7 KB