diff options
author | Cédric Le Goater <clg@kaod.org> | 2019-10-01 08:59:54 +0200 |
---|---|---|
committer | Oliver O'Halloran <oohall@gmail.com> | 2019-11-04 10:52:47 +1100 |
commit | 4f0a563377dfddb6d1b17b8907089ef2bd4aa602 (patch) | |
tree | 9a76019d1a3b28d0282d0b344f1a054ed5ae65a9 /hw/xive.c | |
parent | ad7e9a67c4e4a39ce0605d45c55728404c66535e (diff) | |
download | skiboot-4f0a563377dfddb6d1b17b8907089ef2bd4aa602.zip skiboot-4f0a563377dfddb6d1b17b8907089ef2bd4aa602.tar.gz skiboot-4f0a563377dfddb6d1b17b8907089ef2bd4aa602.tar.bz2 |
xive/p9: fix EQ bitmap assignment when allocation fails
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>
Diffstat (limited to 'hw/xive.c')
-rw-r--r-- | hw/xive.c | 13 |
1 files changed, 7 insertions, 6 deletions
@@ -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"); @@ -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]) { @@ -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); |