summaryrefslogtreecommitdiff
path: root/rust/kernel/cpu.rs
diff options
context:
space:
mode:
authorJani Nikula <jani.nikula@intel.com>2025-06-09 12:40:46 +0300
committerJani Nikula <jani.nikula@intel.com>2025-06-09 12:40:46 +0300
commit34c55367af96f62e89221444f04487440ebc6487 (patch)
treefdb36ba67d7dea09455b55037e26043b7e051ef9 /rust/kernel/cpu.rs
parent7247efca0dcbc8ac6147db9200ed1549c0662465 (diff)
parent19272b37aa4f83ca52bdf9c16d5d81bdd1354494 (diff)
Merge drm/drm-next into drm-intel-next
Sync to v6.16-rc1, among other things to get the fixed size GENMASK_U*() and BIT_U*() macros. Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Diffstat (limited to 'rust/kernel/cpu.rs')
-rw-r--r--rust/kernel/cpu.rs30
1 files changed, 30 insertions, 0 deletions
diff --git a/rust/kernel/cpu.rs b/rust/kernel/cpu.rs
new file mode 100644
index 000000000000..10c5c3b25873
--- /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) })
+}