lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20110502004940.2307.71738.stgit@ul30vt.home>
Date:	Sun, 01 May 2011 18:49:46 -0600
From:	Alex Williamson <alex.williamson@...hat.com>
To:	airlied@...ux.ie, dri-devel@...ts.freedesktop.org
Cc:	alex.williamson@...hat.com, linux-kernel@...r.kernel.org
Subject: [PATCH 2/2] drm/nouveau: Check that the device is enabled before
 processing interrupt

We're likely to be sharing an interrupt line with other devices,
which means our handler might get called after we've turned off
the device via vga switcheroo.  This can lead to all sorts of
badness, like nv04_fifo_isr() spewing "PFIFO still angry after
100 spins, halt" to the console before the system enters a hard
hang.

We can avoid this by simply checking if the device is still
enabled before processing an interrupt.  To avoid races, flush
any inflight interrupts using synchronize_irq().  Note that
since pci_intx() is called after pci_save_state(),
pci_restore_state() will automatically re-enable INTx.

Signed-off-by: Alex Williamson <alex.williamson@...hat.com>
---

 drivers/gpu/drm/nouveau/nouveau_drv.c |    2 ++
 drivers/gpu/drm/nouveau/nouveau_irq.c |    3 +++
 2 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.c b/drivers/gpu/drm/nouveau/nouveau_drv.c
index 155ebdc..405d4f1 100644
--- a/drivers/gpu/drm/nouveau/nouveau_drv.c
+++ b/drivers/gpu/drm/nouveau/nouveau_drv.c
@@ -230,7 +230,9 @@ nouveau_pci_suspend(struct pci_dev *pdev, pm_message_t pm_state)
 	NV_INFO(dev, "And we're gone!\n");
 	pci_save_state(pdev);
 	if (pm_state.event == PM_EVENT_SUSPEND) {
+		pci_intx(pdev, 0);
 		pci_disable_device(pdev);
+		synchronize_irq(drm_dev_to_irq(dev));
 		pci_set_power_state(pdev, PCI_D3hot);
 	}
 
diff --git a/drivers/gpu/drm/nouveau/nouveau_irq.c b/drivers/gpu/drm/nouveau/nouveau_irq.c
index 2ba7265..8fd17e6 100644
--- a/drivers/gpu/drm/nouveau/nouveau_irq.c
+++ b/drivers/gpu/drm/nouveau/nouveau_irq.c
@@ -78,6 +78,9 @@ nouveau_irq_handler(DRM_IRQ_ARGS)
 	u32 stat;
 	int i;
 
+	if (unlikely(!pci_is_enabled(dev->pdev)))
+		return IRQ_NONE;
+
 	stat = nv_rd32(dev, NV03_PMC_INTR_0);
 	if (!stat)
 		return IRQ_NONE;

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