mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2024-12-23 06:05:21 +00:00
vmm: Fix map_err losing the inner error
Signed-off-by: Sebastien Boeuf <sebastien.boeuf@intel.com>
This commit is contained in:
parent
0a7bcc9a7d
commit
148a9ed5ce
@ -109,7 +109,7 @@ pub enum Error {
|
|||||||
VcpuUnhandledKvmExit,
|
VcpuUnhandledKvmExit,
|
||||||
|
|
||||||
/// Failed to join on vCPU threads
|
/// Failed to join on vCPU threads
|
||||||
ThreadCleanup,
|
ThreadCleanup(std::boxed::Box<dyn std::any::Any + std::marker::Send>),
|
||||||
|
|
||||||
/// Cannot add legacy device to Bus.
|
/// Cannot add legacy device to Bus.
|
||||||
BusError(devices::BusError),
|
BusError(devices::BusError),
|
||||||
@ -478,7 +478,7 @@ impl VcpuState {
|
|||||||
|
|
||||||
fn join_thread(&mut self) -> Result<()> {
|
fn join_thread(&mut self) -> Result<()> {
|
||||||
if let Some(handle) = self.handle.take() {
|
if let Some(handle) = self.handle.take() {
|
||||||
handle.join().map_err(|_| Error::ThreadCleanup)?
|
handle.join().map_err(Error::ThreadCleanup)?
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -78,6 +78,9 @@ pub enum Error {
|
|||||||
|
|
||||||
/// The requested hotplug memory addition is not a valid size
|
/// The requested hotplug memory addition is not a valid size
|
||||||
InvalidSize,
|
InvalidSize,
|
||||||
|
|
||||||
|
/// Failed to set the user memory region.
|
||||||
|
SetUserMemoryRegion(kvm_ioctls::Error),
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_host_cpu_phys_bits() -> u8 {
|
pub fn get_host_cpu_phys_bits() -> u8 {
|
||||||
@ -411,12 +414,8 @@ impl MemoryManager {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Safe because the guest regions are guaranteed not to overlap.
|
// Safe because the guest regions are guaranteed not to overlap.
|
||||||
unsafe {
|
unsafe { self.fd.set_user_memory_region(mem_region) }
|
||||||
self.fd
|
.map_err(Error::SetUserMemoryRegion)?;
|
||||||
.set_user_memory_region(mem_region)
|
|
||||||
.map_err(|e| io::Error::from_raw_os_error(e.errno()))
|
|
||||||
}
|
|
||||||
.map_err(|_: io::Error| Error::GuestMemory(MmapError::NoMemoryRegion))?;
|
|
||||||
|
|
||||||
// Mark the pages as mergeable if explicitly asked for.
|
// Mark the pages as mergeable if explicitly asked for.
|
||||||
if mergeable {
|
if mergeable {
|
||||||
|
@ -78,7 +78,16 @@ pub enum Error {
|
|||||||
KernelLoad(linux_loader::loader::Error),
|
KernelLoad(linux_loader::loader::Error),
|
||||||
|
|
||||||
/// Cannot load the command line in memory
|
/// Cannot load the command line in memory
|
||||||
CmdLine,
|
LoadCmdLine(linux_loader::loader::Error),
|
||||||
|
|
||||||
|
/// Cannot modify the command line
|
||||||
|
CmdLineInsertStr(linux_loader::cmdline::Error),
|
||||||
|
|
||||||
|
/// Cannot convert command line into CString
|
||||||
|
CmdLineCString(std::ffi::NulError),
|
||||||
|
|
||||||
|
/// Cannot configure system
|
||||||
|
ConfigureSystem(arch::Error),
|
||||||
|
|
||||||
PoisonedState,
|
PoisonedState,
|
||||||
|
|
||||||
@ -110,7 +119,7 @@ pub enum Error {
|
|||||||
SignalHandlerSpawn(io::Error),
|
SignalHandlerSpawn(io::Error),
|
||||||
|
|
||||||
/// Failed to join on vCPU threads
|
/// Failed to join on vCPU threads
|
||||||
ThreadCleanup,
|
ThreadCleanup(std::boxed::Box<dyn std::any::Any + std::marker::Send>),
|
||||||
|
|
||||||
/// Failed to create a new KVM instance
|
/// Failed to create a new KVM instance
|
||||||
KvmNew(kvm_ioctls::Error),
|
KvmNew(kvm_ioctls::Error),
|
||||||
@ -363,12 +372,12 @@ impl Vm {
|
|||||||
let mut cmdline = Cmdline::new(arch::CMDLINE_MAX_SIZE);
|
let mut cmdline = Cmdline::new(arch::CMDLINE_MAX_SIZE);
|
||||||
cmdline
|
cmdline
|
||||||
.insert_str(self.config.lock().unwrap().cmdline.args.clone())
|
.insert_str(self.config.lock().unwrap().cmdline.args.clone())
|
||||||
.map_err(|_| Error::CmdLine)?;
|
.map_err(Error::CmdLineInsertStr)?;
|
||||||
for entry in self.devices.cmdline_additions() {
|
for entry in self.devices.cmdline_additions() {
|
||||||
cmdline.insert_str(entry).map_err(|_| Error::CmdLine)?;
|
cmdline.insert_str(entry).map_err(Error::CmdLineInsertStr)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
let cmdline_cstring = CString::new(cmdline).map_err(|_| Error::CmdLine)?;
|
let cmdline_cstring = CString::new(cmdline).map_err(Error::CmdLineCString)?;
|
||||||
let guest_memory = self.memory_manager.lock().as_ref().unwrap().guest_memory();
|
let guest_memory = self.memory_manager.lock().as_ref().unwrap().guest_memory();
|
||||||
let mem = guest_memory.load_full();
|
let mem = guest_memory.load_full();
|
||||||
let entry_addr = match linux_loader::loader::Elf::load(
|
let entry_addr = match linux_loader::loader::Elf::load(
|
||||||
@ -395,7 +404,7 @@ impl Vm {
|
|||||||
arch::layout::CMDLINE_START,
|
arch::layout::CMDLINE_START,
|
||||||
&cmdline_cstring,
|
&cmdline_cstring,
|
||||||
)
|
)
|
||||||
.map_err(|_| Error::CmdLine)?;
|
.map_err(Error::LoadCmdLine)?;
|
||||||
let boot_vcpus = self.cpu_manager.lock().unwrap().boot_vcpus();
|
let boot_vcpus = self.cpu_manager.lock().unwrap().boot_vcpus();
|
||||||
let _max_vcpus = self.cpu_manager.lock().unwrap().max_vcpus();
|
let _max_vcpus = self.cpu_manager.lock().unwrap().max_vcpus();
|
||||||
|
|
||||||
@ -422,7 +431,7 @@ impl Vm {
|
|||||||
Some(hdr),
|
Some(hdr),
|
||||||
rsdp_addr,
|
rsdp_addr,
|
||||||
)
|
)
|
||||||
.map_err(|_| Error::CmdLine)?;
|
.map_err(Error::ConfigureSystem)?;
|
||||||
|
|
||||||
let load_addr = entry_addr
|
let load_addr = entry_addr
|
||||||
.kernel_load
|
.kernel_load
|
||||||
@ -441,7 +450,7 @@ impl Vm {
|
|||||||
None,
|
None,
|
||||||
rsdp_addr,
|
rsdp_addr,
|
||||||
)
|
)
|
||||||
.map_err(|_| Error::CmdLine)?;
|
.map_err(Error::ConfigureSystem)?;
|
||||||
|
|
||||||
Ok(entry_addr.kernel_load)
|
Ok(entry_addr.kernel_load)
|
||||||
}
|
}
|
||||||
@ -476,7 +485,7 @@ impl Vm {
|
|||||||
|
|
||||||
// Wait for all the threads to finish
|
// Wait for all the threads to finish
|
||||||
for thread in self.threads.drain(..) {
|
for thread in self.threads.drain(..) {
|
||||||
thread.join().map_err(|_| Error::ThreadCleanup)?
|
thread.join().map_err(Error::ThreadCleanup)?
|
||||||
}
|
}
|
||||||
*state = new_state;
|
*state = new_state;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user