diff --git a/src/firecracker/examples/uffd/fault_all_handler.rs b/src/firecracker/examples/uffd/fault_all_handler.rs index 31ce68a97bc..5e9f49a3207 100644 --- a/src/firecracker/examples/uffd/fault_all_handler.rs +++ b/src/firecracker/examples/uffd/fault_all_handler.rs @@ -24,6 +24,7 @@ fn main() { let (stream, _) = listener.accept().expect("Cannot listen on UDS socket"); let mut runtime = Runtime::new(stream, file); + runtime.install_panic_hook(); runtime.run(|uffd_handler: &mut UffdHandler| { // Read an event from the userfaultfd. let event = uffd_handler diff --git a/src/firecracker/examples/uffd/uffd_utils.rs b/src/firecracker/examples/uffd/uffd_utils.rs index 52d33765bd8..37aa63c62a3 100644 --- a/src/firecracker/examples/uffd/uffd_utils.rs +++ b/src/firecracker/examples/uffd/uffd_utils.rs @@ -208,6 +208,43 @@ impl Runtime { } } + fn peer_process_credentials(&self) -> libc::ucred { + let mut creds: libc::ucred = libc::ucred { + pid: 0, + gid: 0, + uid: 0, + }; + let mut creds_size = size_of::() as u32; + let ret = unsafe { + libc::getsockopt( + self.stream.as_raw_fd(), + libc::SOL_SOCKET, + libc::SO_PEERCRED, + &mut creds as *mut _ as *mut _, + &mut creds_size as *mut libc::socklen_t, + ) + }; + if ret != 0 { + panic!("Failed to get peer process credentials"); + } + creds + } + + pub fn install_panic_hook(&self) { + let peer_creds = self.peer_process_credentials(); + + let default_panic_hook = std::panic::take_hook(); + std::panic::set_hook(Box::new(move |panic_info| { + let r = unsafe { libc::kill(peer_creds.pid, libc::SIGKILL) }; + + if r != 0 { + eprintln!("Failed to kill Firecracker process from panic hook"); + } + + default_panic_hook(panic_info); + })); + } + /// Polls the `UnixStream` and UFFD fds in a loop. /// When stream is polled, new uffd is retrieved. /// When uffd is polled, page fault is handled by diff --git a/src/firecracker/examples/uffd/valid_handler.rs b/src/firecracker/examples/uffd/valid_handler.rs index cfc5faf432c..6c681d932ac 100644 --- a/src/firecracker/examples/uffd/valid_handler.rs +++ b/src/firecracker/examples/uffd/valid_handler.rs @@ -24,6 +24,7 @@ fn main() { let (stream, _) = listener.accept().expect("Cannot listen on UDS socket"); let mut runtime = Runtime::new(stream, file); + runtime.install_panic_hook(); runtime.run(|uffd_handler: &mut UffdHandler| { // Read an event from the userfaultfd. let event = uffd_handler diff --git a/src/vmm/src/builder.rs b/src/vmm/src/builder.rs index 433d1fd4ff3..999e27415fc 100644 --- a/src/vmm/src/builder.rs +++ b/src/vmm/src/builder.rs @@ -472,7 +472,7 @@ pub fn build_microvm_from_snapshot( let (mut vmm, mut vcpus) = create_vmm_and_vcpus( instance_info, event_manager, - guest_memory.clone(), + guest_memory, uffd, vm_resources.machine_config.track_dirty_pages, vm_resources.machine_config.vcpu_count, @@ -517,7 +517,7 @@ pub fn build_microvm_from_snapshot( // Restore devices states. let mmio_ctor_args = MMIODevManagerConstructorArgs { - mem: &guest_memory, + mem: &vmm.guest_memory, vm: vmm.vm.fd(), event_manager, resource_allocator: &mut vmm.resource_allocator, @@ -532,7 +532,7 @@ pub fn build_microvm_from_snapshot( { let acpi_ctor_args = ACPIDeviceManagerConstructorArgs { - mem: &guest_memory, + mem: &vmm.guest_memory, resource_allocator: &mut vmm.resource_allocator, vm: vmm.vm.fd(), }; diff --git a/tests/framework/microvm.py b/tests/framework/microvm.py index 278cb9ecd60..f93a0dabf19 100644 --- a/tests/framework/microvm.py +++ b/tests/framework/microvm.py @@ -310,6 +310,9 @@ def kill(self): if self.screen_pid: os.kill(self.screen_pid, signal.SIGKILL) except: + LOG.error( + "Failed to kill Firecracker Process. Did it already die (or did the UFFD handler process die and take it down)?" + ) LOG.error(self.log_data) raise