arch: Don't set up serial device when vhost-user console is set

crosvm sets up an emulated serial device for ttyS0 as a default device
unless virtio-console is specified.
The setup should be skipped when a vhost-user console is specified as well.

BUG=b:196186396
BUG=b:227407433
TEST=no serial output when one vhost-user console is specified.

Change-Id: Ib17e218fd01a13c109fc1246fd3a6d99031d3181
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/3557729
Reviewed-by: Morg <morg@chromium.org>
Reviewed-by: Alexandre Courbot <acourbot@chromium.org>
Tested-by: kokoro <noreply+kokoro@google.com>
Commit-Queue: Keiichi Watanabe <keiichiw@chromium.org>
This commit is contained in:
Keiichi Watanabe 2022-03-30 11:03:08 +09:00 committed by Chromeos LUCI
parent 983e44eeff
commit ba0e3dbcb8
3 changed files with 14 additions and 7 deletions

View file

@ -26,11 +26,12 @@ use crate::DeviceRegistrationError;
/// configured explicitly.
pub fn set_default_serial_parameters(
serial_parameters: &mut BTreeMap<(SerialHardware, u8), SerialParameters>,
is_vhost_user_console_enabled: bool,
) {
// If no console device exists and the first serial port has not been specified,
// set the first serial port as a stdout+stdin console.
let default_console = (SerialHardware::Serial, 1);
if !serial_parameters.iter().any(|(_, p)| p.console) {
if !serial_parameters.iter().any(|(_, p)| p.console) && !is_vhost_user_console_enabled {
serial_parameters
.entry(default_console)
.or_insert(SerialParameters {
@ -148,6 +149,7 @@ pub type GetSerialCmdlineResult<T> = std::result::Result<T, GetSerialCmdlineErro
/// Add serial options to the provided `cmdline` based on `serial_parameters`.
/// `serial_io_type` should be "io" if the platform uses x86-style I/O ports for serial devices
/// or "mmio" if the serial ports are memory mapped.
// TODO(b/227407433): Support cases where vhost-user console is specified.
pub fn get_serial_cmdline(
cmdline: &mut kernel_cmdline::Cmdline,
serial_parameters: &BTreeMap<(SerialHardware, u8), SerialParameters>,
@ -207,7 +209,7 @@ mod tests {
let mut cmdline = Cmdline::new(4096);
let mut serial_parameters = BTreeMap::new();
set_default_serial_parameters(&mut serial_parameters);
set_default_serial_parameters(&mut serial_parameters, false);
get_serial_cmdline(&mut cmdline, &serial_parameters, "io")
.expect("get_serial_cmdline failed");
@ -236,7 +238,7 @@ mod tests {
},
);
set_default_serial_parameters(&mut serial_parameters);
set_default_serial_parameters(&mut serial_parameters, false);
get_serial_cmdline(&mut cmdline, &serial_parameters, "io")
.expect("get_serial_cmdline failed");
@ -281,7 +283,7 @@ mod tests {
},
);
set_default_serial_parameters(&mut serial_parameters);
set_default_serial_parameters(&mut serial_parameters, false);
get_serial_cmdline(&mut cmdline, &serial_parameters, "io")
.expect("get_serial_cmdline failed");
@ -311,7 +313,7 @@ mod tests {
},
);
set_default_serial_parameters(&mut serial_parameters);
set_default_serial_parameters(&mut serial_parameters, false);
get_serial_cmdline(&mut cmdline, &serial_parameters, "io")
.expect_err("get_serial_cmdline succeeded");
}

View file

@ -2462,7 +2462,12 @@ fn validate_arguments(cfg: &mut Config) -> std::result::Result<(), argument::Err
"'balloon-control' requires enabled balloon".to_owned(),
));
}
set_default_serial_parameters(&mut cfg.serial_parameters);
set_default_serial_parameters(
&mut cfg.serial_parameters,
!cfg.vhost_user_console.is_empty(),
);
Ok(())
}

View file

@ -154,7 +154,7 @@ where
let mut serial_params = BTreeMap::new();
arch::set_default_serial_parameters(&mut serial_params);
arch::set_default_serial_parameters(&mut serial_params, false);
X8664arch::setup_serial_devices(
ProtectionType::Unprotected,