[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#948510: xserver-xorg-core: leaking open /dev/dri/card0 fds on vt switch, leading to lockup



Spiky Caterpillar kirjoitti 16.11.2022 klo 15.08:
Package: xserver-xorg-core
Version: 2:1.20.11-1+deb11u3
Followup-For: Bug #948510
X-Debbugs-Cc: spikycaterpillar_debianbts@deekoo.net

The FD leak when switching VTs still occurs on the current stable version of
xserver-xorg-core.

To verify:
Start X, start an xterm
lsof -n|grep -c /dev/dri/card0
control-alt-functionkey to another terminal, then return to X
lsof -n|grep -c /dev/dri/card0


lspci shows the video card as
01:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Caicos XT [Radeon HD 7470/8470 / R5 235/310 OEM] (prog-if 00 [VGA controller])
         Subsystem: PC Partner Limited / Sapphire Technology Radeon R5 235 OEM
         Flags: bus master, fast devsel, latency 0, IRQ 46, IOMMU group 0
         Memory at c0000000 (64-bit, prefetchable) [size=256M]
         Memory at fea20000 (64-bit, non-prefetchable) [size=128K]
         I/O ports at e000 [size=256]
         Expansion ROM at 000c0000 [disabled] [size=128K]
         Capabilities: [50] Power Management version 3
         Capabilities: [58] Express Legacy Endpoint, MSI 00
         Capabilities: [a0] MSI: Enable+ Count=1/1 Maskable- 64bit+
         Capabilities: [100] Vendor Specific Information: ID=0001 Rev=1 Len=010 <?>
         Capabilities: [150] Advanced Error Reporting
         Kernel driver in use: radeon
         Kernel modules: radeon


As before, patching it out seems to fix the problem.
diff --git a/hw/xfree86/os-support/linux/systemd-logind.c b/hw/xfree86/os-support/linux/systemd-logind.c
index 13784d1..9f196ef 100644
--- a/hw/xfree86/os-support/linux/systemd-logind.c
+++ b/hw/xfree86/os-support/linux/systemd-logind.c
@@ -417,9 +417,10 @@ message_filter(DBusConnection * connection, DBusMessage * message, void *data)
          /* info->vt_active gets set by systemd_logind_vtenter() */
          info->active = TRUE;
- if (pdev)
+        if (pdev) {
+            close(fd);
              pdev->flags &= ~XF86_PDEV_PAUSED;
-        else
+        } else
              systemd_logind_set_input_fd_for_all_devs(major, minor, fd,
                                                       info->vt_active);



Hi, the only way to fix it for good is to send a MR upstream for review:

https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests



--
t


Reply to: