On this page

Suspend and Resume

Coverage: suspend-to-RAM (S3) → suspend-to-disk (S4/hibernate) → freeze (suspend-to-idle) → runtime PM → ACPI S-states → driver PM callbacks → debugging Kernel versions: 2.6 ~ 6.x

System Suspend States

suspend-to-idle (freeze / s2idle):
  Freeze user processes + devices enter low-power state + CPU idle
  → Power consumption: medium, Resume: fastest (~100ms)
  → Dependency: all devices and CPUs have good runtime PM support

suspend-to-RAM (S3 / deep):
  RAM self-refresh, CPU and most devices powered off
  → Power consumption: low (~1W), Resume: ~1-2 seconds
  → BIOS/UEFI ACPI S3 support

suspend-to-disk (S4 / hibernate):
  All RAM contents written to swap or file, full system power off
  → Power consumption: 0W, Resume: ~10-30 seconds (depends on RAM size and disk speed)
  → Kernel resume: read swap image back to RAM → resume execution

Suspend-to-RAM Detailed Flow

Suspend-to-RAM (S3): Suspend 4 steps → S3 sleep → Resume 4 steps echo mem > /sys/power/state · kernel/power/suspend.c · pm_suspend() ① Freeze user processes freeze_processes() ② Suspend devices dpm_suspend() ③ Disable non-boot CPUs disable_nonboot_cpus() ④ syscore + enter S3 acpi_suspend_enter() The system is now in S3 — RAM self-refresh, CPU/devices powered off, waiting for wake-up source Wake-up trigger: RTC alarm / Lid open / Key press ⑤ CPU reset and boot →BIOS→resume path ⑥ CPU + devices resume Reverse order resume ⑦ Unfreeze user processes ⑧ Return to user space Continue on next line of echo mem All 8 steps are completed in kernel mode; user processes are frozen from ① to unfrozen at ⑦, and cannot hold any locks during this period. During S3, RAM self-refreshes, CPU/devices are powered off, with power consumption as low as ~1W; wake-up takes about 1–2 seconds, depending on BIOS/UEFI ACPI S3 support.

Hibernate (Suspend-to-Disk)

Suspend-to-Disk (S4/Hibernate): Write to disk → Power off → Cold boot read back echo disk > /sys/power/state · kernel/power/hibernate.c · hibernate() ① Freeze processes + devices ② Create memory snapshot Traverse physical pages → write to swap ③ Write metadata Page mapping, kernel state ④ Suspend devices again → shutdown power off The system is powered off — wait for next boot, triggered by resume= kernel parameter to read back Cold boot from disk, enter resume path ⑤ resume=/dev/sda2 kernel parameter ⑥ swsusp_check() Read signature ⑦ swsusp_read() snapshot → RAM ⑧ Restore kernel state Jump to saved execution point After writing all RAM contents to swap, the entire system powers off, reducing power consumption to 0W; only used pages are written, skipping idle and page cache. Next boot relies on the resume= kernel parameter to trigger read-back, with wake-up taking about 10–30 seconds, depending on RAM size and disk speed.

Runtime PM: Device-level Power Management

// drivers/base/power/runtime.c
// Each device can be independently suspended/resumed (does not affect other devices and processes)

// Automatic suspend conditions:
//   - Device idle for more than autosuspend_delay_ms
//   - No references (pm_runtime_get/put)
//   - Driver supports runtime_suspend/runtime_resume

// PCIe: runtime D3hot (powered off but PCIe link maintained)
// USB: selective suspend (suspend individual USB devices)

Debugging

# Supported suspend states
cat /sys/power/state          # freeze mem disk

# Suspend/resume tracing
echo 1 > /sys/power/pm_trace  # Track faulty devices via RTC hash
dmesg | grep -i "PM: suspend" # Suspend/resume logs

# Which device is blocking suspend
cat /sys/power/pm_wakeup_irq  # Last wake-up IRQ
dmesg | grep -i "wakeup"      # Wake-up sources

# Analyze suspend/resume latency
echo 1 > /sys/kernel/debug/tracing/events/power/suspend_resume/enable
cat trace_pipe

References

  • Source code: kernel/power/suspend.c, kernel/power/hibernate.c, drivers/base/power/, drivers/acpi/sleep.c
  • Kernel documentation: Documentation/admin-guide/pm/sleep-states.rst, Documentation/power/runtime_pm.rst

Keywords: suspend, hibernate, freeze, s2idle, S3, S4, runtime PM, pm_wakeup, ACPI