Skip to content

Commit 604d728

Browse files
committed
feat(queue): add discard_used method
Add `discard_used` method to discard last `n` used elements in the used ring by setting their `len` to 0. Signed-off-by: Egor Lazarchuk <[email protected]>
1 parent f4663dd commit 604d728

File tree

1 file changed

+15
-0
lines changed

1 file changed

+15
-0
lines changed

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,21 @@ impl Queue {
463463
self.set_used_ring_idx(self.next_used.0, mem);
464464
}
465465

466+
/// Discards last `n` descriptors by setting their len to 0.
467+
pub fn discard_used<M: GuestMemory>(&mut self, mem: &M, n: u16) {
468+
// `next_used` is pointing to the next descriptor index.
469+
// So we use range 1..n + 1 to get indexes of last n descriptors.
470+
for i in 1..n + 1 {
471+
let next_used_index = self.next_used - Wrapping(i);
472+
let mut used_element = self.read_used_ring(mem, next_used_index.0);
473+
used_element.len = 0;
474+
// SAFETY:
475+
// This should never panic as we only update len of the used_element.
476+
self.write_used_ring(mem, next_used_index.0, used_element)
477+
.unwrap();
478+
}
479+
}
480+
466481
/// Read used element from a used ring at specified index.
467482
#[inline(always)]
468483
pub fn read_used_ring<M: GuestMemory>(&self, mem: &M, index: u16) -> UsedElement {

0 commit comments

Comments
 (0)