virtio-devices: Use SmallVec for descriptor chains

Rather than instantiating a vector for parsing the descriptor chain in
advance instead use a SmallVec bounded by the expected length of the
descriptor chain. This removes vector allocations from those paths.

As smallvec was already a block dependency move it to a workspace
dependency and use it from there.

Fixes: #5079

Signed-off-by: Rob Bradford <rbradford@meta.com>
This commit is contained in:
Rob Bradford
2026-07-07 09:14:23 +01:00
committed by Wei Liu
parent ba3cfd7d9d
commit ad3dbcd130
7 changed files with 12 additions and 6 deletions
+3 -2
View File
@@ -16,6 +16,7 @@ use log::{error, info, warn};
use seccompiler::SeccompAction;
use serde::{Deserialize, Serialize};
use serial_buffer::SerialBuffer;
use smallvec::SmallVec;
use thiserror::Error;
use virtio_queue::{Queue, QueueT};
use vm_memory::{ByteValued, Bytes, GuestAddressSpace, GuestMemoryAtomic};
@@ -205,7 +206,7 @@ impl ConsoleEpollHandler {
// Validate all descriptors upfront so we never partially fill
// buffers for a chain that turns out to be invalid.
let descs: Vec<_> = desc_chain
let descs: SmallVec<[_; 4]> = desc_chain
.checked_iter(self.access_platform.as_deref())
.collect::<Result<_, _>>()
.unwrap_or_default();
@@ -253,7 +254,7 @@ impl ConsoleEpollHandler {
let mut used_descs = false;
while let Some(mut desc_chain) = trans_queue.pop_descriptor_chain(self.mem.memory()) {
let results: Vec<_> = desc_chain
let results: SmallVec<[_; 4]> = desc_chain
.checked_iter(self.access_platform.as_deref())
.collect();
for result in results {