Skip to content

Commit 809f770

Browse files
bchaliosShadowCurse
andcommitted
refactor(serial): remove generics from SerialDevice
We use `SerialDevice` with Stdin as the input source. Encode this in the type so that we don't spill the generic all over the place. Signed-off-by: Babis Chalios <bchalios@amazon.es> Co-authored-by: Egor Lazarchuk <yegorlz@amazon.co.uk> Signed-off-by: Egor Lazarchuk <yegorlz@amazon.co.uk> Signed-off-by: Babis Chalios <bchalios@amazon.es>
1 parent f3a7def commit 809f770

File tree

4 files changed

+43
-42
lines changed

4 files changed

+43
-42
lines changed

src/vmm/src/builder.rs

Lines changed: 14 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,13 @@ use std::sync::mpsc;
1010
use std::sync::{Arc, Mutex};
1111

1212
use event_manager::{MutEventSubscriber, SubscriberOps};
13-
use libc::EFD_NONBLOCK;
1413
use linux_loader::cmdline::Cmdline as LoaderKernelCmdline;
1514
use userfaultfd::Uffd;
1615
use utils::time::TimestampUs;
1716
#[cfg(target_arch = "aarch64")]
1817
use vm_memory::GuestAddress;
1918
#[cfg(target_arch = "aarch64")]
2019
use vm_superio::Rtc;
21-
use vm_superio::Serial;
22-
use vmm_sys_util::eventfd::EventFd;
2320

