Skip to content

Commit cbfc995

Browse files
committed
improve: add load_next_descriptor
Add load_next_descriptor and use it in load_descriptor_chain. Signed-off-by: ihciah <[email protected]>
1 parent e7eee92 commit cbfc995

File tree

2 files changed

+40
-4
lines changed

2 files changed

+40
-4
lines changed

src/vmm/src/devices/virtio/iovec.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,11 @@ impl IoVecBuffer {
5757
/// The descriptor chain cannot be referencing the same memory location as another chain
5858
pub unsafe fn load_descriptor_chain(
5959
&mut self,
60-
head: DescriptorChain,
60+
mut desc: DescriptorChain,
6161
) -> Result<(), IoVecError> {
6262
self.clear();
6363

64-
let mut next_descriptor = Some(head);
65-
while let Some(desc) = next_descriptor {
64+
loop {
6665
if desc.is_write_only() {
6766
return Err(IoVecError::WriteOnlyDescriptor);
6867
}
@@ -85,7 +84,9 @@ impl IoVecBuffer {
8584
.checked_add(desc.len)
8685
.ok_or(IoVecError::OverflowedDescriptor)?;
8786

88-
next_descriptor = desc.next_descriptor();
87+
if desc.load_next_descriptor().is_none() {
88+
break;
89+
}
8990
}
9091

9192
Ok(())

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

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,41 @@ impl<'a, M: GuestMemory> DescriptorChain<'a, M> {
176176
None
177177
}
178178
}
179+
180+
/// Load the next descriptor in this descriptor chain.
181+
/// If none is available, return None.
182+
pub fn load_next_descriptor(&mut self) -> Option<()> {
183+
if !self.has_next() {
184+
return None;
185+
}
186+
if self.next >= self.queue_size {
187+
return None;
188+
}
189+
190+
let desc_head = self.desc_table.unchecked_add(u64::from(self.next) * 16);
191+
let desc = match self.mem.load_obj::<Descriptor>(desc_head) {
192+
Ok(ret) => ret,
193+
Err(err) => {
194+
error!(
195+
"Failed to read virtio descriptor from memory at address {:#x}: {}",
196+
desc_head.0, err
197+
);
198+
return None;
199+
}
200+
};
201+
self.index = self.next;
202+
self.addr = GuestAddress(desc.addr);
203+
self.len = desc.len;
204+
self.flags = desc.flags;
205+
self.next = desc.next;
206+
self.ttl -= 1;
207+
208+
if !self.is_valid() {
209+
return None;
210+
}
211+
212+
Some(())
213+
}
179214
}
180215

181216
#[derive(Debug)]

0 commit comments

Comments
 (0)