RequestBuffers

Struct RequestBuffers 

Source
pub struct RequestBuffers<'a> { /* private fields */ }
Expand description

An accessor for guest memory associated with a storage IO request.

Wraps a single [PagedRange] — a contiguous byte range scattered across guest pages — together with a GuestMemory reference and a read/write direction flag.

§One range per RequestBuffers

Because PagedRange requires interior pages to be fully covered, a RequestBuffers can only describe memory regions where every page boundary between the first and last page is fully spanned. Two guest memory regions with arbitrary starting GPAs generally cannot be combined into one RequestBuffers.

When a device has multiple disjoint memory regions for a single IO (e.g., a virtio descriptor chain whose descriptors don’t align to page boundaries), options include:

  • Issue separate IOs per region (only valid if each region is sector-aligned)
  • Use a BounceBuffer to coalesce into one contiguous buffer
  • Use multiple RequestBuffers with a multi-range disk backend API (not currently available)

Implementations§

Source§

impl<'a> RequestBuffers<'a>

Source

pub fn new( guest_memory: &'a GuestMemory, range: PagedRange<'a>, is_write: bool, ) -> Self

Creates a new request buffer from the given memory ranges.

Source

pub fn is_empty(&self) -> bool

Returns true if the buffer is empty.

Source

pub fn len(&self) -> usize

Return the total length of the buffers in bytes.

Source

pub fn guest_memory(&self) -> &GuestMemory

Returns the guest memory accessor.

Source

pub fn range(&self) -> PagedRange<'_>

Return the internal paged range.

Source

pub fn is_aligned(&self, alignment: usize) -> bool

Returns whether the buffer is aligned to at least alignment bytes.

Checks three things (all must be multiples of alignment):

  1. The byte offset into the first page (range.offset())
  2. The total byte length (range.len())
  3. The page size (4096) — always true for alignment ≤ 4096

When this returns false, disk backends that require aligned buffers (e.g., those using O_DIRECT or io_uring) must use a BounceBuffer to perform the IO.

§Panics

Panics if alignment is not a power of two.

Source

pub fn writer(&self) -> impl MemoryWrite + '_

Gets a memory writer for the buffers.

Returns an empty writer if the buffers are only available for read access.

Source

pub fn reader(&self) -> impl MemoryRead + '_

Gets a memory reader for the buffers.

Source

pub fn lock(&self, for_write: bool) -> Result<LockedIoBuffers, AccessError>

Locks the guest memory ranges described by this buffer and returns an object containing IoBuffers, suitable for executing asynchronous I/O operations.

Source

pub fn subrange(&self, offset: usize, len: usize) -> Self

Returns a subrange of this set of buffers.

Panics if offset + len > self.len().

Trait Implementations§

Source§

impl<'a> Clone for RequestBuffers<'a>

Source§

fn clone(&self) -> RequestBuffers<'a>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<'a> Debug for RequestBuffers<'a>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<'a> Freeze for RequestBuffers<'a>

§

impl<'a> !RefUnwindSafe for RequestBuffers<'a>

§

impl<'a> Send for RequestBuffers<'a>

§

impl<'a> Sync for RequestBuffers<'a>

§

impl<'a> Unpin for RequestBuffers<'a>

§

impl<'a> !UnwindSafe for RequestBuffers<'a>

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. 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> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
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.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more