[Intel-gfx] Deadlock in intel_enable_pipe_a()

Thomas Richter richter at rus.uni-stuttgart.de
Mon Jun 9 01:14:22 CEST 2014


Hi Ville, hi Daniel, dear intel experts,

just went through the problem I send around, and I guess I understand 
now what happens here. The reason *why* resume fails is that there is a 
deadlock situation in intel_display.c:

*) loading the module calls intel_modeset_init()
*) intel_modeset_init() calls intel_modeset_setup_hw_state(), but 
protects access to it with a global lock.
*) intel_modeset_setup_hw_state() calls intel_sanitize_crtc()
*) intel_sanitize_crtc() finds that the pipe-a quirk is enabled and 
calls intel_enable_pipe_a()
*) intel_enable_pipe_a() calls intel_release_load_detect_pipe(), however 
not using the same mutex context as the caller (intel_modeset_init()).
*) intel_release_load_detect_pipe() again gets the mutex of the crtc.

Unfortunately, at this time, the caller (intel_modeset_init()) had 
already everything locked.

Needless to say, this deadlocks and blocks the kernel completely, 
causing the problem I found above.

To verify my hypothesis, I removed the locks in 
intel_release_load_detect_pipe(), (obviously risking race conditions, 
but never mind for the test).

The result is that the machine is responsive after the resume. It still 
does not show a display (apparently, intel_sanitize_crtc() is 
insufficient and does not sanitize enough), but at least one can 
force-enable it again.

Thus, two bugs:

1) attempting to lock the same lock twice, nested, causing a deadlock. 
The pipe A quirk is not working correctly by requiring a call into a 
method that requires a lock that is already held.

2) not sanitizing the chipset sufficiently, still keeping the display 
black. (This, being, of course a side effect of the buggy bios).

Hope this helps!

Thomas




More information about the Intel-gfx mailing list