]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
media: mantis: prevent staying forever in a loop at IRQ
authorMauro Carvalho Chehab <mchehab@s-opensource.com>
Thu, 12 Apr 2018 12:28:33 +0000 (08:28 -0400)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Tue, 17 Apr 2018 09:50:05 +0000 (05:50 -0400)
As warned by smatch:
drivers/media/pci/mantis/mantis_uart.c:105 mantis_uart_work() warn: this loop depends on readl() succeeding

If something goes wrong at readl(), the logic will stay there
inside an IRQ code forever. This is not the nicest thing to
do :-)

So, add a timeout there, preventing staying inside the IRQ
for more than 10ms.

Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
drivers/media/pci/mantis/mantis_uart.c

index 18f81c13599622ec6ace576259feb2075e2f7444..b7765687e0c30310db5b125bcfdf21b12de53758 100644 (file)
@@ -92,6 +92,7 @@ static void mantis_uart_work(struct work_struct *work)
 {
        struct mantis_pci *mantis = container_of(work, struct mantis_pci, uart_work);
        u32 stat;
+       unsigned long timeout;
 
        stat = mmread(MANTIS_UART_STAT);
 
@@ -102,9 +103,15 @@ static void mantis_uart_work(struct work_struct *work)
         * MANTIS_UART_RXFIFO_DATA is only set if at least
         * config->bytes + 1 bytes are in the FIFO.
         */
+
+       /* FIXME: is 10ms good enough ? */
+       timeout = jiffies +  msecs_to_jiffies(10);
        while (stat & MANTIS_UART_RXFIFO_DATA) {
                mantis_uart_read(mantis);
                stat = mmread(MANTIS_UART_STAT);
+
+               if (!time_is_after_jiffies(timeout))
+                       break;
        }
 
        /* re-enable UART (RX) interrupt */