rust/kernel/io/resource.rs
Source file repositories/reference/linux-study-clean/rust/kernel/io/resource.rs
File Facts
- System
- Linux kernel
- Corpus path
rust/kernel/io/resource.rs- Extension
.rs- Size
- 6935 bytes
- Lines
- 236
- Domain
- Rust Kernel Layer
- Bucket
- Rust API Membrane
- Inferred role
- Rust Kernel Layer: implementation source
- Status
- source implementation candidate
Why This File Exists
Rust-side wrappers and abstractions around kernel C APIs, ownership contracts, allocation, synchronization, and module integration.
- Rust-side wrappers and abstractions around kernel C APIs, ownership contracts, allocation, synchronization, and module integration.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
- No C-style include directives detected by the generator.
Detected Declarations
function deref
Annotated Snippet
fn drop(&mut self) {
let (flags, start, size) = {
let res = &**self;
(res.flags(), res.start(), res.size())
};
let release_fn = if flags.contains(Flags::IORESOURCE_MEM) {
bindings::release_mem_region
} else {
bindings::release_region
};
// SAFETY: Safe as per the invariant of `Region`.
unsafe { release_fn(start, size) };
}
}
// SAFETY: `Region` only holds a pointer to a C `struct resource`, which is safe to be used from
// any thread.
unsafe impl Send for Region {}
// SAFETY: `Region` only holds a pointer to a C `struct resource`, references to which are
// safe to be used from any thread.
unsafe impl Sync for Region {}
/// A resource abstraction.
///
/// # Invariants
///
/// [`Resource`] is a transparent wrapper around a valid `bindings::resource`.
#[repr(transparent)]
pub struct Resource(Opaque<bindings::resource>);
impl Resource {
/// Creates a reference to a [`Resource`] from a valid pointer.
///
/// # Safety
///
/// The caller must ensure that for the duration of 'a, the pointer will
/// point at a valid `bindings::resource`.
///
/// The caller must also ensure that the [`Resource`] is only accessed via the
/// returned reference for the duration of 'a.
pub(crate) const unsafe fn from_raw<'a>(ptr: *mut bindings::resource) -> &'a Self {
// SAFETY: Self is a transparent wrapper around `Opaque<bindings::resource>`.
unsafe { &*ptr.cast() }
}
/// Requests a resource region.
///
/// Exclusive access will be given and the region will be marked as busy.
/// Further calls to [`Self::request_region`] will return [`None`] if
/// the region, or a part of it, is already in use.
pub fn request_region(
&self,
start: PhysAddr,
size: ResourceSize,
name: CString,
flags: Flags,
) -> Option<Region> {
// SAFETY:
// - Safe as per the invariant of `Resource`.
// - `__request_region` will store a reference to the name, but that is
// safe as we own it and it will not be dropped until the `Region` is
// dropped.
let region = unsafe {
bindings::__request_region(
self.0.get(),
start,
size,
name.as_char_ptr(),
flags.0 as c_int,
)
};
Some(Region {
resource: NonNull::new(region)?,
_name: name,
})
}
/// Returns the size of the resource.
pub fn size(&self) -> ResourceSize {
let inner = self.0.get();
// SAFETY: Safe as per the invariants of `Resource`.
unsafe { bindings::resource_size(inner) }
}
/// Returns the start address of the resource.
pub fn start(&self) -> PhysAddr {
Annotation
- Detected declarations: `function deref`.
- Atlas domain: Rust Kernel Layer / Rust API Membrane.
- 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.