Skip to content

Commit

Permalink
xive/p9: fix EQ bitmap assignment when allocation fails
Browse files Browse the repository at this point in the history
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@kaod.org>
Signed-off-by: Oliver O'Halloran <oohall@gmail.com>
  • Loading branch information
legoater authored and oohal committed Nov 3, 2019
1 parent ad7e9a6 commit 4f0a563
Showing 1 changed file with 7 additions and 6 deletions.
13 changes: 7 additions & 6 deletions hw/xive.c
Expand Up @@ -832,6 +832,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");

Expand All @@ -843,14 +844,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]) {
Expand Down Expand Up @@ -885,14 +885,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);
Expand Down

0 comments on commit 4f0a563

Please sign in to comment.