mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2025-04-01 20:04:37 +00:00
vmm: fix console resizing
DeviceManager::add_virtio_console_device used to create the console resize pipe and assign it to self.console_resize_pipe, but when this was changed to use console_info, that was deleted without replacement. This meant that, even though the console resize pipe was created by pre_create_console_devices, the DeviceManager never found out about it, so console resize didn't work (at least for pty consoles). To fix this, the console resize pipe needs to be passed to the Vm initializer, which is already supported, it was just previously not used for new VMs. Since DeviceManager already stores the console resize pipe in an Arc, and Vmm also needs a copy of it, the sensible thing to do is change DeviceManager::new to take Arc, and then we don't need to dup the file descriptor, which could fail. Fixes: 52eebaf6 ("vmm: refactor DeviceManager to use console_info") Signed-off-by: Alyssa Ross <hi@alyssa.is>
This commit is contained in:
parent
6956306604
commit
4bfeba967b
@ -183,14 +183,14 @@ pub(crate) fn pre_create_console_devices(vmm: &mut Vmm) -> ConsoleDeviceResult<C
|
||||
console_info.console_main_fd = Some(main_fd.into_raw_fd());
|
||||
set_raw_mode(&sub_fd.as_raw_fd(), vmm.original_termios_opt.clone())?;
|
||||
vmconfig.console.file = Some(path.clone());
|
||||
vmm.console_resize_pipe = Some(
|
||||
vmm.console_resize_pipe = Some(Arc::new(
|
||||
listen_for_sigwinch_on_tty(
|
||||
sub_fd,
|
||||
&vmm.seccomp_action,
|
||||
vmm.hypervisor.hypervisor_type(),
|
||||
)
|
||||
.map_err(ConsoleDeviceError::StartSigwinchListener)?,
|
||||
);
|
||||
));
|
||||
}
|
||||
ConsoleOutputMode::Tty => {
|
||||
// Duplicating the file descriptors like this is needed as otherwise
|
||||
@ -206,14 +206,14 @@ pub(crate) fn pre_create_console_devices(vmm: &mut Vmm) -> ConsoleDeviceResult<C
|
||||
|
||||
// SAFETY: FFI call. Trivially safe.
|
||||
if unsafe { libc::isatty(stdout.as_raw_fd()) } == 1 {
|
||||
vmm.console_resize_pipe = Some(
|
||||
vmm.console_resize_pipe = Some(Arc::new(
|
||||
listen_for_sigwinch_on_tty(
|
||||
stdout.try_clone().unwrap(),
|
||||
&vmm.seccomp_action,
|
||||
vmm.hypervisor.hypervisor_type(),
|
||||
)
|
||||
.map_err(ConsoleDeviceError::StartSigwinchListener)?,
|
||||
);
|
||||
));
|
||||
}
|
||||
|
||||
// Make sure stdout is in raw mode, if it's a terminal.
|
||||
@ -255,14 +255,14 @@ pub(crate) fn pre_create_console_devices(vmm: &mut Vmm) -> ConsoleDeviceResult<C
|
||||
|
||||
// SAFETY: FFI call. Trivially safe.
|
||||
if unsafe { libc::isatty(stdout.as_raw_fd()) } == 1 {
|
||||
vmm.console_resize_pipe = Some(
|
||||
vmm.console_resize_pipe = Some(Arc::new(
|
||||
listen_for_sigwinch_on_tty(
|
||||
stdout.try_clone().unwrap(),
|
||||
&vmm.seccomp_action,
|
||||
vmm.hypervisor.hypervisor_type(),
|
||||
)
|
||||
.map_err(ConsoleDeviceError::StartSigwinchListener)?,
|
||||
);
|
||||
));
|
||||
}
|
||||
|
||||
// Make sure stdout is in raw mode, if it's a terminal.
|
||||
|
@ -1248,7 +1248,7 @@ impl DeviceManager {
|
||||
pub fn create_devices(
|
||||
&mut self,
|
||||
console_info: Option<ConsoleInfo>,
|
||||
console_resize_pipe: Option<File>,
|
||||
console_resize_pipe: Option<Arc<File>>,
|
||||
original_termios_opt: Arc<Mutex<Option<termios>>>,
|
||||
) -> DeviceManagerResult<()> {
|
||||
trace_scoped!("create_devices");
|
||||
@ -2006,7 +2006,7 @@ impl DeviceManager {
|
||||
&mut self,
|
||||
virtio_devices: &mut Vec<MetaVirtioDevice>,
|
||||
console_fd: Option<RawFd>,
|
||||
resize_pipe: Option<File>,
|
||||
resize_pipe: Option<Arc<File>>,
|
||||
) -> DeviceManagerResult<Option<Arc<virtio_devices::ConsoleResizer>>> {
|
||||
let console_config = self.config.lock().unwrap().console.clone();
|
||||
let endpoint = match console_config.mode {
|
||||
@ -2024,7 +2024,7 @@ impl DeviceManager {
|
||||
// SAFETY: pty_fd is guaranteed to be a valid fd from
|
||||
// pre_create_console_devices() in vmm/src/console_devices.rs
|
||||
let file = unsafe { File::from_raw_fd(pty_fd) };
|
||||
self.console_resize_pipe = resize_pipe.map(Arc::new);
|
||||
self.console_resize_pipe = resize_pipe;
|
||||
Endpoint::PtyPair(file.try_clone().unwrap(), file)
|
||||
} else {
|
||||
return Err(DeviceManagerError::InvalidConsoleFd);
|
||||
@ -2113,7 +2113,7 @@ impl DeviceManager {
|
||||
interrupt_manager: &Arc<dyn InterruptManager<GroupConfig = LegacyIrqGroupConfig>>,
|
||||
virtio_devices: &mut Vec<MetaVirtioDevice>,
|
||||
console_info: Option<ConsoleInfo>,
|
||||
console_resize_pipe: Option<File>,
|
||||
console_resize_pipe: Option<Arc<File>>,
|
||||
) -> DeviceManagerResult<Arc<Console>> {
|
||||
let serial_config = self.config.lock().unwrap().serial.clone();
|
||||
if console_info.is_none() {
|
||||
|
@ -576,7 +576,7 @@ pub struct Vmm {
|
||||
signals: Option<Handle>,
|
||||
threads: Vec<thread::JoinHandle<()>>,
|
||||
original_termios_opt: Arc<Mutex<Option<termios>>>,
|
||||
console_resize_pipe: Option<File>,
|
||||
console_resize_pipe: Option<Arc<File>>,
|
||||
console_info: Option<ConsoleInfo>,
|
||||
}
|
||||
|
||||
@ -868,7 +868,7 @@ impl Vmm {
|
||||
activate_evt,
|
||||
timestamp,
|
||||
self.console_info.clone(),
|
||||
None,
|
||||
self.console_resize_pipe.as_ref().map(Arc::clone),
|
||||
Arc::clone(&self.original_termios_opt),
|
||||
Some(snapshot),
|
||||
)
|
||||
@ -1306,7 +1306,7 @@ impl RequestHandler for Vmm {
|
||||
self.hypervisor.clone(),
|
||||
activate_evt,
|
||||
self.console_info.clone(),
|
||||
None,
|
||||
self.console_resize_pipe.as_ref().map(Arc::clone),
|
||||
Arc::clone(&self.original_termios_opt),
|
||||
None,
|
||||
None,
|
||||
@ -1433,7 +1433,7 @@ impl RequestHandler for Vmm {
|
||||
self.hypervisor.clone(),
|
||||
activate_evt,
|
||||
self.console_info.clone(),
|
||||
None,
|
||||
self.console_resize_pipe.as_ref().map(Arc::clone),
|
||||
Arc::clone(&self.original_termios_opt),
|
||||
Some(snapshot),
|
||||
Some(source_url),
|
||||
@ -1492,10 +1492,7 @@ impl RequestHandler for Vmm {
|
||||
// First we stop the current VM
|
||||
let (config, console_resize_pipe) = if let Some(mut vm) = self.vm.take() {
|
||||
let config = vm.get_config();
|
||||
let console_resize_pipe = vm
|
||||
.console_resize_pipe()
|
||||
.as_ref()
|
||||
.map(|pipe| pipe.try_clone().unwrap());
|
||||
let console_resize_pipe = vm.console_resize_pipe();
|
||||
vm.shutdown()?;
|
||||
(config, console_resize_pipe)
|
||||
} else {
|
||||
|
@ -493,7 +493,7 @@ impl Vm {
|
||||
activate_evt: EventFd,
|
||||
timestamp: Instant,
|
||||
console_info: Option<ConsoleInfo>,
|
||||
console_resize_pipe: Option<File>,
|
||||
console_resize_pipe: Option<Arc<File>>,
|
||||
original_termios: Arc<Mutex<Option<termios>>>,
|
||||
snapshot: Option<Snapshot>,
|
||||
) -> Result<Self> {
|
||||
@ -801,7 +801,7 @@ impl Vm {
|
||||
hypervisor: Arc<dyn hypervisor::Hypervisor>,
|
||||
activate_evt: EventFd,
|
||||
console_info: Option<ConsoleInfo>,
|
||||
console_resize_pipe: Option<File>,
|
||||
console_resize_pipe: Option<Arc<File>>,
|
||||
original_termios: Arc<Mutex<Option<termios>>>,
|
||||
snapshot: Option<Snapshot>,
|
||||
source_url: Option<&str>,
|
||||
|
Loading…
x
Reference in New Issue
Block a user