Skip to content

Commit 4936aac

Browse files
authored
Merge pull request #1732 from Gelbpunkt/smallvec-vecdeque
perf(virtqueue): Use smallvec for UsedDeviceWritableBuffer
2 parents b9dc3b3 + 472eca1 commit 4936aac

File tree

1 file changed

+17
-8
lines changed
  • src/drivers/virtio/virtqueue

1 file changed

+17
-8
lines changed

src/drivers/virtio/virtqueue/mod.rs

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ pub mod packed;
1313
pub mod split;
1414

1515
use alloc::boxed::Box;
16-
use alloc::collections::vec_deque::VecDeque;
1716
use alloc::vec::Vec;
1817
use core::any::Any;
1918
use core::mem::MaybeUninit;
@@ -402,7 +401,7 @@ pub struct AvailBufferToken {
402401
}
403402

404403
pub(crate) struct UsedDeviceWritableBuffer {
405-
elems: VecDeque<BufferElem>,
404+
elems: SmallVec<[BufferElem; 2]>,
406405
remaining_written_len: u32,
407406
}
408407

@@ -415,26 +414,35 @@ impl UsedDeviceWritableBuffer {
415414
return None;
416415
}
417416

418-
let elem = self.elems.pop_front()?;
417+
// May panic, but we have written data remaining so there should always be an item
418+
let elem = self.elems.remove(0);
419+
419420
if let BufferElem::Sized(sized) = elem {
420421
match sized.downcast::<MaybeUninit<T>>() {
421422
Ok(cast) => {
422423
self.remaining_written_len -= u32::try_from(size_of::<T>()).unwrap();
423424
Some(unsafe { cast.assume_init() })
424425
}
425426
Err(sized) => {
426-
self.elems.push_front(BufferElem::Sized(sized));
427+
// Unlikely and wrong usage, we should not optimize for this case
428+
self.elems.insert(0, BufferElem::Sized(sized));
427429
None
428430
}
429431
}
430432
} else {
431-
self.elems.push_front(elem);
433+
// Unlikely and wrong usage, we should not optimize for this case
434+
self.elems.insert(0, elem);
432435
None
433436
}
434437
}
435438

436439
pub fn pop_front_vec(&mut self) -> Option<Vec<u8, DeviceAlloc>> {
437-
let elem = self.elems.pop_front()?;
440+
if self.elems.is_empty() {
441+
return None;
442+
}
443+
444+
let elem = self.elems.remove(0);
445+
438446
if let BufferElem::Vector(mut vector) = elem {
439447
let new_len = u32::min(
440448
vector.capacity().try_into().unwrap(),
@@ -444,7 +452,8 @@ impl UsedDeviceWritableBuffer {
444452
unsafe { vector.set_len(new_len.try_into().unwrap()) };
445453
Some(vector)
446454
} else {
447-
self.elems.push_front(elem);
455+
// Unlikely and wrong usage, we should not optimize for this case
456+
self.elems.insert(0, elem);
448457
None
449458
}
450459
}
@@ -460,7 +469,7 @@ impl UsedBufferToken {
460469
Self {
461470
send_buff: tkn.send_buff,
462471
used_recv_buff: UsedDeviceWritableBuffer {
463-
elems: tkn.recv_buff.into_vec().into(),
472+
elems: tkn.recv_buff,
464473
remaining_written_len: written_len,
465474
},
466475
}

0 commit comments

Comments
 (0)