diff options
author | Harshavardhan Unnibhavi <harshanavkis@gmail.com> | 2021-06-30 16:38:58 +0200 |
---|---|---|
committer | Sergio Lopez <slp@sinrega.org> | 2021-07-07 14:30:54 +0200 |
commit | 39a98eaa80c5ef29e85f07ea12bb088fb0b40d39 (patch) | |
tree | be841faed79df01b126ba323d30e432a9dd95017 | |
parent | b273fd9f1ea4a89021e0a0b7af7e887dfa46d8b0 (diff) | |
download | vmm_vhost-39a98eaa80c5ef29e85f07ea12bb088fb0b40d39.tar.gz |
Inflight I/O: Packed virtqueues queue regions
Signed-off-by: Harshavardhan Unnibhavi <harshanavkis@gmail.com>
-rw-r--r-- | src/vhost_user/message.rs | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/src/vhost_user/message.rs b/src/vhost_user/message.rs index 1381fe9..76feca2 100644 --- a/src/vhost_user/message.rs +++ b/src/vhost_user/message.rs @@ -837,6 +837,95 @@ impl QueueRegionSplit { } } +/// Inflight I/O descriptor state for packed virtqueues +#[repr(packed)] +#[derive(Clone, Copy)] +struct DescStatePacked { + /// Indicate whether this descriptor (only head) is inflight or not. + inflight: u8, + /// Padding + padding: u8, + /// Link to next free entry + next: u16, + /// Link to last entry of descriptor list, only for head + last: u16, + /// Length of descriptor list, only for head + num: u16, + /// Preserve order of fetching avail descriptors, only for head + counter: u64, + /// Buffer ID + id: u16, + /// Descriptor flags + flags: u16, + /// Buffer length + len: u32, + /// Buffer address + addr: u64, +} + +impl DescStatePacked { + fn new() -> Self { + DescStatePacked { + inflight: 0, + padding: 0, + next: 0, + last: 0, + num: 0, + counter: 0, + id: 0, + flags: 0, + len: 0, + addr: 0, + } + } +} + +/// Inflight I/O queue region for packed virtqueues +#[allow(safe_packed_borrows)] +#[repr(packed)] +struct QueueRegionPacked { + /// Features flags of this region + features: u64, + /// version of this region + version: u16, + /// size of descriptor state array + desc_num: u16, + /// head of free DescStatePacked entry list + free_head: u16, + /// old head of free DescStatePacked entry list + old_free_head: u16, + /// used idx of descriptor ring + used_idx: u16, + /// old used idx of descriptor ring + old_used_idx: u16, + /// device ring wrap counter + used_wrap_counter: u8, + /// old device ring wrap counter + old_used_wrap_counter: u8, + /// Padding + padding: [u8; 7], + /// Pointer to array tracking state of each descriptor from descriptor ring + desc: u64, +} + +impl QueueRegionPacked { + fn new(features: u64, queue_size: u16) -> Self { + QueueRegionPacked { + features, + version: 1, + desc_num: queue_size, + free_head: 0, + old_free_head: 0, + used_idx: 0, + old_used_idx: 0, + used_wrap_counter: 0, + old_used_wrap_counter: 0, + padding: [0; 7], + desc: 0, + } + } +} + #[cfg(test)] mod tests { use super::*; |