Struct SGTable

Source
pub struct SGTable<T: Sealed = Borrowed> { /* private fields */ }
Expand description

A scatter-gather table.

This struct is a wrapper around the kernel’s struct sg_table. It manages a list of DMA-mapped memory segments that can be passed to a device for I/O operations.

The generic parameter T is used as a generic type to distinguish between owned and borrowed tables.

  • SGTable<Owned>: An owned table created and managed entirely by Rust code. It handles allocation, DMA mapping, and cleanup of all associated resources. See SGTable::new.
  • [SGTable<Borrowed>} (or simply SGTable): Represents a table whose lifetime is managed externally. It can be used safely via a borrowed reference &'a SGTable, where 'a is the external lifetime.

All SGTable variants can be iterated over the individual SGEntrys.

Implementations§

Source§

impl SGTable

Source

pub unsafe fn from_raw<'a>(ptr: *mut sg_table) -> &'a Self

Creates a borrowed &'a SGTable from a raw struct sg_table pointer.

This allows safe access to an sg_table that is managed elsewhere (for example, in C code).

§Safety

Callers must ensure that:

  • the struct sg_table pointed to by ptr is valid for the entire lifetime of 'a,
  • the data behind ptr is not modified concurrently for the duration of 'a.
Source

pub fn iter(&self) -> SGTableIter<'_>

Returns an SGTableIter bound to the lifetime of self.

Source§

impl<P> SGTable<Owned<P>>
where for<'a> P: AsPageIter<Iter<'a> = VmallocPageIter<'a>> + 'static,

Source

pub fn new( dev: &Device<Bound>, pages: P, dir: DataDirection, flags: Flags, ) -> impl PinInit<Self, Error> + '_

Allocates a new scatter-gather table from the given pages and maps it for DMA.

This constructor creates a new SGTable<Owned> that takes ownership of P. It allocates a struct sg_table, populates it with entries corresponding to the physical pages of P, and maps the table for DMA with the specified Device and dma::DataDirection.

The DMA mapping is managed through Devres, ensuring that the DMA mapping is unmapped once the associated Device is unbound, or when the SGTable<Owned> is dropped.

§Parameters
§Examples
use kernel::{
    device::{Bound, Device},
    dma, page,
    prelude::*,
    scatterlist::{SGTable, Owned},
};

fn test(dev: &Device<Bound>) -> Result {
    let size = 4 * page::PAGE_SIZE;
    let pages = VVec::<u8>::with_capacity(size, GFP_KERNEL)?;

    let sgt = KBox::pin_init(SGTable::new(
        dev,
        pages,
        dma::DataDirection::ToDevice,
        GFP_KERNEL,
    ), GFP_KERNEL)?;

    Ok(())
}

Trait Implementations§

Source§

impl<P> Deref for SGTable<Owned<P>>

Source§

type Target = SGTable

The resulting type after dereferencing.
Source§

fn deref(&self) -> &Self::Target

Dereferences the value.
Source§

impl<T: Sealed> HasPinData for SGTable<T>

Source§

type PinData = __ThePinData<T>

Source§

unsafe fn __pin_data() -> Self::PinData

Auto Trait Implementations§

§

impl<T> Freeze for SGTable<T>
where T: Freeze,

§

impl<T> RefUnwindSafe for SGTable<T>
where T: RefUnwindSafe,

§

impl<T> Send for SGTable<T>
where T: Send,

§

impl<T> Sync for SGTable<T>
where T: Sync,

§

impl<T> UnwindSafe for SGTable<T>
where T: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Init<T> for T

Source§

unsafe fn __init(self, slot: *mut T) -> Result<(), Infallible>

Initializes slot. Read more
Source§

fn chain<F>(self, f: F) -> ChainInit<Self, F, T, E>
where F: FnOnce(&mut T) -> Result<(), E>,

First initializes the value using self then calls the function f with the initialized value. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> PinInit<T> for T

Source§

unsafe fn __pinned_init(self, slot: *mut T) -> Result<(), Infallible>

Initializes slot. Read more
Source§

fn pin_chain<F>(self, f: F) -> ChainPinInit<Self, F, T, E>
where F: FnOnce(Pin<&mut T>) -> Result<(), E>,

First initializes the value using self then calls the function f with the initialized value. Read more
Source§

impl<P, T> Receiver for P
where P: Deref<Target = T> + ?Sized, T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.