vmm: Move ownership of the exit/reset EventFd to Vm structure

It makes more sense there as it is used by more than just the
DeviceManager.

Signed-off-by: Rob Bradford <robert.bradford@intel.com>
This commit is contained in:
Rob Bradford 2019-09-04 15:28:48 +01:00 committed by Sebastien Boeuf
parent 2f4de81175
commit d089ee4e25
2 changed files with 21 additions and 15 deletions

View File

@ -224,10 +224,6 @@ pub struct DeviceManager {
// ACPI device for reboot/shutdwon // ACPI device for reboot/shutdwon
acpi_device: Arc<Mutex<devices::AcpiShutdownDevice>>, acpi_device: Arc<Mutex<devices::AcpiShutdownDevice>>,
// Shutdown (exit) and reboot (reset) control
pub exit_evt: EventFd,
pub reset_evt: EventFd,
// IOAPIC // IOAPIC
ioapic: Option<Arc<Mutex<ioapic::Ioapic>>>, ioapic: Option<Arc<Mutex<ioapic::Ioapic>>>,
@ -245,6 +241,8 @@ impl DeviceManager {
msi_capable: bool, msi_capable: bool,
userspace_ioapic: bool, userspace_ioapic: bool,
mut mem_slots: u32, mut mem_slots: u32,
exit_evt: &EventFd,
reset_evt: &EventFd,
) -> DeviceManagerResult<Self> { ) -> DeviceManagerResult<Self> {
let mut io_bus = devices::Bus::new(); let mut io_bus = devices::Bus::new();
let mut mmio_bus = devices::Bus::new(); let mut mmio_bus = devices::Bus::new();
@ -300,8 +298,6 @@ impl DeviceManager {
}; };
// Add a shutdown device (i8042) // Add a shutdown device (i8042)
let exit_evt = EventFd::new(EFD_NONBLOCK).map_err(DeviceManagerError::EventFd)?;
let reset_evt = EventFd::new(EFD_NONBLOCK).map_err(DeviceManagerError::EventFd)?;
let i8042 = Arc::new(Mutex::new(devices::legacy::I8042Device::new( let i8042 = Arc::new(Mutex::new(devices::legacy::I8042Device::new(
reset_evt.try_clone().map_err(DeviceManagerError::EventFd)?, reset_evt.try_clone().map_err(DeviceManagerError::EventFd)?,
))); )));
@ -367,8 +363,6 @@ impl DeviceManager {
i8042, i8042,
#[cfg(feature = "acpi")] #[cfg(feature = "acpi")]
acpi_device, acpi_device,
exit_evt,
reset_evt,
ioapic, ioapic,
pci, pci,
mmap_regions, mmap_regions,
@ -944,11 +938,11 @@ impl DeviceManager {
Ok(()) Ok(())
} }
pub fn io_bus(&self) -> &devices::Bus{ pub fn io_bus(&self) -> &devices::Bus {
&self.io_bus &self.io_bus
} }
pub fn mmio_bus(&self) ->&devices::Bus { pub fn mmio_bus(&self) -> &devices::Bus {
&self.mmio_bus &self.mmio_bus
} }

View File

@ -32,6 +32,7 @@ use kvm_bindings::{
KVM_PIT_SPEAKER_DUMMY, KVM_PIT_SPEAKER_DUMMY,
}; };
use kvm_ioctls::*; use kvm_ioctls::*;
use libc::EFD_NONBLOCK;
use libc::{c_void, siginfo_t}; use libc::{c_void, siginfo_t};
use linux_loader::loader::KernelLoader; use linux_loader::loader::KernelLoader;
use signal_hook::{iterator::Signals, SIGWINCH}; use signal_hook::{iterator::Signals, SIGWINCH};
@ -50,6 +51,7 @@ use vm_memory::{
Address, Bytes, Error as MmapError, GuestAddress, GuestMemory, GuestMemoryMmap, Address, Bytes, Error as MmapError, GuestAddress, GuestMemory, GuestMemoryMmap,
GuestMemoryRegion, GuestUsize, GuestMemoryRegion, GuestUsize,
}; };
use vmm_sys_util::eventfd::EventFd;
use vmm_sys_util::signal::{register_signal_handler, validate_signal_num}; use vmm_sys_util::signal::{register_signal_handler, validate_signal_num};
use vmm_sys_util::terminal::Terminal; use vmm_sys_util::terminal::Terminal;
@ -512,6 +514,9 @@ pub struct Vm<'a> {
on_tty: bool, on_tty: bool,
creation_ts: std::time::Instant, creation_ts: std::time::Instant,
vcpus_kill_signalled: Arc<AtomicBool>, vcpus_kill_signalled: Arc<AtomicBool>,
// Shutdown (exit) and reboot (reset) control
exit_evt: EventFd,
reset_evt: EventFd,
} }
impl<'a> Vm<'a> { impl<'a> Vm<'a> {
@ -698,12 +703,17 @@ impl<'a> Vm<'a> {
vm_cfg: config, vm_cfg: config,
}; };
let exit_evt = EventFd::new(EFD_NONBLOCK).map_err(Error::EventFd)?;
let reset_evt = EventFd::new(EFD_NONBLOCK).map_err(Error::EventFd)?;
let device_manager = DeviceManager::new( let device_manager = DeviceManager::new(
&vm_info, &vm_info,
&mut allocator, &mut allocator,
msi_capable, msi_capable,
userspace_ioapic, userspace_ioapic,
ram_regions.len() as u32, ram_regions.len() as u32,
&exit_evt,
&reset_evt,
) )
.map_err(Error::DeviceManager)?; .map_err(Error::DeviceManager)?;
@ -717,10 +727,10 @@ impl<'a> Vm<'a> {
// Let's add an exit event. // Let's add an exit event.
epoll epoll
.add_event(&device_manager.exit_evt, EpollDispatch::Exit) .add_event(&exit_evt, EpollDispatch::Exit)
.map_err(Error::EpollError)?; .map_err(Error::EpollError)?;
epoll epoll
.add_event(&device_manager.reset_evt, EpollDispatch::Reset) .add_event(&reset_evt, EpollDispatch::Reset)
.map_err(Error::EpollError)?; .map_err(Error::EpollError)?;
let threads = Vec::with_capacity(u8::from(&config.cpus) as usize + 1); let threads = Vec::with_capacity(u8::from(&config.cpus) as usize + 1);
@ -737,6 +747,8 @@ impl<'a> Vm<'a> {
on_tty, on_tty,
creation_ts, creation_ts,
vcpus_kill_signalled: Arc::new(AtomicBool::new(false)), vcpus_kill_signalled: Arc::new(AtomicBool::new(false)),
exit_evt,
reset_evt,
}) })
} }
@ -849,14 +861,14 @@ impl<'a> Vm<'a> {
match dispatch_type { match dispatch_type {
EpollDispatch::Exit => { EpollDispatch::Exit => {
// Consume the event. // Consume the event.
self.devices.exit_evt.read().map_err(Error::EventFd)?; self.exit_evt.read().map_err(Error::EventFd)?;
exit_behaviour = ExitBehaviour::Shutdown; exit_behaviour = ExitBehaviour::Shutdown;
break 'outer; break 'outer;
} }
EpollDispatch::Reset => { EpollDispatch::Reset => {
// Consume the event. // Consume the event.
self.devices.reset_evt.read().map_err(Error::EventFd)?; self.reset_evt.read().map_err(Error::EventFd)?;
exit_behaviour = ExitBehaviour::Reset; exit_behaviour = ExitBehaviour::Reset;
break 'outer; break 'outer;
@ -969,7 +981,7 @@ impl<'a> Vm<'a> {
let vcpu_thread_barrier = vcpu_thread_barrier.clone(); let vcpu_thread_barrier = vcpu_thread_barrier.clone();
let reset_evt = self.devices.reset_evt.try_clone().unwrap(); let reset_evt = self.reset_evt.try_clone().unwrap();
let vcpu_kill_signalled = self.vcpus_kill_signalled.clone(); let vcpu_kill_signalled = self.vcpus_kill_signalled.clone();
self.threads.push( self.threads.push(
thread::Builder::new() thread::Builder::new()