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

[PATCH v13 08/14] xen/arm: ffa: fix notification SRI across CPU hotplug/suspend


  • To: xen-devel@xxxxxxxxxxxxxxxxxxxx
  • From: Mykola Kvach <mykola_kvach@xxxxxxxx>
  • Date: Tue, 27 Oct 2026 23:05:57 +0200
  • 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=0Et0H87hEBuDsVwPppgKnBp8dGaGZd5gonKbZ69I+lA=; b=kN8/6OXNmxpoxFnTI9ATTL9QA4He+oUT9eAP9HMP2nKwF2eWqHhX4Wi3jGcJbg6gH8ho/EHKF/Ey4keKsPieoQ2hSgI8gsasxm3cXP0puv/Cg/iAnR9Bemikd6HPNh15xkdXEKXYF5tMZyJYRRaHXAz2qYYv6PnBUTSFftcJfmmJEljCy5x46Kf/9Tan/COiVSF0o36KzjbjnlmTwxjiPCed30L06opxmtxFKqw93+pyz6V3i/HS8sf4cguLreQaop6iBE1P/LCOhSVIzLTNH6vt6imS2ZBmk9XhD0sKUf7JOjRHQM8veP+/OZwfnQKOpA0mm8lXzKZot4DU+qU1XA==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=SthwZoA+WXgTF4EabfrpjryhAm3eLNwGsjO0FPTKDKOCflwBauPFeqOou2MVwLb6t1e9m/yjhDh21RX6C+K1vMjj4nCu46TdPICyADzFBtZxufNWTq9MmiCC2r1rTY1De/m2hoVETKvGn0W+2C/FrJVdaJU3JLQ5lJsPQqg6/AYCvbsLz/jQIPVjuAj9i8LzxPQmkIy2nCawMvX2sOtCugwsiVfGbr2+uP4pW9zopNRDSVRGSkvRRm5JTLWWZRaf7SHQ0FCKJhOafPTldKPM33ZfkBgrSi5c1Q/NIgUjLxnhN032m4SJzvlGv/AO/yTirXLtOiOZDC+6qwI0HurFuA==
  • 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: mx.microsoft.com 1; dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=epam.com;
  • Cc: Volodymyr Babchuk <volodymyr_babchuk@xxxxxxxx>, Bertrand Marquis <bertrand.marquis@xxxxxxx>, Jens Wiklander <jenswi@xxxxxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, Julien Grall <julien@xxxxxxx>, Michal Orzel <michal.orzel@xxxxxxx>, Luca Fancellu <luca.fancellu@xxxxxxx>
  • Delivery-date: Tue, 27 Oct 2026 21:06:30 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

The FF-A notification SRI interrupt handler was not correctly tied to
CPU hotplug and suspend/resume. As a result, CPUs going offline and
back online could end up with stale or missing handlers, breaking
delivery of FF-A notifications.

Signed-off-by: Mykola Kvach <mykola_kvach@xxxxxxxx>
Reviewed-by: Luca Fancellu <luca.fancellu@xxxxxxx>
Reviewed-by: Bertrand Marquis <bertrand.marquis@xxxxxxx>
---
Changes in V13:
- Use false for free_on_release (MISRA Rule 10.3). No functional change.
- Explicitly discard request_sri_irq()'s result on secondary CPUs. The
  helper logs errors, preserving the existing behavior (MISRA Rule 17.7).
  No functional change.
- Explain why the notifier ignores other CPU events (MISRA Rule 16.4). No
  functional change.
---
 xen/arch/arm/tee/ffa_notif.c | 63 +++++++++++++++++++++++++++++-------
 1 file changed, 51 insertions(+), 12 deletions(-)

diff --git a/xen/arch/arm/tee/ffa_notif.c b/xen/arch/arm/tee/ffa_notif.c
index c64bc39f03..1ec455d2ad 100644
--- a/xen/arch/arm/tee/ffa_notif.c
+++ b/xen/arch/arm/tee/ffa_notif.c
@@ -360,10 +360,28 @@ static int32_t ffa_notification_bitmap_destroy(uint16_t 
vm_id)
     return ffa_simple_call(FFA_NOTIFICATION_BITMAP_DESTROY, vm_id, 0, 0, 0);
 }
 
-void ffa_notif_init_interrupt(void)
+static DEFINE_PER_CPU_READ_MOSTLY(struct irqaction, sri_irq);
+
+static int request_sri_irq(void)
 {
     int ret;
+    struct irqaction *sri_action = &this_cpu(sri_irq);
+
+    sri_action->name = "FF-A notif";
+    sri_action->handler = notif_irq_handler;
+    sri_action->dev_id = NULL;
+    sri_action->free_on_release = false;
+
+    ret = setup_irq(notif_sri_irq, 0, sri_action);
+    if ( ret )
+        printk(XENLOG_ERR "ffa: setup_irq irq %u failed: error %d\n",
+               notif_sri_irq, ret);
+
+    return ret;
+}
 
+void ffa_notif_init_interrupt(void)
+{
     if ( fw_notif_enabled && notif_sri_irq < NR_GIC_SGI )
     {
         /*
@@ -376,14 +394,37 @@ void ffa_notif_init_interrupt(void)
          * pending, while the SPMC in the secure world will not notice that
          * the interrupt was lost.
          */
-        ret = request_irq(notif_sri_irq, 0, notif_irq_handler, "FF-A notif",
-                          NULL);
-        if ( ret )
-            printk(XENLOG_ERR "ffa: request_irq irq %u failed: error %d\n",
-                   notif_sri_irq, ret);
+        (void)request_sri_irq();
+    }
+}
+
+static void deinit_ffa_notif_interrupt(void)
+{
+    if ( fw_notif_enabled && notif_sri_irq < NR_GIC_SGI )
+        release_irq(notif_sri_irq, NULL);
+}
+
+static int cpu_ffa_notif_callback(struct notifier_block *nfb,
+                                  unsigned long action,
+                                  void *hcpu)
+{
+    switch ( action )
+    {
+    case CPU_DYING:
+        deinit_ffa_notif_interrupt();
+        break;
+    default:
+        /* Ignore other CPU events. */
+        break;
     }
+
+    return NOTIFY_DONE;
 }
 
+static struct notifier_block cpu_ffa_notif_nfb = {
+    .notifier_call = cpu_ffa_notif_callback,
+};
+
 void ffa_notif_init(void)
 {
     const struct arm_smccc_1_2_regs arg = {
@@ -416,13 +457,11 @@ void ffa_notif_init(void)
                 return;
             }
         }
-        ret = request_irq(irq, 0, notif_irq_handler, "FF-A notif", NULL);
-        if ( ret )
-        {
-            printk(XENLOG_ERR "ffa: request_irq irq %u failed: error %d\n",
-                   irq, ret);
+
+        if ( request_sri_irq() )
             return;
-        }
+
+        register_cpu_notifier(&cpu_ffa_notif_nfb);
         fw_notif_enabled = true;
     }
 }
-- 
2.53.0




 


Rackspace

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