[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