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

[PATCH for-4.22 2/2] xen/arm: vgic: free eSPIs using the bitmap index


  • To: xen-devel@xxxxxxxxxxxxxxxxxxxx
  • From: Mykola Kvach <mykola_kvach@xxxxxxxx>
  • Date: Fri, 10 Jul 2026 11:31:32 +0300
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=epam.com; dmarc=pass action=none header.from=epam.com; dkim=pass header.d=epam.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=61GIlb6exJm425sHaT9cUAkX2wIriwZ7XFpSTPSlU5I=; b=rwMy2WpRNIsfeveJe1GcK/rmRm/NLw2Avv0btSSgcCulRytTkfv7Sc3nNN4YKtPw0KP0ey2oesA3o0ZP0RKx181vqtkOS1azCn6Klq+En/f5bcrZdFm6MyAsUCMA0fAi3QgojPi2bJfl+PGkA4M9qgVj/QYyU/y814jHaOexwleb4Fd5HgUAK1ZlKNOOticj/LKuCbFM4tLJecVhpxnbvz7+6QwzjIv4ffUCuJofVxHH0zRKKRFX+0ENbvzTXjzJVYV8vZTCsm2hBGV7GfON7GowzjDBsKkY2rovIYQywF0k0l0+ccLl9Bc6WAkvV7fd/st9/PNJZW4bjr85XHRweQ==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=x1fHHZ+yWsXY2qnifJWLwtVhcNUC4/FVOzKCHNMmQKvAs9x8Dlu9AvzicIVmTK/Sfvf2IFmmwuJGL4SaHOVQ1wdI/wOGduDydnxeqEft3CWGvbgxE6IMEyP6pPc9CzhxJYl4lqIMopx1syesX2/829xnt5GOhZto+JgY9PV6WSyS1lXnEjSuy0CsjxiJQk9XIAtnGpSF7bugnGUbSR2uUQh4ftlsfs+t/HyLM1WyNXm6TU2Stljl7I7nOVCCBZKv6vj97vlEj40v6ynJeSsT3sHWEBwX3lLefHtw56lh5UUayqwh0L1dskRKvLWRQ9CRK+GWZqrycKsucQe4Oc/8Ww==
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=epam.com header.i="@epam.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck"
  • Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=epam.com;
  • Cc: Stefano Stabellini <sstabellini@xxxxxxxxxx>, Julien Grall <julien@xxxxxxx>, Bertrand Marquis <bertrand.marquis@xxxxxxx>, Michal Orzel <michal.orzel@xxxxxxx>, Volodymyr Babchuk <Volodymyr_Babchuk@xxxxxxxx>
  • Delivery-date: Fri, 10 Jul 2026 08:31:55 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

Classic vGIC stores eSPIs in allocated_irqs after the regular virtual
interrupts. vgic_reserve_virq() therefore translates an eSPI INTID to a
compressed bitmap index before test_and_set_bit().

vgic_free_virq() still used the raw virtual INTID. Freeing INTID 4096
would clear bit 4096 instead of the first eSPI allocation bit, which is
outside allocated_irqs for a domain with eSPI support. That can leave
the eSPI reserved and may corrupt memory.

Add the inverse of idx_to_virq() and use it in both reserve and free, so
the allocation bitmap is indexed consistently. Also reject invalid
virtual INTIDs before clearing the bitmap.

Fixes: bdde400c6e1b ("xen/arm: vgic: add resource management for extended SPIs")
Signed-off-by: Mykola Kvach <mykola_kvach@xxxxxxxx>
---
 xen/arch/arm/vgic.c | 27 ++++++++++++++++-----------
 1 file changed, 16 insertions(+), 11 deletions(-)

diff --git a/xen/arch/arm/vgic.c b/xen/arch/arm/vgic.c
index e5aca17dcb..b85710c6a7 100644
--- a/xen/arch/arm/vgic.c
+++ b/xen/arch/arm/vgic.c
@@ -33,6 +33,16 @@ static inline unsigned int idx_to_virq(struct domain *d, 
unsigned int idx)
     return idx;
 }
 
+static inline unsigned int virq_to_idx(struct domain *d, unsigned int virq)
+{
+#ifdef CONFIG_GICV3_ESPI
+    if ( is_espi(virq) )
+        return espi_intid_to_idx(virq) + vgic_num_irqs(d);
+#endif
+
+    return virq;
+}
+
 bool vgic_is_valid_line(struct domain *d, unsigned int virq)
 {
 #ifdef CONFIG_GICV3_ESPI
@@ -848,19 +858,11 @@ bool vgic_emulate(struct cpu_user_regs *regs, union hsr 
hsr)
 
 bool vgic_reserve_virq(struct domain *d, unsigned int virq)
 {
-    unsigned int idx = virq;
-
     if ( !vgic_is_valid_line(d, virq) )
         return false;
 
-    if ( is_espi(virq) )
-    {
-        unsigned int num_regular_irqs = vgic_num_irqs(d);
-
-        idx = espi_intid_to_idx(virq) + num_regular_irqs;
-    }
-
-    return !test_and_set_bit(idx, d->arch.vgic.allocated_irqs);
+    return !test_and_set_bit(virq_to_idx(d, virq),
+                             d->arch.vgic.allocated_irqs);
 }
 
 int vgic_allocate_virq(struct domain *d, bool spi)
@@ -897,7 +899,10 @@ int vgic_allocate_virq(struct domain *d, bool spi)
 
 void vgic_free_virq(struct domain *d, unsigned int virq)
 {
-    clear_bit(virq, d->arch.vgic.allocated_irqs);
+    if ( !vgic_is_valid_line(d, virq) )
+        return;
+
+    clear_bit(virq_to_idx(d, virq), d->arch.vgic.allocated_irqs);
 }
 
 unsigned int vgic_max_vcpus(unsigned int domctl_vgic_version)
-- 
2.43.0




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.