diff options
author | Viresh Kumar <viresh.kumar@linaro.org> | 2025-05-20 11:24:12 +0530 |
---|---|---|
committer | Viresh Kumar <viresh.kumar@linaro.org> | 2025-05-20 11:24:12 +0530 |
commit | c410aabd0321468b6569f31931aa32ddc5897ca9 (patch) | |
tree | 6eaa0c4b230076bf6d71c8c1ae873c4506fc9c23 /rust/kernel/cpu.rs | |
parent | a374f28700abd20e8a7d026f89aa26f759445918 (diff) | |
parent | 06149d8f2216894cee86106c701d13141948f159 (diff) |
Merge branch 'rust/cpufreq-dt' into cpufreq/arm/linux-next
Diffstat (limited to 'rust/kernel/cpu.rs')
-rw-r--r-- | rust/kernel/cpu.rs | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/rust/kernel/cpu.rs b/rust/kernel/cpu.rs new file mode 100644 index 0000000000000..10c5c3b258734 --- /dev/null +++ b/rust/kernel/cpu.rs @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! Generic CPU definitions. +//! +//! C header: [`include/linux/cpu.h`](srctree/include/linux/cpu.h) + +use crate::{bindings, device::Device, error::Result, prelude::ENODEV}; + +/// Creates a new instance of CPU's device. +/// +/// # Safety +/// +/// Reference counting is not implemented for the CPU device in the C code. When a CPU is +/// hot-unplugged, the corresponding CPU device is unregistered, but its associated memory +/// is not freed. +/// +/// Callers must ensure that the CPU device is not used after it has been unregistered. +/// This can be achieved, for example, by registering a CPU hotplug notifier and removing +/// any references to the CPU device within the notifier's callback. +pub unsafe fn from_cpu(cpu: u32) -> Result<&'static Device> { + // SAFETY: It is safe to call `get_cpu_device()` for any CPU. + let ptr = unsafe { bindings::get_cpu_device(cpu) }; + if ptr.is_null() { + return Err(ENODEV); + } + + // SAFETY: The pointer returned by `get_cpu_device()`, if not `NULL`, is a valid pointer to + // a `struct device` and is never freed by the C code. + Ok(unsafe { Device::as_ref(ptr) }) +} |