[Intel-gfx] KMS libdrm crash
Peter Clifton
pcjc2 at cam.ac.uk
Sat Jan 2 15:14:30 CET 2010
Hi guys,
I know this belongs in a bug report, but lets first figure out what /
where the fault lies.. then I might be able to figure out where to file
it.
I've BCC'd ubuntu-x, as I'm testing their "xorg-edgers" stuff, and
wanted them to be aware of this, but don't think they need to remain on
the 'CC list for all replies.
I've been seeing intermittent crashes on X start-up with the latest
code. (GM45)
git HEAD 2D driver, libdrm, and "drm-intel-next" branch from
git://git.kernel.org/pub/scm/linux/kernel/git/anholt/drm-intel
(Is this the right place to get the latest from?)..
Anyway.. I managed to persuade apport to get a retrace. (It was
uncooperative at first though).
This is the backtrace:
#0 drmmode_ConvertFromKMode (scrn=<value optimised out>, kmode=0x0,
mode=0x87b0554) at ../../src/drmmode_display.c:240
240 mode->Clock = kmode->clock;
(gdb) #
(gdb) bt
#0 drmmode_ConvertFromKMode (scrn=<value optimised out>, kmode=0x0, mode=0x87b0554) at ../../src/drmmode_display.c:240
#1 0x001cc335 in drmmode_output_get_modes (output=0x87ab5e8) at ../../src/drmmode_display.c:836
#2 0x080cbb56 in xf86ProbeOutputModes (scrn=0x8797c88, maxX=8192, maxY=8192) at ../../../../hw/xfree86/modes/xf86Crtc.c:1607
#3 0x080cc551 in xf86InitialConfiguration (scrn=0x8797c88, canGrow=1) at ../../../../hw/xfree86/modes/xf86Crtc.c:2358
#4 0x001cdfd3 in drmmode_pre_init (scrn=0x8797c88, fd=9, cpp=4) at ../../src/drmmode_display.c:1417
#5 0x001b3455 in I830DrmModeInit (scrn=0x8797c88, flags=<value optimised out>) at ../../src/i830_driver.c:779
#6 I830PreInit (scrn=0x8797c88, flags=<value optimised out>) at ../../src/i830_driver.c:910
#7 0x080b6fa8 in InitOutput (pScreenInfo=0x81fd460, argc=8, argv=0xbfeb0ed4) at ../../../../hw/xfree86/common/xf86Init.c:841
#8 0x08066b3b in main (argc=8, argv=0xbfeb0ed4, envp=0xbfeb0ef8) at ../../dix/main.c:205
Looking at frame 1,
(gdb) frame 1
(gdb) print *koutput
$2 = {connector_id = 15, encoder_id = 0, connector_type = 6,
connector_type_id = 1, connection = DRM_MODE_CONNECTED, mmWidth = 0,
mmHeight = 0, subpixel = DRM_MODE_SUBPIXEL_UNKNOWN, count_modes = 4,
modes = 0x0, count_props = 7, props = 0x8798438, prop_values = 0x87ab8e8,
count_encoders = 1, encoders = 0x87ab280}
We see that the "modes" list is NULL, but count_modes is 4. That is why
the crash occurs when we access the modes array.
Having instrumented the drmmode_output_get_modes() function, I
discovered that in some cases the first call to the
DRM_IOCTL_MODE_GETCONNECTOR ioctl indeed returns count_modes = 0, so no
memory is allocated for modes to be returned.
Upon the subsequent ioctl to fill in the details, magically the drm
driver can now find some modes - and it returns a positive mode count.
Since no memory was allocated to store them, it can't return the data.
So.. looks like libdrm / kernel code assume the mode list doesn't change
between ioctls - it clearly does -> BUG.
Or.. should it not change?
On this machine, I get intermittent (false) detection of TV-out modes,
in spite having no TV connected. Just running xrandr 10 times in a row
gave many different outputs, e.g.:
---------------------------
TV1 disconnected (normal left inverted right x axis y axis)
---------------------------
TV1 connected 1360x768+1680+0 (normal left inverted right x axis y axis)
0mm x 0mm
1360x768 59.8*
1152x864 60.0
1024x768 60.0
800x600 60.3
640x480 59.9
---------------------------
TV1 connected 848x480+1680+0 (normal left inverted right x axis y axis)
0mm x 0mm
848x480 30.0*+
640x480 30.0 +
1024x768 30.0
800x600 30.0
---------------------------
TV1 disconnected (normal left inverted right x axis y axis)
848x480 (0x12d) 14.5MHz
h: width 848 start 849 end 912 total 944 skew 0 clock 15.4KHz
v: height 480 start 481 end 512 total 513 clock 30.0Hz
---------------------------
This is clearly also a bug, but it would seem that there is still an
issue with the DRM_IOCTL_MODE_GETCONNECTOR ioctl.
Is there anything I can do to debug this further?
Disable the TV-out port temporarily to avoid the crashes?
(For now I just patched libdrm to be smarter about not crashing).
Make TV out detection more robust? (Is that the correct fix, or does it
still leave a race condition?)
Let me know what other details you want.
Best regards
Peter Clifton.
More information about the Intel-gfx
mailing list