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

Re: [PATCH 2/6] xen/arm: ffa: Track hypervisor notifications in a bitmap


  • To: Jens Wiklander <jens.wiklander@xxxxxxxxxx>
  • From: Bertrand Marquis <Bertrand.Marquis@xxxxxxx>
  • Date: Thu, 23 Apr 2026 07:28:56 +0000
  • Accept-language: en-GB, en-US
  • Arc-authentication-results: i=2; mx.microsoft.com 1; spf=pass (sender ip is 4.158.2.129) smtp.rcpttodomain=linaro.org smtp.mailfrom=arm.com; dmarc=pass (p=none sp=none pct=100) action=none header.from=arm.com; dkim=pass (signature was verified) header.d=arm.com; arc=pass (0 oda=1 ltdi=1 spf=[1,1,smtp.mailfrom=arm.com] dkim=[1,1,header.d=arm.com] dmarc=[1,1,header.from=arm.com])
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none
  • Arc-message-signature: i=2; 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=HLyiN/FAFpwQ0RQ2aScfSoW1m4aPkH9o72AQn/JfGhU=; b=lwLRS64qz+G4gca4onkUkFAVFPXl3FUgcztFsdnl7xlAJyjj3gJKs5N0zQik/mTh9Jz/2FxHiVxjkXYRi+jbATl2WXneEoAyBwgG76COoHEvSegHXQTBaFzXE6gGdeQDtu8RntP8B5EdTjZX0eJ2gSpdNwLRz9c/thI3dfx3v6zkc8rOZ3Mg2yjGKJY68WfKS82h03nyAYmiYivjw/1RtQ/idZZbPs9/N5o05gMXZLbt+na6MjmwM5yWXWbLPGIB5k2dRqKSz5X7g16mBIi4a1FnD6juK5xS3bSdNZF3S8oHmg5ghTRvXqYGP/6l1BfRLU0bLZ8T7PX3hkjQZNrYvA==
  • 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=HLyiN/FAFpwQ0RQ2aScfSoW1m4aPkH9o72AQn/JfGhU=; b=VdmBMa1GqUJ8J9vnCl8Zf6XDvlBStmGZ77ZoMM77nUjUXBVzigczYuLJUfw3Esnh/oWWKKtM0yuynOX5NXSAIu8qfrRXQQuSDHGoWdbqr+6bBUL+OZaOiUtjiHfUZqBH1BpOxAm00gtrbygypsuC3Lsqqz1oq7rMV5sUAAXersJly13POL04FHNy3pYBnf+TmnCtuk348kwvh8vEUAMlxvBNg+zjOLMvE08+C58EL0JZqU67LtSLBbAPezooqV8Q6ueynwkpUsdxJQKrUA+c1vNf/2/eSvXS1iAGmgTz10ZkXDSFhCbc39I5mWpjQ2fREZcMx5eQUhrbc9VgiwrBtg==
  • Arc-seal: i=2; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=pass; b=eXenImqPe/JdeeS9zF7uudVmvIVD7nADY/aY3mdi/KmPEJbLEQ7aJuHK9cijFQZLq886Vs9iQ0Zqr2lWnGxVxDJGmGyG9Yqr2mLX36qbDNFKu+sNmPWJz3+/AlzjjgPUuYeMp6XltbJzpqIQXiJ0e/5lbqf5I8YnEqikw0CgVk9QKpNm4qC18OJoazpZQjAEv/yAIu3tcyOwimsUoLZ+S3cPjwWWg9kVFKEVz7wuaqnQTMgG84cKueRdP8nJ18fTrLT2TyRo//fLROFKF06mXOPx43HWvNZP76Q4ZvqM8wWMZoOgTbU9+IuzdMNlDG1dzLAFuUBXvMts5DkRaQy51w==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=bHZznqnNRfHAvL9J1fnQPkPSXgS+vX2CO0qpy3F6Etv2OgBongeX+tj5JGzKJ6mIdS9xgmFvBKTEWgXAMn2ZFUn8c2IgYl3HW1rF2SQMcogxwk7NX8gv1rIN55O845JETodY3JDNntiZO13nwM3Nr2xiMVeGEjOO+q7imR0s+xvHX+PFPIaiI8BCC+CLGmTd3vQf/a3WB4i6VBwTXhOg39MB85eM2R7TdiMZysueIQE6x/E3LXOw9UaQDpsAl/BAOFy3vVmRfxWHd/2fhpop5O943RGaaVCKDlgDksXk+zaCeet69tTu6lfuG1Iwhb6k6L4IrgVfcCrSbrv1OJ7Ytg==
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=arm.com header.i="@arm.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck"; dkim=pass header.s=selector1 header.d=arm.com header.i="@arm.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck"
  • Authentication-results-original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com;
  • Cc: "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>, Volodymyr Babchuk <volodymyr_babchuk@xxxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, Julien Grall <julien@xxxxxxx>, Michal Orzel <michal.orzel@xxxxxxx>
  • Delivery-date: Thu, 23 Apr 2026 07:30:18 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Nodisclaimer: true
  • Thread-index: AQHcznAWfT9UE3mepUCzg5x2vENfULXq2YyAgAFvNoA=
  • Thread-topic: [PATCH 2/6] xen/arm: ffa: Track hypervisor notifications in a bitmap

Hi Jens,

Thanks a lot for the review.

