Commit 3203cb86 authored by Maxim Levitsky's avatar Maxim Levitsky Committed by Mauro Carvalho Chehab

V4L/DVB (6668): Fix theoretical races between IRQ handler and .suspend/resume

*dev->insuspend = 1 should be set before synchronize_irq
 *ACK interrupts after synchronize_irq, to make sure there aren't
 pending interrupts.
 *Add barrier before we restart interrupts so the handler will 100%
 see the dev->insuspend
Signed-off-by: default avatarMaxim Levitsky <maximlevitsky@gmail.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent 0d65cd4f
...@@ -1181,8 +1181,13 @@ static int saa7134_suspend(struct pci_dev *pci_dev , pm_message_t state) ...@@ -1181,8 +1181,13 @@ static int saa7134_suspend(struct pci_dev *pci_dev , pm_message_t state)
saa_writel(SAA7134_IRQ2, 0); saa_writel(SAA7134_IRQ2, 0);
saa_writel(SAA7134_MAIN_CTRL, 0); saa_writel(SAA7134_MAIN_CTRL, 0);
synchronize_irq(pci_dev->irq);
dev->insuspend = 1; dev->insuspend = 1;
synchronize_irq(pci_dev->irq);
/* ACK interrupts once more, just in case,
since the IRQ handler won't ack them anymore*/
saa_writel(SAA7134_IRQ_REPORT, saa_readl(SAA7134_IRQ_REPORT));
/* Disable timeout timers - if we have active buffers, we will /* Disable timeout timers - if we have active buffers, we will
fill them on resume*/ fill them on resume*/
...@@ -1246,6 +1251,7 @@ static int saa7134_resume(struct pci_dev *pci_dev) ...@@ -1246,6 +1251,7 @@ static int saa7134_resume(struct pci_dev *pci_dev)
/* start DMA now*/ /* start DMA now*/
dev->insuspend = 0; dev->insuspend = 0;
smp_wmb();
saa7134_set_dmabits(dev); saa7134_set_dmabits(dev);
spin_unlock_irqrestore(&dev->slock, flags); spin_unlock_irqrestore(&dev->slock, flags);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment