Skip to content

Commit e6890f6

Browse files
committed
i915: disable interrupts before tearing down GEM state
Reinette Chatre reports a frozen system (with blinking keyboard LEDs) when switching from graphics mode to the text console, or when suspending (which does the same thing). With netconsole, the oops turned out to be BUG: unable to handle kernel NULL pointer dereference at 0000000000000084 IP: [<ffffffffa03ecaab>] i915_driver_irq_handler+0x26b/0xd20 [i915] and it's due to the i915_gem.c code doing drm_irq_uninstall() after having done i915_gem_idle(). And the i915_gem_idle() path will do i915_gem_idle() -> i915_gem_cleanup_ringbuffer() -> i915_gem_cleanup_hws() -> dev_priv->hw_status_page = NULL; but if an i915 interrupt comes in after this stage, it may want to access that hw_status_page, and gets the above NULL pointer dereference. And since the NULL pointer dereference happens from within an interrupt, and with the screen still in graphics mode, the common end result is simply a silently hung machine. Fix it by simply uninstalling the irq handler before idling rather than after. Fixes http://bugzilla.kernel.org/show_bug.cgi?id=13819 Reported-and-tested-by: Reinette Chatre <[email protected]> Acked-by: Jesse Barnes <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent 7c8460d commit e6890f6

File tree

1 file changed

+1
-5
lines changed

1 file changed

+1
-5
lines changed

drivers/gpu/drm/i915/i915_gem.c

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4232,15 +4232,11 @@ int
42324232
i915_gem_leavevt_ioctl(struct drm_device *dev, void *data,
42334233
struct drm_file *file_priv)
42344234
{
4235-
int ret;
4236-
42374235
if (drm_core_check_feature(dev, DRIVER_MODESET))
42384236
return 0;
42394237

4240-
ret = i915_gem_idle(dev);
42414238
drm_irq_uninstall(dev);
4242-
4243-
return ret;
4239+
return i915_gem_idle(dev);
42444240
}
42454241

42464242
void

0 commit comments

Comments
 (0)