mirror of https://gitee.com/openkylin/linux.git
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: Maxim Levitsky <maximlevitsky@gmail.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
parent
0d65cd4f2b
commit
3203cb86d2
|
@ -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_MAIN_CTRL, 0);
|
||||
|
||||
synchronize_irq(pci_dev->irq);
|
||||
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
|
||||
fill them on resume*/
|
||||
|
@ -1246,6 +1251,7 @@ static int saa7134_resume(struct pci_dev *pci_dev)
|
|||
|
||||
/* start DMA now*/
|
||||
dev->insuspend = 0;
|
||||
smp_wmb();
|
||||
saa7134_set_dmabits(dev);
|
||||
spin_unlock_irqrestore(&dev->slock, flags);
|
||||
|
||||
|
|
Loading…
Reference in New Issue