kernel/power/suspend.c
Source file repositories/reference/linux-study-clean/kernel/power/suspend.c
File Facts
- System
- Linux kernel
- Corpus path
kernel/power/suspend.c- Extension
.c- Size
- 16484 bytes
- Lines
- 650
- Domain
- Core OS
- Bucket
- Scheduler, Processes, Timers, Sync, And Syscalls
- Inferred role
- Core OS: exported/initcall integration point
- Status
- integration implementation candidate
Why This File Exists
Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.
- Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/string.hlinux/delay.hlinux/errno.hlinux/init.hlinux/console.hlinux/cpu.hlinux/cpuidle.hlinux/gfp.hlinux/io.hlinux/kernel.hlinux/list.hlinux/mm.hlinux/slab.hlinux/export.hlinux/suspend.hlinux/syscore_ops.hlinux/swait.hlinux/ftrace.htrace/events/power.hlinux/compiler.hlinux/moduleparam.hlinux/fs.hpower.h
Detected Declarations
function pm_suspend_default_s2idlefunction s2idle_set_opsfunction s2idle_beginfunction s2idle_enterfunction s2idle_loopfunction s2idle_wakefunction valid_statefunction pm_states_initfunction mem_sleep_default_setupfunction suspend_set_opsfunction suspend_valid_only_memfunction sleep_state_supportedfunction platform_suspend_preparefunction platform_suspend_prepare_latefunction platform_suspend_prepare_noirqfunction platform_resume_noirqfunction platform_resume_earlyfunction platform_resume_finishfunction platform_suspend_beginfunction platform_resume_endfunction platform_recoverfunction platform_suspend_againfunction suspend_testfunction enteredfunction arch_suspend_disable_irqsfunction arch_suspend_enable_irqsfunction suspend_enterfunction suspend_devices_and_enterfunction suspend_finishfunction enter_statefunction enter_stateexport pm_suspend_target_stateexport pm_suspend_global_flagsexport pm_suspend_default_s2idleexport s2idle_wakeexport suspend_set_opsexport suspend_valid_only_memexport pm_suspend
Annotated Snippet
if (s2idle_ops && s2idle_ops->wake) {
if (s2idle_ops->wake())
break;
} else if (pm_wakeup_pending()) {
break;
}
if (s2idle_ops && s2idle_ops->check)
s2idle_ops->check();
s2idle_enter();
}
pm_pr_dbg("resume from suspend-to-idle\n");
}
void s2idle_wake(void)
{
unsigned long flags;
raw_spin_lock_irqsave(&s2idle_lock, flags);
if (s2idle_state > S2IDLE_STATE_NONE) {
s2idle_state = S2IDLE_STATE_WAKE;
swake_up_one(&s2idle_wait_head);
}
raw_spin_unlock_irqrestore(&s2idle_lock, flags);
}
EXPORT_SYMBOL_GPL(s2idle_wake);
static bool valid_state(suspend_state_t state)
{
/*
* The PM_SUSPEND_STANDBY and PM_SUSPEND_MEM states require low-level
* support and need to be valid to the low-level implementation.
*
* No ->valid() or ->enter() callback implies that none are valid.
*/
return suspend_ops && suspend_ops->valid && suspend_ops->valid(state) &&
suspend_ops->enter;
}
void __init pm_states_init(void)
{
/* "mem" and "freeze" are always present in /sys/power/state. */
pm_states[PM_SUSPEND_MEM] = pm_labels[PM_SUSPEND_MEM];
pm_states[PM_SUSPEND_TO_IDLE] = pm_labels[PM_SUSPEND_TO_IDLE];
/*
* Suspend-to-idle should be supported even without any suspend_ops,
* initialize mem_sleep_states[] accordingly here.
*/
mem_sleep_states[PM_SUSPEND_TO_IDLE] = mem_sleep_labels[PM_SUSPEND_TO_IDLE];
}
static int __init mem_sleep_default_setup(char *str)
{
suspend_state_t state;
for (state = PM_SUSPEND_TO_IDLE; state <= PM_SUSPEND_MEM; state++)
if (mem_sleep_labels[state] &&
!strcmp(str, mem_sleep_labels[state])) {
mem_sleep_default = state;
mem_sleep_current = state;
break;
}
return 1;
}
__setup("mem_sleep_default=", mem_sleep_default_setup);
/**
* suspend_set_ops - Set the global suspend method table.
* @ops: Suspend operations to use.
*/
void suspend_set_ops(const struct platform_suspend_ops *ops)
{
unsigned int sleep_flags;
sleep_flags = lock_system_sleep();
suspend_ops = ops;
if (valid_state(PM_SUSPEND_STANDBY)) {
mem_sleep_states[PM_SUSPEND_STANDBY] = mem_sleep_labels[PM_SUSPEND_STANDBY];
pm_states[PM_SUSPEND_STANDBY] = pm_labels[PM_SUSPEND_STANDBY];
if (mem_sleep_default == PM_SUSPEND_STANDBY)
mem_sleep_current = PM_SUSPEND_STANDBY;
}
if (valid_state(PM_SUSPEND_MEM)) {
mem_sleep_states[PM_SUSPEND_MEM] = mem_sleep_labels[PM_SUSPEND_MEM];
if (mem_sleep_default >= PM_SUSPEND_MEM)
Annotation
- Immediate include surface: `linux/string.h`, `linux/delay.h`, `linux/errno.h`, `linux/init.h`, `linux/console.h`, `linux/cpu.h`, `linux/cpuidle.h`, `linux/gfp.h`.
- Detected declarations: `function pm_suspend_default_s2idle`, `function s2idle_set_ops`, `function s2idle_begin`, `function s2idle_enter`, `function s2idle_loop`, `function s2idle_wake`, `function valid_state`, `function pm_states_init`, `function mem_sleep_default_setup`, `function suspend_set_ops`.
- Atlas domain: Core OS / Scheduler, Processes, Timers, Sync, And Syscalls.
- Implementation status: integration implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.