[Skiboot] [PATCH v2 10/17] xive/p9: fix EQ bitmap assignment when allocation fails
Cédric Le Goater
clg at kaod.org
Fri Sep 13 03:22:11 AEST 2019
Wehn allocating a EQ set for a VP, the EQ base index bit is marked as
allocated even if allocation fails, due to a lack of available pages.
Move bit assignment at the end of xive_alloc_eq_set().
Signed-off-by: Cédric Le Goater <clg at kaod.org>
---
hw/xive.c | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/hw/xive.c b/hw/xive.c
index a1a587075804..cb72d5ad7348 100644
--- a/hw/xive.c
+++ b/hw/xive.c
@@ -831,6 +831,7 @@ static uint32_t xive_alloc_eq_set(struct xive *x, bool alloc_indirect)
{
uint32_t ind_idx;
int idx;
+ int eq_base_idx;
xive_vdbg(x, "Allocating EQ set...\n");
@@ -842,14 +843,13 @@ static uint32_t xive_alloc_eq_set(struct xive *x, bool alloc_indirect)
xive_dbg(x, "Allocation from EQ bitmap failed !\n");
return XIVE_ALLOC_NO_SPACE;
}
- bitmap_set_bit(*x->eq_map, idx);
- idx <<= 3;
+ eq_base_idx = idx << 3;
- xive_vdbg(x, "Got EQs 0x%x..0x%x\n", idx, idx + 7);
+ xive_vdbg(x, "Got EQs 0x%x..0x%x\n", eq_base_idx, eq_base_idx + 7);
/* Calculate the indirect page where the EQs reside */
- ind_idx = idx / EQ_PER_PAGE;
+ ind_idx = eq_base_idx / EQ_PER_PAGE;
/* Is there an indirect page ? If not, check if we can provision it */
if (!x->eq_ind_base[ind_idx]) {
@@ -884,14 +884,15 @@ static uint32_t xive_alloc_eq_set(struct xive *x, bool alloc_indirect)
/* Any cache scrub needed ? */
}
- return idx;
+ bitmap_set_bit(*x->eq_map, idx);
+ return eq_base_idx;
}
static void xive_free_eq_set(struct xive *x, uint32_t eqs)
{
uint32_t idx;
- xive_vdbg(x, "Freeing EQ set...\n");
+ xive_vdbg(x, "Freeing EQ 0x%x..0x%x\n", eqs, eqs + 7);
assert((eqs & 7) == 0);
assert(x->eq_map);
--
2.21.0
More information about the Skiboot
mailing list