Skip to content

Commit be7802c

Browse files
committed
misc: Stop using deprecated functions from vm-memory crate
See: rust-vmm/vm-memory#247 Signed-off-by: Bo Chen <[email protected]>
1 parent 7928369 commit be7802c

File tree

8 files changed

+78
-49
lines changed

8 files changed

+78
-49
lines changed

arch/src/aarch64/uefi.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
// Copyright 2020 Arm Limited (or its affiliates). All rights reserved.
22

33
use std::io::{Read, Seek, SeekFrom};
4+
use std::os::fd::AsFd;
45
use std::result;
5-
use vm_memory::{Bytes, GuestAddress, GuestMemory};
6+
use vm_memory::{GuestAddress, GuestMemory};
67

78
/// Errors thrown while loading UEFI binary
89
#[derive(Debug)]
@@ -24,7 +25,7 @@ pub fn load_uefi<F, M: GuestMemory>(
2425
uefi_image: &mut F,
2526
) -> Result<()>
2627
where
27-
F: Read + Seek,
28+
F: Read + Seek + AsFd,
2829
{
2930
let uefi_size = uefi_image
3031
.seek(SeekFrom::End(0))
@@ -36,6 +37,6 @@ where
3637
}
3738
uefi_image.rewind().map_err(|_| Error::SeekUefiStart)?;
3839
guest_mem
39-
.read_exact_from(guest_addr, uefi_image, uefi_size)
40+
.read_exact_volatile_from(guest_addr, &mut uefi_image.as_fd(), uefi_size)
4041
.map_err(|_| Error::ReadUefiImage)
4142
}

arch/src/x86_64/mptable.rs

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ use crate::layout::{APIC_START, HIGH_RAM_START, IOAPIC_START};
99
use crate::x86_64::mpspec;
1010
use crate::GuestMemoryMmap;
1111
use libc::c_char;
12-
use std::io;
1312
use std::mem;
1413
use std::result;
1514
use std::slice;
@@ -154,7 +153,7 @@ pub fn setup_mptable(offset: GuestAddress, mem: &GuestMemoryMmap, num_cpus: u8)
154153
return Err(Error::AddressOverflow);
155154
}
156155

157-
mem.read_exact_from(base_mp, &mut io::repeat(0), mp_size)
156+
mem.read_exact_volatile_from(base_mp, &mut vec![0; mp_size].as_slice(), mp_size)
158157
.map_err(Error::Clear)?;
159158

