Reviewed-by: Glenn Miles <mil...@linux.ibm.com>
On Mon, 2025-05-12 at 13:10 +1000, Nicholas Piggin wrote:
> When the pool context is pulled, the shared pool/phys signal is
> reset, which loses the qemu irq if a phys interrupt was presented.
>
> Only reset the signal if a poll irq was presented.
>
> Signed-off-by: Nicholas Piggin <npig...@gmail.com>
> ---
> hw/intc/xive2.c | 18 ++++++++++--------
> 1 file changed, 10 insertions(+), 8 deletions(-)
>
> diff --git a/hw/intc/xive2.c b/hw/intc/xive2.c
> index d899c1fb14..aeeb901b6a 100644
> --- a/hw/intc/xive2.c
> +++ b/hw/intc/xive2.c
> @@ -727,20 +727,22 @@ static uint64_t xive2_tm_pull_ctx(XivePresenter *xptr,
> XiveTCTX *tctx,
> xive2_redistribute(xrtr, tctx, cur_ring);
> }
> }
> +
> + /*
> + * Lower external interrupt line of requested ring and below except
> for
> + * USER, which doesn't exist.
> + */
> + if (xive_nsr_indicates_exception(cur_ring, nsr)) {
> + if (cur_ring == xive_nsr_exception_ring(cur_ring, nsr)) {
> + xive_tctx_reset_signal(tctx, cur_ring);
> + }
> + }
> }
>
> if (xive2_router_get_config(xrtr) & XIVE2_VP_SAVE_RESTORE && do_save) {
> xive2_tctx_save_ctx(xrtr, tctx, ring, nvp_blk, nvp_idx);
> }
>
> - /*
> - * Lower external interrupt line of requested ring and below except for
> - * USER, which doesn't exist.
> - */
> - for (cur_ring = TM_QW1_OS; cur_ring <= ring;
> - cur_ring += XIVE_TM_RING_SIZE) {
> - xive_tctx_reset_signal(tctx, cur_ring);
> - }
> return target_ringw2;
> }
>