Skip to content

Commit 4a4aaf5

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. Co-authored-by: Egor Lazarchuk <yegorlz@amazon.co.uk> Signed-off-by: Babis Chalios <bchalios@amazon.es>
1 parent c427782 commit 4a4aaf5

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,14 +10,11 @@ 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_superio::Rtc;
19-
use vm_superio::Serial;
20-
use vmm_sys_util::eventfd::EventFd;
2118

2219
use crate::arch::{ConfigurationError, configure_system_for_boot, load_kernel};
2320
#[cfg(target_arch = "aarch64")]
@@ -37,8 +34,8 @@ use crate::devices::BusDevice;
3734
use crate::devices::acpi::vmgenid::{VmGenId, VmGenIdError};
3835
#[cfg(target_arch = "aarch64")]
3936
use crate::devices::legacy::RTCDevice;
37+
use crate::devices::legacy::SerialDevice;
4038
use crate::devices::legacy::serial::SerialOut;
41-
use crate::devices::legacy::{EventFdTrigger, SerialEventsWrapper, SerialWrapper};
4239
use crate::devices::virtio::balloon::Balloon;
4340
use crate::devices::virtio::block::device::Block;
4441
use crate::devices::virtio::device::VirtioDevice;
@@ -158,7 +155,7 @@ fn create_vmm_and_vcpus(
158155
set_stdout_nonblocking();
159156

160157
// Serial device setup.
161-
let serial_device = setup_serial_device(event_manager, std::io::stdin(), io::stdout())?;
158+
let serial_device = setup_serial_device(event_manager)?;
162159

163160
// x86_64 uses the i8042 reset event as the Vmm exit event.
164161
let reset_evt = vcpus_exit_evt.try_clone().map_err(VmmError::EventFd)?;
@@ -532,22 +529,11 @@ pub fn build_microvm_from_snapshot(
532529
/// Sets up the serial device.
533530
pub fn setup_serial_device(
534531
event_manager: &mut EventManager,
535-
input: std::io::Stdin,
536-
out: std::io::Stdout,
537532
) -> Result<Arc<Mutex<BusDevice>>, VmmError> {
538-
let interrupt_evt = EventFdTrigger::new(EventFd::new(EFD_NONBLOCK).map_err(VmmError::EventFd)?);
539-
let kick_stdin_read_evt =
540-
EventFdTrigger::new(EventFd::new(EFD_NONBLOCK).map_err(VmmError::EventFd)?);
541-
let serial = Arc::new(Mutex::new(BusDevice::Serial(SerialWrapper {
542-
serial: Serial::with_events(
543-
interrupt_evt,
544-
SerialEventsWrapper {
545-
buffer_ready_event_fd: Some(kick_stdin_read_evt),
546-
},
547-
SerialOut::Stdout(out),
548-
),
549-
input: Some(input),
550-
})));
533+
let serial = Arc::new(Mutex::new(BusDevice::Serial(
534+
SerialDevice::new(Some(std::io::stdin()), SerialOut::Stdout(std::io::stdout()))
535+
.map_err(VmmError::EventFd)?,
536+
)));
551537
event_manager.add_subscriber(serial.clone());
552538
Ok(serial)
553539
}
@@ -569,7 +555,7 @@ fn attach_legacy_devices_aarch64(
569555
if cmdline_contains_console {
570556
// Make stdout non-blocking.
571557
set_stdout_nonblocking();
572-
let serial = setup_serial_device(event_manager, std::io::stdin(), std::io::stdout())?;
558+
let serial = setup_serial_device(event_manager)?;
573559
vmm.mmio_device_manager
574560
.register_mmio_serial(vmm.vm.fd(), &mut vmm.resource_allocator, serial, None)
575561
.map_err(VmmError::RegisterMMIODevice)?;
@@ -749,11 +735,15 @@ pub(crate) fn set_stdout_nonblocking() {
749735
pub(crate) mod tests {
750736

751737
use linux_loader::cmdline::Cmdline;
738+
#[cfg(target_arch = "x86_64")]
739+
use vmm_sys_util::eventfd::EventFd;
752740
use vmm_sys_util::tempfile::TempFile;
753741

754742
use super::*;
755743
use crate::arch::DeviceType;
756744
use crate::device_manager::resources::ResourceAllocator;
745+
#[cfg(target_arch = "x86_64")]
746+
use crate::devices::legacy::serial::SerialOut;
757747
use crate::devices::virtio::block::CacheType;
758748
use crate::devices::virtio::rng::device::ENTROPY_DEV_ID;
759749
use crate::devices::virtio::vsock::{TYPE_VSOCK, VSOCK_DEV_ID};
@@ -830,16 +820,9 @@ pub(crate) mod tests {
830820
let acpi_device_manager = ACPIDeviceManager::new();
831821
#[cfg(target_arch = "x86_64")]
832822
let pio_device_manager = PortIODeviceManager::new(
833-
Arc::new(Mutex::new(BusDevice::Serial(SerialWrapper {
834-
serial: Serial::with_events(
835-
EventFdTrigger::new(EventFd::new(EFD_NONBLOCK).unwrap()),
836-
SerialEventsWrapper {
837-
buffer_ready_event_fd: None,
838-
},
839-
SerialOut::Sink(std::io::sink()),
840-
),
841-
input: None,
842-
}))),
823+
Arc::new(Mutex::new(BusDevice::Serial(
824+
SerialDevice::new(None, SerialOut::Sink(std::io::sink())).unwrap(),
825+
))),
843826
EventFd::new(libc::EFD_NONBLOCK).unwrap(),
844827
)
845828
.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)