> On 22 Apr 2026, at 11:34, Jens Wiklander <jens.wiklander@xxxxxxxxxx> wrote:
> 
> Hi Bertrand,
> 
> On Fri, Apr 17, 2026 at 3:41 PM Bertrand Marquis
> <bertrand.marquis@xxxxxxx> wrote:
>> 
>> Hypervisor notifications are currently tracked with a dedicated
>> buff_full_pending boolean. That state only represents a single HYP
>> notification bit and keeps HYP bitmap handling tied to single-purpose
>> bookkeeping.
>> 
>> Replace the boolean with a hypervisor notification bitmap protected by
>> notif_lock. INFO_GET reports pending when the bitmap is non-zero, GET
>> returns and clears the HYP bitmap under the lock, and RX-buffer-full
>> sets FFA_NOTIF_RX_BUFFER_FULL in the bitmap instead of updating
>> separate state.
>> 
>> Initialize and clear the bitmap during domain lifecycle handling, and
>> use ctx->ffa_id for bitmap create and destroy so the notification state
>> stays tied to the cached FF-A endpoint ID.
>> 
>> No functional changes.
>> 
>> Signed-off-by: Bertrand Marquis <bertrand.marquis@xxxxxxx>
>> ---
>> xen/arch/arm/tee/ffa_notif.c   | 46 ++++++++++++++++++++++++++--------
>> xen/arch/arm/tee/ffa_private.h |  9 +++++--
>> 2 files changed, 43 insertions(+), 12 deletions(-)
>> 
>> diff --git a/xen/arch/arm/tee/ffa_notif.c b/xen/arch/arm/tee/ffa_notif.c
>> index 07bc5cb3a430..d15119409a25 100644
>> --- a/xen/arch/arm/tee/ffa_notif.c
>> +++ b/xen/arch/arm/tee/ffa_notif.c
>> @@ -94,8 +94,15 @@ void ffa_handle_notification_info_get(struct 
>> cpu_user_regs *regs)
>> 
>>     notif_pending = test_and_clear_bool(ctx->notif.secure_pending);
>>     if ( IS_ENABLED(CONFIG_FFA_VM_TO_VM) )
>> +    {
>>         notif_pending |= test_and_clear_bool(ctx->notif.vm_pending);
>> 
>> +        spin_lock(&ctx->notif.notif_lock);
>> +        if ( ctx->notif.hyp_pending )
>> +            notif_pending = true;
>> +        spin_unlock(&ctx->notif.notif_lock);
> 
> Isn't this a functional change? Before this patch, we didn't consider
> ctx->notif.buff_full_pending here. Am I missing something?

We did consider it implicitly through vm_pending.

This patch makes that cleaner by using hyp_pending for the Hypervisor
framework notification itself. Previously, RX-buffer-full was made visible
indirectly via vm_pending, and FFA_NOTIFICATION_INFO_GET 
cleared that summary state.

As a result, the guest-visible pending indication could be lost before
the Hypervisor notification was actually retrieved with
FFA_NOTIFICATION_GET.

With this change, the pending state is tracked in hyp_pending and is only
cleared when the Hypervisor notifications are retrieved through
FFA_NOTIFICATION_GET.

I will reword the commit message to make that clearer.

> 
>> +    }
>> +
>>     if ( notif_pending )
>>     {
>>         /* A pending global notification for the guest */
>> @@ -174,12 +181,17 @@ void ffa_handle_notification_get(struct cpu_user_regs 
>> *regs)
>>             w6 = resp.a6;
>>     }
>> 
>> -    if ( IS_ENABLED(CONFIG_FFA_VM_TO_VM) &&
>> -          flags & FFA_NOTIF_FLAG_BITMAP_HYP &&
>> -          test_and_clear_bool(ctx->notif.buff_full_pending) )
>> +    if ( IS_ENABLED(CONFIG_FFA_VM_TO_VM) )
>>     {
>> -        ACCESS_ONCE(ctx->notif.vm_pending) = false;
>> -        w7 = FFA_NOTIF_RX_BUFFER_FULL;
>> +        spin_lock(&ctx->notif.notif_lock);
>> +
>> +        if ( (flags & FFA_NOTIF_FLAG_BITMAP_HYP) && ctx->notif.hyp_pending )
>> +        {
>> +            w7 = ctx->notif.hyp_pending;
>> +            ctx->notif.hyp_pending = 0;
>> +        }
>> +
>> +        spin_unlock(&ctx->notif.notif_lock);
>>     }
>> 
>>     ffa_set_regs(regs, FFA_SUCCESS_32, 0, w2, w3, w4, w5, w6, w7);
>> @@ -207,12 +219,17 @@ int32_t ffa_handle_notification_set(struct 
>> cpu_user_regs *regs)
>> void ffa_raise_rx_buffer_full(struct domain *d)
>> {
>>     struct ffa_ctx *ctx = d->arch.tee;
>> +    uint32_t prev_bitmap;
>> 
>>     if ( !ctx )
>>         return;
>> 
>> -    ACCESS_ONCE(ctx->notif.buff_full_pending) = true;
>> -    if ( !test_and_set_bool(ctx->notif.vm_pending) )
>> +    spin_lock(&ctx->notif.notif_lock);
>> +    prev_bitmap = ctx->notif.hyp_pending;
>> +    ctx->notif.hyp_pending |= FFA_NOTIF_RX_BUFFER_FULL;
>> +    spin_unlock(&ctx->notif.notif_lock);
>> +
>> +    if ( !(prev_bitmap & FFA_NOTIF_RX_BUFFER_FULL) )
> 
> Do we need to check for FFA_NOTIF_RX_BUFFER_FULL? Isn't !prev_bitmap
> more accurate, if any other bit would ever be used in the bitmap?

  I would keep the bit-specific check here, if that is OK with you.

 This function is about raising the RX buffer full notification,
 so I think it is clearer to check whether that bit was newly
 pended rather than whether the whole Hypervisor bitmap
 was previously empty.

Using !prev_bitmap would also make the condition depend on
unrelated Hypervisor notifications being pending.

Tell me if you are ok with that.

Cheers
Bertrand


 


Rackspace

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