Re: Regression: firmware/sysfb.c device path

From: Thomas Zimmermann
Date: Mon Jul 15 2024 - 02:45:02 EST


Hi

Am 13.07.24 um 19:20 schrieb Tj:
The recent commits to add the parent device path broke Debian's kvm based QA workers for testing installer ISOs after a kernel upgrade from v6.8.12 to v6.9.7. For the details:

https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1075713

It took some time to track it down since the superficial symptom appeared to involve the QXL driver. It turned out however to be the fbdev driver; specifically the change in the parent device path in sysfs reported between the two kernels:

6.8.12:

/sys/class/graphics/fb0 -> ../../devices/platform/vesa-framebuffer.0/graphics/fb0

6.9.7:

/sys/class/graphics/fb0 -> ../../devices/pci0000:00/0000:00:01.0/vesa-framebuffer.0/graphics/fb0

This breaks xserver-xorg-core's libfbdevhw.so because it differentiates code-paths based on whether "devices/pci" is matched in the symlink.

See hw/xfree86/fbdevhw/fbdevhw.c::fbdev_open()

https://gitlab.freedesktop.org/xorg/xserver/-/blob/master/hw/xfree86/fbdevhw/fbdevhw.c?ref_type=heads#L381

Amazing debugging skills!

The patch that causes the regression in X sets the PCI device as parent for the VESA framebuffer. That means that the PCI device won't be unplugged or suspended while the VESA framebuffer is still in use. Without, results are undefined.

Therefore, could this be fixed in X' fbdev driver?

It currently tests against the sysfs path of the fbdev device. A fix could look like this:

 1) readlink /sys/class/graphics/fb0/device/subsystem 2) strcmp to "bus/pci" fb0 is the fbdev device fb0/device/ is the Linux device (the VESA/EFI framebuffer or native PCI graphics device) fb0/device/subsystem is the Linux devices' subsystem.

The subsystem string is the path to the underlying bus. For PCI graphics cards it's something like

../../../bus/pci

and for VESA/EFI framebuffer devices it's

../../../bus/platform

That's more correct, reliable and also keeps the correct organization of the devices within the kernel.

Best regards
Thomas


--
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstrasse 146, 90461 Nuernberg, Germany
GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman
HRB 36809 (AG Nuernberg)