include/linux/stop_machine.h
Source file repositories/reference/linux-study-clean/include/linux/stop_machine.h
File Facts
- System
- Linux kernel
- Corpus path
include/linux/stop_machine.h- Extension
.h- Size
- 6198 bytes
- Lines
- 191
- Domain
- Core OS
- Bucket
- Core Kernel Interface
- Inferred role
- Core OS: implementation source
- Status
- source 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.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/cpu.hlinux/cpumask_types.hlinux/smp.hlinux/list.hlinux/workqueue.h
Detected Declarations
struct cpu_stop_workstruct cpu_stop_workfunction stop_one_cpufunction stop_one_cpu_nowait_workfnfunction stop_one_cpu_nowaitfunction print_stop_infofunction stop_machine_cpuslockedfunction stop_machinefunction stop_machine_from_inactive_cpu
Annotated Snippet
struct cpu_stop_work {
struct list_head list; /* cpu_stopper->works */
cpu_stop_fn_t fn;
unsigned long caller;
void *arg;
struct cpu_stop_done *done;
};
int stop_one_cpu(unsigned int cpu, cpu_stop_fn_t fn, void *arg);
int stop_two_cpus(unsigned int cpu1, unsigned int cpu2, cpu_stop_fn_t fn, void *arg);
bool stop_one_cpu_nowait(unsigned int cpu, cpu_stop_fn_t fn, void *arg,
struct cpu_stop_work *work_buf);
void stop_machine_park(int cpu);
void stop_machine_unpark(int cpu);
void stop_machine_yield(const struct cpumask *cpumask);
extern void print_stop_info(const char *log_lvl, struct task_struct *task);
#else /* CONFIG_SMP */
#include <linux/workqueue.h>
struct cpu_stop_work {
struct work_struct work;
cpu_stop_fn_t fn;
void *arg;
};
static inline int stop_one_cpu(unsigned int cpu, cpu_stop_fn_t fn, void *arg)
{
int ret = -ENOENT;
preempt_disable();
if (cpu == smp_processor_id())
ret = fn(arg);
preempt_enable();
return ret;
}
static void stop_one_cpu_nowait_workfn(struct work_struct *work)
{
struct cpu_stop_work *stwork =
container_of(work, struct cpu_stop_work, work);
preempt_disable();
stwork->fn(stwork->arg);
preempt_enable();
}
static inline bool stop_one_cpu_nowait(unsigned int cpu,
cpu_stop_fn_t fn, void *arg,
struct cpu_stop_work *work_buf)
{
if (cpu == smp_processor_id()) {
INIT_WORK(&work_buf->work, stop_one_cpu_nowait_workfn);
work_buf->fn = fn;
work_buf->arg = arg;
schedule_work(&work_buf->work);
return true;
}
return false;
}
static inline void print_stop_info(const char *log_lvl, struct task_struct *task) { }
#endif /* CONFIG_SMP */
/*
* stop_machine "Bogolock": stop the entire machine, disable interrupts.
* This is a very heavy lock, which is equivalent to grabbing every raw
* spinlock (and more). So the "read" side to such a lock is anything
* which disables preemption.
*/
#if defined(CONFIG_SMP) || defined(CONFIG_HOTPLUG_CPU)
/**
* stop_machine: freeze the machine on all CPUs and run this function
* @fn: the function to run
* @data: the data ptr to pass to @fn()
* @cpus: the cpus to run @fn() on (NULL = one unspecified online CPU)
*
* Description: This causes a thread to be scheduled on every CPU, which
* will run with interrupts disabled. Each CPU specified by @cpus will
* run @fn. While @fn is executing, there will no other CPUs holding
* a raw spinlock or running within any other type of preempt-disabled
* region of code.
*
* When @cpus specifies only a single CPU, this can be thought of as
* a reader-writer lock where readers disable preemption (for example,
* by holding a raw spinlock) and where the insanely heavy writers run
* @fn while also preventing any other CPU from doing any useful work.
Annotation
- Immediate include surface: `linux/cpu.h`, `linux/cpumask_types.h`, `linux/smp.h`, `linux/list.h`, `linux/workqueue.h`.
- Detected declarations: `struct cpu_stop_work`, `struct cpu_stop_work`, `function stop_one_cpu`, `function stop_one_cpu_nowait_workfn`, `function stop_one_cpu_nowait`, `function print_stop_info`, `function stop_machine_cpuslocked`, `function stop_machine`, `function stop_machine_from_inactive_cpu`.
- Atlas domain: Core OS / Core Kernel Interface.
- Implementation status: source implementation candidate.
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.