2421
use crate::arch::{ConfigurationError, configure_system_for_boot, load_kernel};
2522
#[cfg(target_arch = "aarch64")]
@@ -39,8 +36,8 @@ use crate::devices::BusDevice;
3936
use crate::devices::acpi::vmgenid::{VmGenId, VmGenIdError};
4037
#[cfg(target_arch = "aarch64")]
4138
use crate::devices::legacy::RTCDevice;
39+
use crate::devices::legacy::SerialDevice;
4240
use crate::devices::legacy::serial::SerialOut;
43-
use crate::devices::legacy::{EventFdTrigger, SerialEventsWrapper, SerialWrapper};
4441
use crate::devices::virtio::balloon::Balloon;
4542
use crate::devices::virtio::block::device::Block;
4643
use crate::devices::virtio::device::VirtioDevice;
@@ -163,7 +160,7 @@ fn create_vmm_and_vcpus(
163160
set_stdout_nonblocking();
164161

165162
// Serial device setup.
166-
let serial_device = setup_serial_device(event_manager, std::io::stdin(), io::stdout())?;
163+
let serial_device = setup_serial_device(event_manager)?;
167164

168165
// x86_64 uses the i8042 reset event as the Vmm exit event.
169166
let reset_evt = vcpus_exit_evt.try_clone().map_err(VmmError::EventFd)?;
@@ -554,22 +551,11 @@ pub fn build_microvm_from_snapshot(
554551
/// Sets up the serial device.
555552
pub fn setup_serial_device(
556553
event_manager: &mut EventManager,
557-
input: std::io::Stdin,
558-
out: std::io::Stdout,
559554
) -> Result<Arc<Mutex<BusDevice>>, VmmError> {
560-
let interrupt_evt = EventFdTrigger::new(EventFd::new(EFD_NONBLOCK).map_err(VmmError::EventFd)?);
561-
let kick_stdin_read_evt =
562-
EventFdTrigger::new(EventFd::new(EFD_NONBLOCK).map_err(VmmError::EventFd)?);
563-
let serial = Arc::new(Mutex::new(BusDevice::Serial(SerialWrapper {
564-
serial: Serial::with_events(
565-
interrupt_evt,
566-
SerialEventsWrapper {
567-
buffer_ready_event_fd: Some(kick_stdin_read_evt),
568-
},
569-
SerialOut::Stdout(out),
570-
),
571-
input: Some(input),
572-
})));
555+
let serial = Arc::new(Mutex::new(BusDevice::Serial(
556+
SerialDevice::new(Some(std::io::stdin()), SerialOut::Stdout(std::io::stdout()))
557+
.map_err(VmmError::EventFd)?,
558+
)));
573559
event_manager.add_subscriber(serial.clone());
574560
Ok(serial)
575561
}
@@ -629,7 +615,7 @@ fn attach_legacy_devices_aarch64(
629615
if cmdline_contains_console {
630616
// Make stdout non-blocking.
631617
set_stdout_nonblocking();
632-
let serial = setup_serial_device(event_manager, std::io::stdin(), std::io::stdout())?;
618+
let serial = setup_serial_device(event_manager)?;
633619
vmm.mmio_device_manager
634620
.register_mmio_serial(vmm.vm.fd(), &mut vmm.resource_allocator, serial, None)
635621
.map_err(VmmError::RegisterMMIODevice)?;
@@ -809,11 +795,15 @@ pub(crate) fn set_stdout_nonblocking() {
809795
pub(crate) mod tests {
810796

811797
use linux_loader::cmdline::Cmdline;
798+
#[cfg(target_arch = "x86_64")]
799+
use vmm_sys_util::eventfd::EventFd;
812800
use vmm_sys_util::tempfile::TempFile;
813801

814802
use super::*;
815803
use crate::arch::DeviceType;
816804
use crate::device_manager::resources::ResourceAllocator;
805+
#[cfg(target_arch = "x86_64")]
806+
use crate::devices::legacy::serial::SerialOut;
817807
use crate::devices::virtio::block::CacheType;
818808
use crate::devices::virtio::rng::device::ENTROPY_DEV_ID;
819809
use crate::devices::virtio::vsock::{TYPE_VSOCK, VSOCK_DEV_ID};
@@ -890,16 +880,9 @@ pub(crate) mod tests {
890880
let acpi_device_manager = ACPIDeviceManager::new();
891881
#[cfg(target_arch = "x86_64")]
892882
let pio_device_manager = PortIODeviceManager::new(
893-
Arc::new(Mutex::new(BusDevice::Serial(SerialWrapper {
894-
serial: Serial::with_events(
895-
EventFdTrigger::new(EventFd::new(EFD_NONBLOCK).unwrap()),
896-
SerialEventsWrapper {
897-
buffer_ready_event_fd: None,
898-
},
899-
SerialOut::Sink(std::io::sink()),
900-
),
901-
input: None,
902-
}))),
883+
Arc::new(Mutex::new(BusDevice::Serial(
884+
SerialDevice::new(None, SerialOut::Sink(std::io::sink())).unwrap(),
885+
))),
903886
EventFd::new(libc::EFD_NONBLOCK).unwrap(),
904887
)
905888
.unwrap();

src/vmm/src/device_manager/persist.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -421,11 +421,8 @@ impl<'a> Persist<'a> for MMIODeviceManager {
421421
{
422422
for state in &state.legacy_devices {
423423
if state.type_ == DeviceType::Serial {
424-
let serial = crate::builder::setup_serial_device(
425-
constructor_args.event_manager,
426-
std::io::stdin(),
427-
std::io::stdout(),
428-
)?;
424+
let serial =
425+
crate::builder::setup_serial_device(constructor_args.event_manager)?;
429426

430427
constructor_args
431428
.resource_allocator

src/vmm/src/devices/bus.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ pub enum BusDevice {
6565
RTCDevice(RTCDevice),
6666
BootTimer(BootTimer),
6767
MmioTransport(MmioTransport),
68-
Serial(SerialDevice<std::io::Stdin>),
68+
Serial(SerialDevice),
6969
#[cfg(test)]
7070
Dummy(DummyDevice),
7171
#[cfg(test)]
@@ -127,7 +127,7 @@ impl BusDevice {
127127
_ => None,
128128
}
129129
}
130-
pub fn serial_ref(&self) -> Option<&SerialDevice<std::io::Stdin>> {
130+
pub fn serial_ref(&self) -> Option<&SerialDevice> {
131131
match self {
132132
Self::Serial(x) => Some(x),
133133
_ => None,
@@ -159,7 +159,7 @@ impl BusDevice {
159159
_ => None,
160160
}
161161
}
162-
pub fn serial_mut(&mut self) -> Option<&mut SerialDevice<std::io::Stdin>> {
162+
pub fn serial_mut(&mut self) -> Option<&mut SerialDevice> {
163163
match self {
164164
Self::Serial(x) => Some(x),
165165
_ => None,

src/vmm/src/devices/legacy/serial.rs

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,17 @@
77

88
//! Implements a wrapper over an UART serial device.
99
use std::fmt::Debug;
10-
use std::io;
11-
use std::io::{Read, Write};
10+
use std::io::{self, Read, Stdin, Write};
1211
use std::os::unix::io::{AsRawFd, RawFd};
1312

1413
use event_manager::{EventOps, Events, MutEventSubscriber};
14+
use libc::EFD_NONBLOCK;
1515
use log::{error, warn};
1616
use serde::Serialize;
1717
use vm_superio::serial::{Error as SerialError, SerialEvents};
1818
use vm_superio::{Serial, Trigger};
1919
use vmm_sys_util::epoll::EventSet;
20+
use vmm_sys_util::eventfd::EventFd;
2021

2122
use crate::devices::legacy::EventFdTrigger;
2223
use crate::logger::{IncMetric, SharedIncMetric};
@@ -220,7 +221,27 @@ impl<I: Read + AsRawFd + Send + Debug> SerialWrapper<EventFdTrigger, SerialEvent
220221
}
221222

222223
/// Type for representing a serial device.
223-
pub type SerialDevice<I> = SerialWrapper<EventFdTrigger, SerialEventsWrapper, I>;
224+
pub type SerialDevice = SerialWrapper<EventFdTrigger, SerialEventsWrapper, Stdin>;
225+
226+
impl SerialDevice {
227+
pub fn new(serial_in: Option<Stdin>, serial_out: SerialOut) -> Result<Self, std::io::Error> {
228+
let interrupt_evt = EventFdTrigger::new(EventFd::new(EFD_NONBLOCK)?);
229+
let buffer_read_event_fd = EventFdTrigger::new(EventFd::new(EFD_NONBLOCK)?);
230+
231+
let serial = Serial::with_events(
232+
interrupt_evt,
233+
SerialEventsWrapper {
234+
buffer_ready_event_fd: Some(buffer_read_event_fd),
235+
},
236+
serial_out,
237+
);
238+
239+
Ok(SerialDevice {
240+
serial,
241+
input: serial_in,
242+
})
243+
}
244+
}
224245

225246
impl<I: Read + AsRawFd + Send + Debug> MutEventSubscriber
226247
for SerialWrapper<EventFdTrigger, SerialEventsWrapper, I>

0 commit comments

Comments
 (0)