30 lines · 1.1 KB · Rust
RawDownload
// 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) })}