From: Zenghui Yu <yuzenghui@huawei.com>
To: Marc Zyngier <maz@kernel.org>
Cc: <linux-kernel@vger.kernel.org>,
<linux-arm-kernel@lists.infradead.org>,
Thomas Gleixner <tglx@linutronix.de>,
Kunkun Jiang <jiangkunkun@huawei.com>
Subject: Re: [PATCH] irqchip/gic-v4: Don't allow a VMOVP on a dying VPE
Date: Tue, 22 Oct 2024 15:45:17 +0800 [thread overview]
Message-ID: <aab45cd3-e5ca-58cf-e081-e32a17f5b4e7@huawei.com> (raw)
In-Reply-To: <20241002204959.2051709-1-maz@kernel.org>
Hi Marc,
On 2024/10/3 4:49, Marc Zyngier wrote:
> Kunkun Jiang reports that there is a small window of opportunity for
> userspace to force a change of affinity for a VPE while the VPE has
> already been unmapped, but the corresponding doorbell interrupt still
> visible in /proc/irq/.
>
> Plug the race by checking the value of vmapp_count, which tracks whether
> the VPE is mapped ot not, and returning an error in this case.
>
> This involves making vmapp_count common to both GICv4.1 and its v4.0
> ancestor.
>
> Reported-by: Kunkun Jiang <jiangkunkun@huawei.com>
> Signed-off-by: Marc Zyngier <maz@kernel.org>
> Link: https://lore.kernel.org/r/c182ece6-2ba0-ce4f-3404-dba7a3ab6c52@huawei.com
> ---
> drivers/irqchip/irq-gic-v3-its.c | 18 ++++++++++++------
> include/linux/irqchip/arm-gic-v4.h | 4 +++-
> 2 files changed, 15 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
> index fdec478ba5e7..ab597e74ba08 100644
> --- a/drivers/irqchip/irq-gic-v3-its.c
> +++ b/drivers/irqchip/irq-gic-v3-its.c
> @@ -797,8 +797,8 @@ static struct its_vpe *its_build_vmapp_cmd(struct its_node *its,
> its_encode_valid(cmd, desc->its_vmapp_cmd.valid);
>
> if (!desc->its_vmapp_cmd.valid) {
> + alloc = !atomic_dec_return(&desc->its_vmapp_cmd.vpe->vmapp_count);
> if (is_v4_1(its)) {
> - alloc = !atomic_dec_return(&desc->its_vmapp_cmd.vpe->vmapp_count);
> its_encode_alloc(cmd, alloc);
> /*
> * Unmapping a VPE is self-synchronizing on GICv4.1,
> @@ -817,13 +817,13 @@ static struct its_vpe *its_build_vmapp_cmd(struct its_node *its,
> its_encode_vpt_addr(cmd, vpt_addr);
> its_encode_vpt_size(cmd, LPI_NRBITS - 1);
>
> + alloc = !atomic_fetch_inc(&desc->its_vmapp_cmd.vpe->vmapp_count);
> +
> if (!is_v4_1(its))
> goto out;
>
> vconf_addr = virt_to_phys(page_address(desc->its_vmapp_cmd.vpe->its_vm->vprop_page));
>
> - alloc = !atomic_fetch_inc(&desc->its_vmapp_cmd.vpe->vmapp_count);
> -
> its_encode_alloc(cmd, alloc);
>
> /*
> @@ -3806,6 +3806,13 @@ static int its_vpe_set_affinity(struct irq_data *d,
> struct cpumask *table_mask;
> unsigned long flags;
>
> + /*
> + * Check if we're racing against a VPE being destroyed, for
> + * which we don't want to allow a VMOVP.
> + */
> + if (!atomic_read(&vpe->vmapp_count))
> + return -EINVAL;
We lazily map the vPE so that vmapp_count is likely to be 0 on GICv4.0
implementations with the ITSList feature. Seems that that implementation
is not affected by the reported race and we don't need to check
vmapp_count for that.
Testing rc4 on my 920 server triggers the WARN_ON() in vgic_v3_load().
void vgic_v3_load(struct kvm_vcpu *vcpu)
{
WARN_ON(vgic_v4_load(vcpu));
Thanks,
Zenghui
next prev parent reply other threads:[~2024-10-22 7:48 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-02 20:49 [PATCH] irqchip/gic-v4: Don't allow a VMOVP on a dying VPE Marc Zyngier
2024-10-02 22:17 ` Thomas Gleixner
2024-10-02 23:05 ` Marc Zyngier
2024-10-22 7:45 ` Zenghui Yu [this message]
2024-10-23 8:49 ` Marc Zyngier
2024-10-23 13:51 ` Zenghui Yu
2024-10-23 14:23 ` Marc Zyngier
2024-10-24 11:28 ` Zenghui Yu
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=aab45cd3-e5ca-58cf-e081-e32a17f5b4e7@huawei.com \
--to=yuzenghui@huawei.com \
--cc=jiangkunkun@huawei.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=maz@kernel.org \
--cc=tglx@linutronix.de \
/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.