qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 42/50] ppc/xive: Redistribute phys after pulling of pool cont


From: Mike Kowal
Subject: Re: [PATCH 42/50] ppc/xive: Redistribute phys after pulling of pool context
Date: Thu, 15 May 2025 10:46:25 -0500
User-agent: Mozilla Thunderbird


On 5/11/2025 10:10 PM, Nicholas Piggin wrote:
After pulling the pool context, if a pool irq had been presented and
was cleared in the process, there could be a pending irq in phys that
should be presented. Process the phys irq ring after pulling pool ring
to catch this case and avoid losing irqs.

Reviewed-by: Michael Kowal<kowal@linux.ibm.com>

Thanks,  MAK

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
  hw/intc/xive.c  |  3 +++
  hw/intc/xive2.c | 16 ++++++++++++++--
  2 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/hw/intc/xive.c b/hw/intc/xive.c
index 81af59f0ec..aeca66e56e 100644
--- a/hw/intc/xive.c
+++ b/hw/intc/xive.c
@@ -320,6 +320,9 @@ static uint64_t xive_tm_pull_pool_ctx(XivePresenter *xptr, 
XiveTCTX *tctx,
xive_tctx_reset_signal(tctx, TM_QW1_OS);
      xive_tctx_reset_signal(tctx, TM_QW2_HV_POOL);
+    /* Re-check phys for interrupts if pool was disabled */
+    xive_tctx_pipr_recompute_from_ipb(tctx, TM_QW3_HV_PHYS);
+
      return qw2w2;
  }
diff --git a/hw/intc/xive2.c b/hw/intc/xive2.c
index aeeb901b6a..917ecbaae4 100644
--- a/hw/intc/xive2.c
+++ b/hw/intc/xive2.c
@@ -683,6 +683,8 @@ static void xive2_redistribute(Xive2Router *xrtr, XiveTCTX 
*tctx, uint8_t ring)
      xive_tctx_reset_signal(tctx, ring);
  }
+static void xive2_tctx_process_pending(XiveTCTX *tctx, uint8_t sig_ring);
+
  static uint64_t xive2_tm_pull_ctx(XivePresenter *xptr, XiveTCTX *tctx,
                                    hwaddr offset, unsigned size, uint8_t ring)
  {
@@ -739,6 +741,18 @@ static uint64_t xive2_tm_pull_ctx(XivePresenter *xptr, 
XiveTCTX *tctx,
          }
      }
+ if (ring == TM_QW2_HV_POOL) {
+        /* Re-check phys for interrupts if pool was disabled */
+        nsr = tctx->regs[TM_QW3_HV_PHYS + TM_NSR];
+        if (xive_nsr_indicates_exception(TM_QW3_HV_PHYS, nsr)) {
+            /* Ring must be PHYS because POOL would have been redistributed */
+            g_assert(xive_nsr_exception_ring(TM_QW3_HV_PHYS, nsr) ==
+                                                           TM_QW3_HV_PHYS);
+        } else {
+            xive2_tctx_process_pending(tctx, TM_QW3_HV_PHYS);
+        }
+    }
+
      if (xive2_router_get_config(xrtr) & XIVE2_VP_SAVE_RESTORE && do_save) {
          xive2_tctx_save_ctx(xrtr, tctx, ring, nvp_blk, nvp_idx);
      }
@@ -925,8 +939,6 @@ static uint8_t xive2_tctx_restore_ctx(Xive2Router *xrtr, 
XiveTCTX *tctx,
      return cppr;
  }
-static void xive2_tctx_process_pending(XiveTCTX *tctx, uint8_t sig_ring);
-
  static void xive2_tctx_need_resend(Xive2Router *xrtr, XiveTCTX *tctx,
                                     uint8_t nvp_blk, uint32_t nvp_idx,
                                     bool do_restore)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]