[Skiboot] [PATCH 12/60] xive: Add locking to some API calls
Benjamin Herrenschmidt
benh at kernel.crashing.org
Thu Dec 22 14:16:20 AEDT 2016
The interrupt allocation calls might happen from threaded inits
and the EQ management can happen from Linux. The underlying cache
management will require mutual exclusion.
Signed-off-by: Benjamin Herrenschmidt <benh at kernel.crashing.org>
---
hw/xive.c | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/hw/xive.c b/hw/xive.c
index 5a31828..7df699d 100644
--- a/hw/xive.c
+++ b/hw/xive.c
@@ -1265,6 +1265,8 @@ uint32_t xive_alloc_hw_irqs(uint32_t chip_id, uint32_t count, uint32_t align)
x = chip->xive;
assert(x);
+ lock(&x->lock);
+
/* Allocate the HW interrupts */
base = x->int_hw_bot - count;
base &= ~(align - 1);
@@ -1272,6 +1274,7 @@ uint32_t xive_alloc_hw_irqs(uint32_t chip_id, uint32_t count, uint32_t align)
xive_err(x,
"HW alloc request for %d interrupts aligned to %d failed\n",
count, align);
+ unlock(&x->lock);
return XIVE_IRQ_ERROR;
}
x->int_hw_bot = base;
@@ -1285,6 +1288,8 @@ uint32_t xive_alloc_hw_irqs(uint32_t chip_id, uint32_t count, uint32_t align)
ive->w = IVE_VALID | IVE_MASKED | SETFIELD(IVE_EQ_DATA, 0ul, base + i);
}
+
+ unlock(&x->lock);
return base;
}
@@ -1300,6 +1305,8 @@ uint32_t xive_alloc_ipi_irqs(uint32_t chip_id, uint32_t count, uint32_t align)
x = chip->xive;
assert(x);
+ lock(&x->lock);
+
/* Allocate the IPI interrupts */
base = x->int_ipi_top + (align - 1);
base &= ~(align - 1);
@@ -1307,6 +1314,7 @@ uint32_t xive_alloc_ipi_irqs(uint32_t chip_id, uint32_t count, uint32_t align)
xive_err(x,
"IPI alloc request for %d interrupts aligned to %d failed\n",
count, align);
+ unlock(&x->lock);
return XIVE_IRQ_ERROR;
}
x->int_ipi_top = base + count;
@@ -1322,6 +1330,7 @@ uint32_t xive_alloc_ipi_irqs(uint32_t chip_id, uint32_t count, uint32_t align)
SETFIELD(IVE_EQ_DATA, 0ul, base + i);
}
+ unlock(&x->lock);
return base;
}
@@ -1523,6 +1532,8 @@ static bool xive_set_eq_info(uint32_t isn, uint32_t target, uint8_t prio)
return false;
}
+ lock(&x->lock);
+
/* Are we masking ? */
if (prio == 0xff) {
/* Masking, just set the M bit */
@@ -1539,6 +1550,7 @@ static bool xive_set_eq_info(uint32_t isn, uint32_t target, uint8_t prio)
if (!xive_eq_for_target(target, prio, &eq_blk, &eq_idx)) {
xive_err(x, "Can't find EQ for target/prio 0x%x/%d\n",
target, prio);
+ unlock(&x->lock);
return false;
}
@@ -1558,6 +1570,7 @@ static bool xive_set_eq_info(uint32_t isn, uint32_t target, uint8_t prio)
/* Scrub IVE from cache */
xive_ivc_scrub(x, x->chip_id, GIRQ_TO_IDX(isn));
+ unlock(&x->lock);
return true;
}
--
2.9.3
More information about the Skiboot
mailing list