Skip to content

Commit 0f88fc8

Browse files
committed
feat(queue): split internals of add_used into 2 separate methods
Split `add_used` internals into 2 new functions: `write_used_element` and `advance_used_ring`. This will be used in next commits to optimize RX path of net device. Signed-off-by: Egor Lazarchuk <[email protected]>
1 parent 574301f commit 0f88fc8

File tree

1 file changed

+20
-5
lines changed

1 file changed

+20
-5
lines changed

src/vmm/src/devices/virtio/queue.rs

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -574,8 +574,13 @@ impl Queue {
574574
self.next_avail -= Wrapping(1);
575575
}
576576

577-
/// Puts an available descriptor head into the used ring for use by the guest.
578-
pub fn add_used(&mut self, desc_index: u16, len: u32) -> Result<(), QueueError> {
577+
/// Write used element into used_ring ring.
578+
pub fn write_used_element(
579+
&mut self,
580+
ring_index: u16,
581+
desc_index: u16,
582+
len: u32,
583+
) -> Result<(), QueueError> {
579584
if self.actual_size() <= desc_index {
580585
error!(
581586
"attempted to add out of bounds descriptor to used ring: {}",
@@ -584,7 +589,7 @@ impl Queue {
584589
return Err(QueueError::DescIndexOutOfBounds(desc_index));
585590
}
586591

587-
let next_used = self.next_used.0 % self.actual_size();
592+
let next_used = ring_index % self.actual_size();
588593
let used_element = UsedElement {
589594
id: u32::from(desc_index),
590595
len,
@@ -594,14 +599,24 @@ impl Queue {
594599
unsafe {
595600
self.used_ring_ring_set(usize::from(next_used), used_element);
596601
}
602+
Ok(())
603+
}
597604

598-
self.num_added += Wrapping(1);
599-
self.next_used += Wrapping(1);
605+
/// Advance queue and used ring by `n` elements.
606+
pub fn advance_used_ring(&mut self, n: u16) {
607+
self.num_added += Wrapping(n);
608+
self.next_used += Wrapping(n);
600609

601610
// This fence ensures all descriptor writes are visible before the index update is.
602611
fence(Ordering::Release);
603612

604613
self.used_ring_idx_set(self.next_used.0);
614+
}
615+
616+
/// Puts an available descriptor head into the used ring for use by the guest.
617+
pub fn add_used(&mut self, desc_index: u16, len: u32) -> Result<(), QueueError> {
618+
self.write_used_element(self.next_used.0, desc_index, len)?;
619+
self.advance_used_ring(1);
605620
Ok(())
606621
}
607622

0 commit comments

Comments
 (0)