Skip to content

Commit c6ceb46

Browse files
committed
refactor: replace read_obj in the descriptor chain creation
`read_obj` takes too much time and we don't need it's checks as we do them before the actual reading happens. Replace it with either `get_slice` or `get_host_address`. Signed-off-by: Egor Lazarchuk <[email protected]>
1 parent 634907e commit c6ceb46

File tree

1 file changed

+16
-12
lines changed

1 file changed

+16
-12
lines changed

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

+16-12
Original file line numberDiff line numberDiff line change
@@ -109,17 +109,16 @@ impl<'a, M: GuestMemory> DescriptorChain<'a, M> {
109109
let desc_head = mem.checked_offset(desc_table, (index as usize) * 16)?;
110110
mem.checked_offset(desc_head, 16)?;
111111

112-
// These reads can't fail unless Guest memory is hopelessly broken.
113-
let desc = match mem.read_obj::<Descriptor>(desc_head) {
114-
Ok(ret) => ret,
115-
Err(err) => {
116-
error!(
117-
"Failed to read virtio descriptor from memory at address {:#x}: {}",
118-
desc_head.0, err
119-
);
120-
return None;
121-
}
122-
};
112+
// SAFETY:
113+
// This can't fail as we checked the `desc_head`
114+
let ptr = mem.get_host_address(desc_head).unwrap();
115+
116+
// SAFETY:
117+
// Safe as we know that `ptr` is inside guest memory and
118+
// following `std::mem::size_of::<Descriptor>` bytes belong
119+
// to the descriptor table
120+
let desc: &Descriptor = unsafe { &*ptr.cast::<Descriptor>() };
121+
123122
let chain = DescriptorChain {
124123
mem,
125124
desc_table,
@@ -423,7 +422,12 @@ impl Queue {
423422
// SAFETY:
424423
// `desc_index_address` param is bounded by size of the queue as `avail_idx` is
425424
// modded by `actual_size()`.
426-
let desc_index: u16 = mem.read_obj(desc_index_address).unwrap();
425+
let slice = mem
426+
.get_slice(desc_index_address, std::mem::size_of::<u16>())
427+
.unwrap();
428+
// SAFETY:
429+
// We transforming valid memory slice
430+
let desc_index = unsafe { *slice.ptr_guard().as_ptr().cast::<u16>() };
427431

428432
DescriptorChain::checked_new(mem, self.desc_table, self.actual_size(), desc_index)
429433
}

0 commit comments

Comments
 (0)