160159
{
@@ -291,7 +290,10 @@ pub fn setup_mptable(offset: GuestAddress, mem: &GuestMemoryMmap, num_cpus: u8)
291290
mod tests {
292291
use super::*;
293292
use crate::layout::MPTABLE_START;
294-
use vm_memory::{GuestAddress, GuestUsize};
293+
use vm_memory::{
294+
bitmap::BitmapSlice, GuestAddress, GuestUsize, VolatileMemoryError, VolatileSlice,
295+
WriteVolatile,
296+
};
295297

296298
fn table_entry_size(type_: u8) -> usize {
297299
match type_ as u32 {
@@ -351,20 +353,24 @@ mod tests {
351353
let mpc_table: MpcTableWrapper = mem.read_obj(mpc_offset).unwrap();
352354

353355
struct Sum(u8);
354-
impl io::Write for Sum {
355-
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
356-
for v in buf.iter() {
356+
impl WriteVolatile for Sum {
357+
fn write_volatile<B: BitmapSlice>(
358+
&mut self,
359+
buf: &VolatileSlice<B>,
360+
) -> result::Result<usize, VolatileMemoryError> {
361+
let mut tmp = vec![0u8; buf.len()];
362+
tmp.write_all_volatile(buf)?;
363+
364+
for v in tmp.iter() {
357365
self.0 = self.0.wrapping_add(*v);
358366
}
367+
359368
Ok(buf.len())
360369
}
361-
fn flush(&mut self) -> io::Result<()> {
362-
Ok(())
363-
}
364370
}
365371

366372
let mut sum = Sum(0);
367-
mem.write_to(mpc_offset, &mut sum, mpc_table.0.length as usize)
373+
mem.write_volatile_to(mpc_offset, &mut sum, mpc_table.0.length as usize)
368374
.unwrap();
369375
assert_eq!(sum.0, 0);
370376
}

block/src/lib.rs

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -143,10 +143,14 @@ pub enum ExecuteError {
143143
Flush(io::Error),
144144
#[error("Failed to read: {0}")]
145145
Read(GuestMemoryError),
146+
#[error("Failed to read_exact: {0}")]
147+
ReadExact(io::Error),
146148
#[error("Failed to seek: {0}")]
147149
Seek(io::Error),
148150
#[error("Failed to write: {0}")]
149151
Write(GuestMemoryError),
152+
#[error("Failed to write_all: {0}")]
153+
WriteAll(io::Error),
150154
#[error("Unsupported request: {0}")]
151155
Unsupported(u32),
152156
#[error("Failed to submit io uring: {0}")]
@@ -169,8 +173,10 @@ impl ExecuteError {
169173
ExecuteError::BadRequest(_) => VIRTIO_BLK_S_IOERR,
170174
ExecuteError::Flush(_) => VIRTIO_BLK_S_IOERR,
171175
ExecuteError::Read(_) => VIRTIO_BLK_S_IOERR,
176+
ExecuteError::ReadExact(_) => VIRTIO_BLK_S_IOERR,
172177
ExecuteError::Seek(_) => VIRTIO_BLK_S_IOERR,
173178
ExecuteError::Write(_) => VIRTIO_BLK_S_IOERR,
179+
ExecuteError::WriteAll(_) => VIRTIO_BLK_S_IOERR,
174180
ExecuteError::Unsupported(_) => VIRTIO_BLK_S_UNSUPP,
175181
ExecuteError::SubmitIoUring(_) => VIRTIO_BLK_S_IOERR,
176182
ExecuteError::GetHostAddress(_) => VIRTIO_BLK_S_IOERR,
@@ -351,13 +357,23 @@ impl Request {
351357

352358
match self.request_type {
353359
RequestType::In => {
354-
mem.read_exact_from(*data_addr, disk, *data_len as usize)
355-
.map_err(ExecuteError::Read)?;
360+
let mut buf = vec![0u8; *data_len as usize];
361+
buf.shrink_to_fit();
362+
disk.read_exact(&mut buf).map_err(ExecuteError::ReadExact)?;
363+
mem.read_exact_volatile_from(
364+
*data_addr,
365+
&mut buf.as_slice(),
366+
*data_len as usize,
367+
)
368+
.map_err(ExecuteError::Read)?;
356369
len += data_len;
357370
}
358371
RequestType::Out => {
359-
mem.write_all_to(*data_addr, disk, *data_len as usize)
372+
let mut buf = vec![0u8; *data_len as usize];
373+
buf.shrink_to_fit();
374+
mem.write_all_volatile_to(*data_addr, &mut buf, *data_len as usize)
360375
.map_err(ExecuteError::Write)?;
376+
disk.write_all(&buf).map_err(ExecuteError::WriteAll)?;
361377
if !self.writeback {
362378
disk.flush().map_err(ExecuteError::Flush)?;
363379
}

virtio-devices/src/console.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ use thiserror::Error;
2828
use versionize::{VersionMap, Versionize, VersionizeResult};
2929
use versionize_derive::Versionize;
3030
use virtio_queue::{Queue, QueueT};
31-
use vm_memory::{ByteValued, Bytes, GuestAddressSpace, GuestMemoryAtomic};
31+
use vm_memory::{ByteValued, Bytes, GuestAddressSpace, GuestMemory, GuestMemoryAtomic};
3232
use vm_migration::VersionMapped;
3333
use vm_migration::{Migratable, MigratableError, Pausable, Snapshot, Snapshottable, Transportable};
3434
use vm_virtio::{AccessPlatform, Translatable};
@@ -59,6 +59,8 @@ enum Error {
5959
GuestMemoryRead(vm_memory::guest_memory::Error),
6060
#[error("Failed to write to guest memory: {0}")]
6161
GuestMemoryWrite(vm_memory::guest_memory::Error),
62+
#[error("Failed to write_all output: {0}")]
63+
OutputWriteAll(io::Error),
6264
#[error("Failed to flush output: {0}")]
6365
OutputFlush(io::Error),
6466
#[error("Failed to add used index: {0}")]
@@ -264,15 +266,20 @@ impl ConsoleEpollHandler {
264266
while let Some(mut desc_chain) = trans_queue.pop_descriptor_chain(self.mem.memory()) {
265267
let desc = desc_chain.next().ok_or(Error::DescriptorChainTooShort)?;
266268
if let Some(out) = &mut self.out {
269+
let mut buf = vec![0u8; desc.len() as usize];
270+
buf.shrink_to_fit();
271+
267272
desc_chain
268273
.memory()
269-
.write_to(
274+
.write_volatile_to(
270275
desc.addr()
271276
.translate_gva(self.access_platform.as_ref(), desc.len() as usize),
272-
out,
277+
&mut buf,
273278
desc.len() as usize,
274279
)
275280
.map_err(Error::GuestMemoryRead)?;
281+
282+
out.write_all(&buf).map_err(Error::OutputWriteAll)?;
276283
out.flush().map_err(Error::OutputFlush)?;
277284
}
278285
trans_queue

virtio-devices/src/rng.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ use thiserror::Error;
2424
use versionize::{VersionMap, Versionize, VersionizeResult};
2525
use versionize_derive::Versionize;
2626
use virtio_queue::{Queue, QueueT};
27-
use vm_memory::{Bytes, GuestAddressSpace, GuestMemoryAtomic};
27+
use vm_memory::{GuestAddressSpace, GuestMemory, GuestMemoryAtomic};
2828
use vm_migration::VersionMapped;
2929
use vm_migration::{Migratable, MigratableError, Pausable, Snapshot, Snapshottable, Transportable};
3030
use vm_virtio::{AccessPlatform, Translatable};
@@ -75,7 +75,7 @@ impl RngEpollHandler {
7575
// Fill the read with data from the random device on the host.
7676
let len = desc_chain
7777
.memory()
78-
.read_from(
78+
.read_volatile_from(
7979
desc.addr()
8080
.translate_gva(self.access_platform.as_ref(), desc.len() as usize),
8181
&mut self.random_file,

vmm/src/lib.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ use std::{result, thread};
5151
use thiserror::Error;
5252
use tracer::trace_scoped;
5353
use vm_memory::bitmap::AtomicBitmap;
54+
use vm_memory::{ReadVolatile, WriteVolatile};
5455
use vm_migration::{protocol::*, Migratable};
5556
use vm_migration::{MigratableError, Pausable, Snapshot, Snapshottable, Transportable};
5657
use vmm_sys_util::eventfd::EventFd;
@@ -1449,7 +1450,7 @@ impl Vmm {
14491450
memory_manager: &mut MemoryManager,
14501451
) -> std::result::Result<(), MigratableError>
14511452
where
1452-
T: Read + Write,
1453+
T: Read + ReadVolatile + Write,
14531454
{
14541455
// Read table
14551456
let table = MemoryRangeTable::read_from(socket, req.length())?;
@@ -1608,7 +1609,7 @@ impl Vmm {
16081609
socket: &mut T,
16091610
) -> result::Result<bool, MigratableError>
16101611
where
1611-
T: Read + Write,
1612+
T: Read + Write + WriteVolatile,
16121613
{
16131614
// Send (dirty) memory table
16141615
let table = vm.dirty_log()?;

vmm/src/memory_manager.rs

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,10 @@ use std::collections::HashMap;
3030
use std::convert::TryInto;
3131
use std::ffi;
3232
use std::fs::{File, OpenOptions};
33-
use std::io::{self, Read};
33+
use std::io::{self};
3434
use std::ops::{BitAnd, Deref, Not, Sub};
35+
#[cfg(all(target_arch = "x86_64", feature = "guest_debug"))]
36+
use std::os::fd::AsFd;
3537
use std::os::unix::io::{AsRawFd, FromRawFd, RawFd};
3638
use std::path::PathBuf;
3739
use std::result;
@@ -47,8 +49,9 @@ use vm_device::BusDevice;
4749
use vm_memory::bitmap::AtomicBitmap;
4850
use vm_memory::guest_memory::FileOffset;
4951
use vm_memory::{
50-
mmap::MmapRegionError, Address, Bytes, Error as MmapError, GuestAddress, GuestAddressSpace,
52+
mmap::MmapRegionError, Address, Error as MmapError, GuestAddress, GuestAddressSpace,
5153
GuestMemory, GuestMemoryAtomic, GuestMemoryError, GuestMemoryRegion, GuestUsize, MmapRegion,
54+
ReadVolatile,
5255
};
5356
use vm_migration::{
5457
protocol::MemoryRange, protocol::MemoryRangeTable, Migratable, MigratableError, Pausable,
@@ -728,7 +731,7 @@ impl MemoryManager {
728731
// see: https://github.com/rust-vmm/vm-memory/issues/174
729732
loop {
730733
let bytes_read = guest_memory
731-
.read_from(
734+
.read_volatile_from(
732735
GuestAddress(range.gpa + offset),
733736
&mut memory_file,
734737
(range.length - offset) as usize,
@@ -2084,7 +2087,7 @@ impl MemoryManager {
20842087
return Ok(());
20852088
}
20862089

2087-
let mut coredump_file = dump_state.file.as_ref().unwrap();
2090+
let coredump_file = dump_state.file.as_ref().unwrap();
20882091

20892092
let guest_memory = self.guest_memory.memory();
20902093
let mut total_bytes: u64 = 0;
@@ -2093,9 +2096,9 @@ impl MemoryManager {
20932096
let mut offset: u64 = 0;
20942097
loop {
20952098
let bytes_written = guest_memory
2096-
.write_to(
2099+
.write_volatile_to(
20972100
GuestAddress(range.gpa + offset),
2098-
&mut coredump_file,
2101+
&mut coredump_file.as_fd(),
20992102
(range.length - offset) as usize,
21002103
)
21012104
.map_err(|e| GuestDebuggableError::Coredump(e.into()))?;
@@ -2118,7 +2121,7 @@ impl MemoryManager {
21182121
fd: &mut F,
21192122
) -> std::result::Result<(), MigratableError>
21202123
where
2121-
F: Read,
2124+
F: ReadVolatile,
21222125
{
21232126
let guest_memory = self.guest_memory();
21242127
let mem = guest_memory.memory();
@@ -2132,7 +2135,7 @@ impl MemoryManager {
21322135
// see: https://github.com/rust-vmm/vm-memory/issues/174
21332136
loop {
21342137
let bytes_read = mem
2135-
.read_from(
2138+
.read_volatile_from(
21362139
GuestAddress(range.gpa + offset),
21372140
fd,
21382141
(range.length - offset) as usize,
@@ -2600,7 +2603,7 @@ impl Transportable for MemoryManager {
26002603
// see: https://github.com/rust-vmm/vm-memory/issues/174
26012604
loop {
26022605
let bytes_written = guest_memory
2603-
.write_to(
2606+
.write_volatile_to(
26042607
GuestAddress(range.gpa + offset),
26052608
&mut memory_file,
26062609
(range.length - offset) as usize,

vmm/src/vm.rs

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,6 @@ use std::collections::HashMap;
7272
use std::convert::TryInto;
7373
use std::fs::{File, OpenOptions};
7474
use std::io::{self, Seek, SeekFrom, Write};
75-
#[cfg(feature = "tdx")]
76-
use std::mem;
7775
#[cfg(all(target_arch = "x86_64", feature = "guest_debug"))]
7876
use std::mem::size_of;
7977
use std::num::Wrapping;
@@ -86,8 +84,10 @@ use thiserror::Error;
8684
use tracer::trace_scoped;
8785
use vm_device::Bus;
8886
#[cfg(feature = "tdx")]
89-
use vm_memory::{Address, ByteValued, GuestMemory, GuestMemoryRegion};
90-
use vm_memory::{Bytes, GuestAddress, GuestAddressSpace, GuestMemoryAtomic};
87+
use vm_memory::{Address, ByteValued, GuestMemoryRegion, ReadVolatile};
88+
use vm_memory::{
89+
Bytes, GuestAddress, GuestAddressSpace, GuestMemory, GuestMemoryAtomic, WriteVolatile,
90+
};
9191
use vm_migration::protocol::{Request, Response, Status};
9292
use vm_migration::{
9393
protocol::MemoryRangeTable, snapshot_from_id, Migratable, MigratableError, Pausable, Snapshot,
@@ -884,7 +884,7 @@ impl Vm {
884884
}
885885

886886
fn load_initramfs(&mut self, guest_mem: &GuestMemoryMmap) -> Result<arch::InitramfsConfig> {
887-
let mut initramfs = self.initramfs.as_ref().unwrap();
887+
let initramfs = self.initramfs.as_mut().unwrap();
888888
let size: usize = initramfs
889889
.seek(SeekFrom::End(0))
890890
.map_err(|_| Error::InitramfsLoad)?
@@ -897,7 +897,7 @@ impl Vm {
897897
let address = GuestAddress(address);
898898

899899
guest_mem
900-
.read_from(address, &mut initramfs, size)
900+
.read_volatile_from(address, initramfs, size)
901901
.map_err(|_| Error::InitramfsLoad)?;
902902

903903
info!("Initramfs loaded: address = 0x{:x}", address.0);
@@ -1744,7 +1744,7 @@ impl Vm {
17441744
firmware_file
17451745
.seek(SeekFrom::Start(section.data_offset as u64))
17461746
.map_err(Error::LoadTdvf)?;
1747-
mem.read_from(
1747+
mem.read_volatile_from(
17481748
GuestAddress(section.address),
17491749
&mut firmware_file,
17501750
section.data_size as usize,
@@ -1766,13 +1766,8 @@ impl Vm {
17661766
.map_err(Error::LoadPayload)?;
17671767

17681768
let mut payload_header = linux_loader::bootparam::setup_header::default();
1769-
payload_header
1770-
.as_bytes()
1771-
.read_from(
1772-
0,
1773-
payload_file,
1774-
mem::size_of::<linux_loader::bootparam::setup_header>(),
1775-
)
1769+
payload_file
1770+
.read_volatile(&mut payload_header.as_bytes())
17761771
.unwrap();
17771772

17781773
if payload_header.header != 0x5372_6448 {
@@ -1786,7 +1781,7 @@ impl Vm {
17861781
}
17871782

17881783
payload_file.rewind().map_err(Error::LoadPayload)?;
1789-
mem.read_from(
1784+
mem.read_volatile_from(
17901785
GuestAddress(section.address),
17911786
payload_file,
17921787
payload_size as usize,
@@ -2129,7 +2124,7 @@ impl Vm {
21292124
fd: &mut F,
21302125
) -> std::result::Result<(), MigratableError>
21312126
where
2132-
F: Write,
2127+
F: WriteVolatile,
21332128
{
21342129
let guest_memory = self.memory_manager.lock().as_ref().unwrap().guest_memory();
21352130
let mem = guest_memory.memory();
@@ -2143,7 +2138,7 @@ impl Vm {
21432138
// see: https://github.com/rust-vmm/vm-memory/issues/174
21442139
loop {
21452140
let bytes_written = mem
2146-
.write_to(
2141+
.write_volatile_to(
21472142
GuestAddress(range.gpa + offset),
21482143
fd,
21492144
(range.length - offset) as usize,

0 commit comments

Comments
 (0)