From: Marc Zyngier <maz@kernel.org>
To: Zhou Wang <wangzhou1@hisilicon.com>
Cc: <kvmarm@lists.linux.dev>, <linux-arm-kernel@lists.infradead.org>,
<linux-kernel@vger.kernel.org>,
Thomas Gleixner <tglx@linutronix.de>,
Nianyao Tang <tangnianyao@huawei.com>
Subject: Re: [PATCH 3/3] irqchip/gic-v4: Make sure a VPE is locked when VMAPP is issued
Date: Fri, 19 Jul 2024 12:31:16 +0100 [thread overview]
Message-ID: <86h6cl39ff.wl-maz@kernel.org> (raw)
In-Reply-To: <2c9489cc-d276-7c52-5d52-7f234fdc726e@hisilicon.com>
On Fri, 19 Jul 2024 10:42:02 +0100,
Zhou Wang <wangzhou1@hisilicon.com> wrote:
>
> On 2024/7/5 17:31, Marc Zyngier wrote:
> > In order to make sure that vpe->col_idx is correctly sampled
> > when a VMAPP command is issued, we must hold the lock for the
> > VPE. This is now possible since the introduction of the per-VM
> > vmapp_lock, which can be taken before vpe_lock in the locking
> > order.
> >
> > Signed-off-by: Marc Zyngier <maz@kernel.org>
> > ---
> > drivers/irqchip/irq-gic-v3-its.c | 8 ++++++--
> > 1 file changed, 6 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
> > index b52d60097cad5..951ec140bcea2 100644
> > --- a/drivers/irqchip/irq-gic-v3-its.c
> > +++ b/drivers/irqchip/irq-gic-v3-its.c
> > @@ -1810,7 +1810,9 @@ static void its_map_vm(struct its_node *its, struct its_vm *vm)
> > for (i = 0; i < vm->nr_vpes; i++) {
> > struct its_vpe *vpe = vm->vpes[i];
> >
> > - its_send_vmapp(its, vpe, true);
> > + scoped_guard(raw_spinlock, &vpe->vpe_lock)
> > + its_send_vmapp(its, vpe, true);
> > +
> > its_send_vinvall(its, vpe);
> > }
> > }
> > @@ -1827,8 +1829,10 @@ static void its_unmap_vm(struct its_node *its, struct its_vm *vm)
> > if (!--vm->vlpi_count[its->list_nr]) {
> > int i;
> >
> > - for (i = 0; i < vm->nr_vpes; i++)
> > + for (i = 0; i < vm->nr_vpes; i++) {
> > + guard(raw_spinlock)(&vm->vpes[i]->vpe_lock);
> > its_send_vmapp(its, vm->vpes[i], false);
> > + }
> > }
> > }
> >
>
> Hi Marc,
>
> It looks like there is ABBA deadlock after applying this series:
>
> In its_map_vm: vmapp_lock -> vpe_lock
> In its_vpe_set_affinity: vpe_to_cpuid_lock(vpe_lock) -> its_send_vmovp(vmapp_lock)
>
> Any idea about this?
Hmmm, well spotted. That's an annoying one.
Can you give the below hack a go? I've only lightly tested it, as my
D05 box is on its last leg (it is literally falling apart) and I don't
have any other GICv4.x box to test on.
Thanks,
M.
diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
index 951ec140bcea2..b88c6011c8771 100644
--- a/drivers/irqchip/irq-gic-v3-its.c
+++ b/drivers/irqchip/irq-gic-v3-its.c
@@ -1328,12 +1328,6 @@ static void its_send_vmovp(struct its_vpe *vpe)
return;
}
- /*
- * Protect against concurrent updates of the mapping state on
- * individual VMs.
- */
- guard(raw_spinlock_irqsave)(&vpe->its_vm->vmapp_lock);
-
/*
* Yet another marvel of the architecture. If using the
* its_list "feature", we need to make sure that all ITSs
@@ -3808,7 +3802,7 @@ static int its_vpe_set_affinity(struct irq_data *d,
struct its_vpe *vpe = irq_data_get_irq_chip_data(d);
unsigned int from, cpu = nr_cpu_ids;
struct cpumask *table_mask;
- unsigned long flags;
+ unsigned long flags, vmapp_flags;
/*
* Changing affinity is mega expensive, so let's be as lazy as
@@ -3822,7 +3816,14 @@ static int its_vpe_set_affinity(struct irq_data *d,
* protect us, and that we must ensure nobody samples vpe->col_idx
* during the update, hence the lock below which must also be
* taken on any vLPI handling path that evaluates vpe->col_idx.
+ *
+ * Finally, we must protect ourselves against concurrent
+ * updates of the mapping state on this VM should the ITS list
+ * be in use.
*/
+ if (its_list_map)
+ raw_spin_lock_irqsave(&vpe->its_vm->vmapp_lock, vmapp_flags);
+
from = vpe_to_cpuid_lock(vpe, &flags);
table_mask = gic_data_rdist_cpu(from)->vpe_table_mask;
@@ -3852,6 +3853,9 @@ static int its_vpe_set_affinity(struct irq_data *d,
irq_data_update_effective_affinity(d, cpumask_of(cpu));
vpe_to_cpuid_unlock(vpe, flags);
+ if (its_list_map)
+ raw_spin_unlock_irqrestore(&vpe->its_vm->vmapp_lock, vmapp_flags);
+
return IRQ_SET_MASK_OK_DONE;
}
--
Without deviation from the norm, progress is not possible.
next prev parent reply other threads:[~2024-07-19 11:31 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-05 9:31 [PATCH 0/3] irqchip/gic-v4: Fix VMAPP/VMOVP races Marc Zyngier
2024-07-05 9:31 ` [PATCH 1/3] irqchip/gic-v4: Always configure affinity on VPE activation Marc Zyngier
2024-07-10 16:42 ` [tip: irq/core] " tip-bot2 for Marc Zyngier
2024-07-15 13:20 ` tip-bot2 for Marc Zyngier
2024-07-05 9:31 ` [PATCH 2/3] irqchip/gic-v4: Substitute vmovp_lock for a per-VM lock Marc Zyngier
2024-07-10 16:42 ` [tip: irq/core] " tip-bot2 for Marc Zyngier
2024-07-15 13:20 ` tip-bot2 for Marc Zyngier
2024-07-05 9:31 ` [PATCH 3/3] irqchip/gic-v4: Make sure a VPE is locked when VMAPP is issued Marc Zyngier
2024-07-10 16:42 ` [tip: irq/core] " tip-bot2 for Marc Zyngier
2024-07-15 13:20 ` tip-bot2 for Marc Zyngier
2024-07-19 9:42 ` [PATCH 3/3] " Zhou Wang
2024-07-19 11:31 ` Marc Zyngier [this message]
2024-07-23 1:51 ` Zhou Wang
2024-07-23 17:56 ` Marc Zyngier
2024-07-24 1:13 ` Zhou Wang
2024-07-08 2:02 ` [PATCH 0/3] irqchip/gic-v4: Fix VMAPP/VMOVP races Tangnianyao
2024-07-17 8:41 ` Tangnianyao
2024-07-17 9:21 ` Marc Zyngier
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=86h6cl39ff.wl-maz@kernel.org \
--to=maz@kernel.org \
--cc=kvmarm@lists.linux.dev \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=tangnianyao@huawei.com \
--cc=tglx@linutronix.de \
--cc=wangzhou1@hisilicon.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.