[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 07/30] ppc/xive: Always recompute the PIPR when pushing an OS cont
From: |
Daniel Henrique Barboza |
Subject: |
[PULL 07/30] ppc/xive: Always recompute the PIPR when pushing an OS context |
Date: |
Thu, 5 May 2022 15:49:15 -0300 |
From: Frederic Barrat <fbarrat@linux.ibm.com>
The Post Interrupt Priority Register (PIPR) is not restored like the
other OS-context related fields of the TIMA when pushing an OS context
on the CPU. It's not needed because it can be calculated from the
Interrupt Pending Buffer (IPB), which is saved and restored. The PIPR
must therefore always be recomputed when pushing an OS context.
This patch fixes a path on P9 and P10 where it was not done. If there
was a pending interrupt when the OS context was pulled, the IPB was
saved correctly. When pushing back the context, the code in
xive_tctx_need_resend() was checking for a interrupt raised while the
context was not on the CPU, saved in the NVT. If one was found, then
it was merged with the saved IPB and the PIPR updated and everything
was fine. However, if there was no interrupt found in the NVT, then
xive_tctx_ipb_update() was not being called and the PIPR was not
updated. This patch fixes it by always calling xive_tctx_ipb_update().
Note that on P10 (xive2.c) and because of the above, there's no longer
any need to check the CPPR value so it can go away.
Reviewed-by: Cédric Le Goater <clg@kaod.org>
Signed-off-by: Frederic Barrat <fbarrat@linux.ibm.com>
Message-Id: <20220429071620.177142-2-fbarrat@linux.ibm.com>
Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
---
hw/intc/xive.c | 11 ++++++++---
hw/intc/xive2.c | 16 +++++++++-------
2 files changed, 17 insertions(+), 10 deletions(-)
diff --git a/hw/intc/xive.c b/hw/intc/xive.c
index b8e4c7294d..c729f6a478 100644
--- a/hw/intc/xive.c
+++ b/hw/intc/xive.c
@@ -413,10 +413,15 @@ static void xive_tctx_need_resend(XiveRouter *xrtr,
XiveTCTX *tctx,
/* Reset the NVT value */
nvt.w4 = xive_set_field32(NVT_W4_IPB, nvt.w4, 0);
xive_router_write_nvt(xrtr, nvt_blk, nvt_idx, &nvt, 4);
-
- /* Merge in current context */
- xive_tctx_ipb_update(tctx, TM_QW1_OS, ipb);
}
+ /*
+ * Always call xive_tctx_ipb_update(). Even if there were no
+ * escalation triggered, there could be a pending interrupt which
+ * was saved when the context was pulled and that we need to take
+ * into account by recalculating the PIPR (which is not
+ * saved/restored).
+ */
+ xive_tctx_ipb_update(tctx, TM_QW1_OS, ipb);
}
/*
diff --git a/hw/intc/xive2.c b/hw/intc/xive2.c
index 3aff42a69e..400fd70aa8 100644
--- a/hw/intc/xive2.c
+++ b/hw/intc/xive2.c
@@ -316,7 +316,6 @@ static void xive2_tctx_need_resend(Xive2Router *xrtr,
XiveTCTX *tctx,
{
Xive2Nvp nvp;
uint8_t ipb;
- uint8_t cppr = 0;
/*
* Grab the associated thread interrupt context registers in the
@@ -337,7 +336,7 @@ static void xive2_tctx_need_resend(Xive2Router *xrtr,
XiveTCTX *tctx,
/* Automatically restore thread context registers */
if (xive2_router_get_config(xrtr) & XIVE2_VP_SAVE_RESTORE &&
do_restore) {
- cppr = xive2_tctx_restore_os_ctx(xrtr, tctx, nvp_blk, nvp_idx, &nvp);
+ xive2_tctx_restore_os_ctx(xrtr, tctx, nvp_blk, nvp_idx, &nvp);
}
ipb = xive_get_field32(NVP2_W2_IPB, nvp.w2);
@@ -345,11 +344,14 @@ static void xive2_tctx_need_resend(Xive2Router *xrtr,
XiveTCTX *tctx,
nvp.w2 = xive_set_field32(NVP2_W2_IPB, nvp.w2, 0);
xive2_router_write_nvp(xrtr, nvp_blk, nvp_idx, &nvp, 2);
}
-
- /* An IPB or CPPR change can trigger a resend */
- if (ipb || cppr) {
- xive_tctx_ipb_update(tctx, TM_QW1_OS, ipb);
- }
+ /*
+ * Always call xive_tctx_ipb_update(). Even if there were no
+ * escalation triggered, there could be a pending interrupt which
+ * was saved when the context was pulled and that we need to take
+ * into account by recalculating the PIPR (which is not
+ * saved/restored).
+ */
+ xive_tctx_ipb_update(tctx, TM_QW1_OS, ipb);
}
/*
--
2.32.0
- [PULL 00/30] ppc queue, Daniel Henrique Barboza, 2022/05/05
- [PULL 01/30] target/ppc: initialize 'val' union in kvm_get_one_spr(), Daniel Henrique Barboza, 2022/05/05
- [PULL 02/30] target/ppc: init 'lpcr' in kvmppc_enable_cap_large_decr(), Daniel Henrique Barboza, 2022/05/05
- [PULL 04/30] target/ppc: init 'rmmu_info' in kvm_get_radix_page_info(), Daniel Henrique Barboza, 2022/05/05
- [PULL 03/30] target/ppc: init 'sregs' in kvmppc_put_books_sregs(), Daniel Henrique Barboza, 2022/05/05
- [PULL 05/30] target/ppc: Fix BookE debug interrupt generation, Daniel Henrique Barboza, 2022/05/05
- [PULL 06/30] vhost-user: Use correct macro name TARGET_PPC64, Daniel Henrique Barboza, 2022/05/05
- [PULL 08/30] ppc/xive: Update the state of the External interrupt signal, Daniel Henrique Barboza, 2022/05/05
- [PULL 10/30] target/ppc: Remove unused msr_* macros, Daniel Henrique Barboza, 2022/05/05
- [PULL 07/30] ppc/xive: Always recompute the PIPR when pushing an OS context,
Daniel Henrique Barboza <=
- [PULL 09/30] target/ppc: Remove fpscr_* macros from cpu.h, Daniel Henrique Barboza, 2022/05/05
- [PULL 14/30] target/ppc: Remove msr_ile macro, Daniel Henrique Barboza, 2022/05/05
- [PULL 15/30] target/ppc: Remove msr_ee macro, Daniel Henrique Barboza, 2022/05/05
- [PULL 18/30] target/ppc: Remove msr_me macro, Daniel Henrique Barboza, 2022/05/05
- [PULL 16/30] target/ppc: Remove msr_ce macro, Daniel Henrique Barboza, 2022/05/05
- [PULL 20/30] target/ppc: Remove msr_fp macro, Daniel Henrique Barboza, 2022/05/05
- [PULL 11/30] target/ppc: Remove msr_pr macro, Daniel Henrique Barboza, 2022/05/05
- [PULL 12/30] target/ppc: Remove msr_le macro, Daniel Henrique Barboza, 2022/05/05
- [PULL 13/30] target/ppc: Remove msr_ds macro, Daniel Henrique Barboza, 2022/05/05
- [PULL 17/30] target/ppc: Remove msr_pow macro, Daniel Henrique Barboza, 2022/05/05