]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
irqchip/gic-v3-its: Properly handle command queue wrapping
authorMarc Zyngier <marc.zyngier@arm.com>
Sat, 19 Aug 2017 09:16:02 +0000 (10:16 +0100)
committerMarc Zyngier <marc.zyngier@arm.com>
Sat, 19 Aug 2017 09:16:02 +0000 (10:16 +0100)
wait_for_range_completion() is nicely busted when handling
wrapping of the command queue, leading to an early exit
instead of waiting for the command to have been executed.

Fortunately, the impact is pretty minor, as it only impair
the detection of an ITS that doesn't make any forward progress
for a whole second. And an ITS should *never* lock up.

Reported-by: Yang Yingliang <yangyingliang@huawei.com>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
drivers/irqchip/irq-gic-v3-its.c

index 68932873eebc0c3d14caa00b048d0c961e765a98..350a959da6dd59e13e06f4c5cf23a634386d0150 100644 (file)
@@ -453,7 +453,13 @@ static void its_wait_for_range_completion(struct its_node *its,
 
        while (1) {
                rd_idx = readl_relaxed(its->base + GITS_CREADR);
-               if (rd_idx >= to_idx || rd_idx < from_idx)
+
+               /* Direct case */
+               if (from_idx < to_idx && rd_idx >= to_idx)
+                       break;
+
+               /* Wrapped case */
+               if (from_idx >= to_idx && rd_idx >= to_idx && rd_idx < from_idx)
                        break;
 
                count--;