Skip to content

Commit e928650

Browse files
committed
fix(vmm): drop uffd handle on handler disconnect
This is to unregister all UFFD ranges when the UFFD handler is disconnected so that no further UFFD message is sent if the handler is not longer available. Signed-off-by: Nikita Kalyazin <[email protected]>
1 parent 1d0b44a commit e928650

File tree

1 file changed

+18
-1
lines changed

1 file changed

+18
-1
lines changed

src/vmm/src/lib.rs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -844,6 +844,14 @@ impl Vmm {
844844
}
845845
}
846846

847+
fn hungup_event_in_uffd_socket(&self, source: RawFd, event_set: EventSet) -> bool {
848+
if let Some(uffd_socket) = &self.uffd_socket {
849+
uffd_socket.as_raw_fd() == source && (event_set == EventSet::IN | EventSet::HANG_UP)
850+
} else {
851+
false
852+
}
853+
}
854+
847855
fn process_uffd_socket(&mut self) {
848856
const BUFFER_SIZE: usize = 4096;
849857

@@ -985,7 +993,7 @@ impl Drop for Vmm {
985993

986994
impl MutEventSubscriber for Vmm {
987995
/// Handle a read event (EPOLLIN).
988-
fn process(&mut self, event: Events, _: &mut EventOps) {
996+
fn process(&mut self, event: Events, ops: &mut EventOps) {
989997
let source = event.fd();
990998
let event_set = event.event_set();
991999

@@ -1028,6 +1036,15 @@ impl MutEventSubscriber for Vmm {
10281036
if self.active_event_in_uffd_socket(source, event_set) {
10291037
self.process_uffd_socket();
10301038
}
1039+
1040+
if self.hungup_event_in_uffd_socket(source, event_set) {
1041+
info!("UFFD handler process has disconnected.");
1042+
1043+
self.uffd = None;
1044+
if let Err(err) = ops.remove(Events::new(&source, EventSet::IN)) {
1045+
error!("Failed to unregister UFFD socket event: {}", err);
1046+
}
1047+
}
10311048
}
10321049

10331050
fn init(&mut self, ops: &mut EventOps) {

0 commit comments

Comments
 (0)