diff options
author | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2017-12-12 16:22:51 +1100 |
---|---|---|
committer | Stewart Smith <stewart@linux.vnet.ibm.com> | 2017-12-11 23:31:45 -0600 |
commit | 2d98b41e4c30bc82ea61ceaa6cf1f895563b4cf1 (patch) | |
tree | 6f433b3e59d98059c3f37dd5be34eba33d659afa /hw/xive.c | |
parent | 5bb9d6f1e7dc0e38beb1db8f9f032a926310beac (diff) | |
download | skiboot-2d98b41e4c30bc82ea61ceaa6cf1f895563b4cf1.zip skiboot-2d98b41e4c30bc82ea61ceaa6cf1f895563b4cf1.tar.gz skiboot-2d98b41e4c30bc82ea61ceaa6cf1f895563b4cf1.tar.bz2 |
xive: Mark a freed IRQ's IVE as valid and masked
Removing the valid bit means a FIR will trip if it's accessed
inadvertently. Under some circumstances, the XIVE will speculatively
access an IVE for a masked interrupt and trip it. So make sure that
freed entries are still marked valid (but masked).
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Tested-by: Oliver O'Halloran <oohall@gmail.com>
Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
Diffstat (limited to 'hw/xive.c')
-rw-r--r-- | hw/xive.c | 2 |
1 files changed, 1 insertions, 1 deletions
@@ -4942,7 +4942,7 @@ static int64_t opal_xive_free_irq(uint32_t girq) xive_update_irq_mask(s, girq - s->esb_base, true); /* Mark the IVE masked and invalid */ - ive->w = IVE_MASKED; + ive->w = IVE_MASKED | IVE_VALID; xive_ivc_scrub(x, x->block_id, idx); /* Free it */ |