aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/irqchip/irq-gic-v3-its.c
diff options
context:
space:
mode:
authorMarc Zyngier <marc.zyngier@arm.com>2017-08-19 10:16:02 +0100
committerMarc Zyngier <marc.zyngier@arm.com>2017-08-19 10:16:02 +0100
commit9bdd8b1cdeb6a873acb1d1e915d372e3440a4179 (patch)
treec14a3d8d728e535fb4441f063678cc516b42daf0 /drivers/irqchip/irq-gic-v3-its.c
parentirqchip/armada-370-xp: Enable MSI-X support (diff)
downloadlinux-dev-9bdd8b1cdeb6a873acb1d1e915d372e3440a4179.tar.xz
linux-dev-9bdd8b1cdeb6a873acb1d1e915d372e3440a4179.zip
irqchip/gic-v3-its: Properly handle command queue wrapping
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>
Diffstat (limited to 'drivers/irqchip/irq-gic-v3-its.c')
-rw-r--r--drivers/irqchip/irq-gic-v3-its.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
index 68932873eebc..350a959da6dd 100644
--- a/drivers/irqchip/irq-gic-v3-its.c
+++ b/drivers/irqchip/irq-gic-v3-its.c
@@ -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--;