All of lore.kernel.org
 help / color / mirror / Atom feed
From: Marc Zyngier <maz@kernel.org>
To: Fuad Tabba <fuad.tabba@linux.dev>
Cc: Oliver Upton <oupton@kernel.org>, Joey Gouly <joey.gouly@arm.com>,
	Steffen Eiden <seiden@linux.ibm.com>,
	Suzuki K Poulose <suzuki.poulose@arm.com>,
	Zenghui Yu <yuzenghui@huawei.com>,
	Catalin Marinas <catalin.marinas@arm.com>,
	Will Deacon <will@kernel.org>,
	Mark Rutland <mark.rutland@arm.com>,
	Andre Przywara <andre.przywara@arm.com>,
	linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev,
	linux-kernel@vger.kernel.org, Fuad Tabba <tabba@google.com>
Subject: Re: [PATCH v2 2/2] KVM: arm64: vgic-its: Remove the pending state of a discarded LPI
Date: Fri, 16 Oct 2026 16:51:37 +0100	[thread overview]
Message-ID: <867bjh1w52.wl-maz@kernel.org> (raw)
In-Reply-To: <20261013081646.933312-3-fuad.tabba@linux.dev>

On Tue, 13 Oct 2026 09:16:46 +0100,
Fuad Tabba <fuad.tabba@linux.dev> wrote:
> 
> DISCARD removes the mapping of an event and instructs the Redistributor
> to remove the pending state of its LPI (IHI 0069H.b, 5.3.4). KVM only
> frees the ITE, so an LPI that is pending when the guest discards it
> stays queued on its target vCPU, and the guest still takes it.
> 
> Clear the pending state before freeing the ITE. A queued LPI can be
> pending in a running vCPU's list register, so halt the guest first when
> the LPI is queued, to fold that state back. A forwarded LPI already
> loses its pending state in its_free_ite(), whose unmap from the vPE
> sends a DISCARD to the host ITS.
> 
> Fixes: df9f58fbea9bc ("KVM: arm64: vgic-its: Implement ITS command queue command handlers")
> Suggested-by: Marc Zyngier <maz@kernel.org>
> Signed-off-by: Fuad Tabba <fuad.tabba@linux.dev>
> ---
>  arch/arm64/kvm/vgic/vgic-its.c | 24 +++++++++++++++++++-----
>  1 file changed, 19 insertions(+), 5 deletions(-)
> 
> diff --git a/arch/arm64/kvm/vgic/vgic-its.c b/arch/arm64/kvm/vgic/vgic-its.c
> index 44b92c01bc727..3b8e0e5b097e0 100644
> --- a/arch/arm64/kvm/vgic/vgic-its.c
> +++ b/arch/arm64/kvm/vgic/vgic-its.c
> @@ -829,13 +829,27 @@ static int vgic_its_cmd_handle_discard(struct kvm *kvm, struct vgic_its *its,
>  		struct its_device *device = find_its_device(its, device_id);
>  		int ite_esz = vgic_its_get_abi(its)->ite_esz;
>  		gpa_t gpa = device->itt_addr + ite->event_id * ite_esz;
> -		/*
> -		 * Though the spec talks about removing the pending state, we
> -		 * don't bother here since we clear the ITTE anyway and the
> -		 * pending state is a property of the ITTE struct.
> -		 */
> +		struct vgic_irq *irq = ite->irq;
> +		bool queued;
> +
>  		vgic_its_invalidate_cache(its);
>  
> +		/*
> +		 * A queued LPI can be pending in a running vCPU's list register,
> +		 * which the exit path folds back: halt the guest before clearing.
> +		 */
> +		scoped_guard(raw_spinlock_irqsave, &irq->irq_lock)
> +			queued = irq->vcpu;

Is this comment correct? This is only checking that the LPI is on the
AP list of a vcpu, not that it is in the LRs.

> +
> +		if (queued)
> +			kvm_arm_halt_guest(kvm);

And should we move this to kvm_pause_vcpu() instead of the big hammer,
this still works because

- we hold the ITS lock, so no MOVI can be issued on the same ITS

- mapping of the same LPI is already prevented by the previous patch,
  so no sneaky MOVI generated somewhere else can impact this LPI

Do you agree?

> +
> +		scoped_guard(raw_spinlock_irqsave, &irq->irq_lock)
> +			irq->pending_latch = false;
> +
> +		if (queued)
> +			kvm_arm_resume_guest(kvm);
> +
>  		its_free_ite(kvm, ite);
>  
>  		return vgic_its_write_entry_lock(its, gpa, 0ULL, ite);

If you're OK with the above, I'll make the corresponding changes as I
apply the patches.

Thanks,

	M.

-- 
Without deviation from the norm, progress is not possible.

  parent reply	other threads:[~2026-10-16 15:51 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-13  8:16 [PATCH v2 0/2] KVM: arm64: vgic-its: Fix LPI double mapping and DISCARD Fuad Tabba
2026-10-13  8:16 ` [PATCH v2 1/2] KVM: arm64: vgic-its: Don't map an LPI from more than one event Fuad Tabba
2026-10-13  8:16 ` [PATCH v2 2/2] KVM: arm64: vgic-its: Remove the pending state of a discarded LPI Fuad Tabba
2026-10-13  8:50   ` sashiko-bot
2026-10-13  9:49     ` Oliver Upton
2026-10-16 15:51   ` Marc Zyngier [this message]
2026-10-17  7:40     ` Fuad Tabba
2026-10-17  7:47       ` Fuad Tabba
2026-10-13  9:51 ` [PATCH v2 0/2] KVM: arm64: vgic-its: Fix LPI double mapping and DISCARD Oliver Upton
2026-10-13 10:01   ` Marc Zyngier
2026-10-13 10:50     ` Fuad Tabba
2026-10-13 11:16       ` Marc Zyngier
2026-10-13 12:59         ` Fuad Tabba
2026-10-13 13:25           ` Marc Zyngier
2026-10-13 14:33             ` Fuad Tabba
2026-10-14 13:34               ` Marc Zyngier
2026-10-14 15:20                 ` Fuad Tabba

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=867bjh1w52.wl-maz@kernel.org \
    --to=maz@kernel.org \
    --cc=andre.przywara@arm.com \
    --cc=catalin.marinas@arm.com \
    --cc=fuad.tabba@linux.dev \
    --cc=joey.gouly@arm.com \
    --cc=kvmarm@lists.linux.dev \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=oupton@kernel.org \
    --cc=seiden@linux.ibm.com \
    --cc=suzuki.poulose@arm.com \
    --cc=tabba@google.com \
    --cc=will@kernel.org \
    --cc=yuzenghui@huawei.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.