aboutsummaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
authorShaun Ren <shaun.ren@linux.com>2025-09-17 12:32:26 -0400
committerIvan Molodetskikh <yalterz@gmail.com>2025-10-02 10:02:16 +0300
commitb7f1e382a28961216afa6916c9c704e08a3c9617 (patch)
treedf337df2540466c23ddc611351faef64462fcd6d /src/backend
parente5b0662f4867490daba0aa9b8a9e14f429c5df16 (diff)
downloadniri-b7f1e382a28961216afa6916c9c704e08a3c9617.tar.gz
niri-b7f1e382a28961216afa6916c9c704e08a3c9617.tar.bz2
niri-b7f1e382a28961216afa6916c9c704e08a3c9617.zip
tty: Close DRM device session fd in device_removed()
Same logic as in cosmic-comp.
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/tty.rs19
1 files changed, 18 insertions, 1 deletions
diff --git a/src/backend/tty.rs b/src/backend/tty.rs
index b3a3689b..6c55098a 100644
--- a/src/backend/tty.rs
+++ b/src/backend/tty.rs
@@ -3,7 +3,7 @@ use std::collections::{HashMap, HashSet};
use std::fmt::Write;
use std::iter::zip;
use std::num::NonZeroU64;
-use std::os::fd::AsFd;
+use std::os::fd::{AsFd, OwnedFd};
use std::path::Path;
use std::rc::Rc;
use std::sync::{Arc, Mutex};
@@ -756,6 +756,7 @@ impl Tty {
}
let mut device = self.devices.remove(&node).unwrap();
+ let device_fd = device.drm.device_fd().device_fd();
if let Some(lease_state) = &mut device.drm_lease_state {
lease_state.disable_global::<State>();
@@ -798,9 +799,25 @@ impl Tty {
}
self.gpu_manager.as_mut().remove_node(&device.render_node);
+ // Trigger re-enumeration in order to remove the device from gpu_manager.
+ let _ = self.gpu_manager.devices();
+
niri.event_loop.remove(device.token);
self.refresh_ipc_outputs(niri);
+
+ drop(device);
+
+ match TryInto::<OwnedFd>::try_into(device_fd) {
+ Ok(fd) => {
+ if let Err(err) = self.session.close(fd) {
+ warn!("error closing DRM device fd: {err:?}");
+ }
+ }
+ Err(_) => {
+ error!("unable to close DRM device cleanly: fd has unexpected references");
+ }
+ }
}
fn connector_connected(