mirror of https://github.com/torvalds/linux.git
31 lines
1.1 KiB
Rust
31 lines
1.1 KiB
Rust
// 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) })
|
|
}
|