diff options
| author | Shaun Ren <shaun.ren@linux.com> | 2025-09-17 12:32:26 -0400 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2025-10-02 10:02:16 +0300 |
| commit | b7f1e382a28961216afa6916c9c704e08a3c9617 (patch) | |
| tree | df337df2540466c23ddc611351faef64462fcd6d /src/backend | |
| parent | e5b0662f4867490daba0aa9b8a9e14f429c5df16 (diff) | |
| download | niri-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.rs | 19 |
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( |
