Received: by 2002:a05:6500:1b8f:b0:1fa:5c73:8e2d with SMTP id df15csp1080675lqb; Wed, 29 May 2024 22:30:35 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCX24yGXnjiEd7QYAmWqoZMhWFXWpvrLEbqn4TrzNZnuwsFVa7O6JlPepzQxwrnLZDQFUfDHcd0zVjeF5ykryFYZEit08h5qfCtw4QLSaA== X-Google-Smtp-Source: AGHT+IFy99ZWLzjbQhQw/1BKOi1+nGK3d9BAFziKnyT2NXVQ9ilUiBwzFBhTfzGofbIUWBnFe0Gd X-Received: by 2002:a05:622a:1a01:b0:43f:ee14:c1c6 with SMTP id d75a77b69052e-43fee14c572mr1230241cf.7.1717047034678; Wed, 29 May 2024 22:30:34 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1717047034; cv=pass; d=google.com; s=arc-20160816; b=fT7u0Zr+TKmCv3JUDpyJv2jFy/HPLzZCKNrt85LRB3QyGzhg5b1/rLwBLhlaWxhPnm QFCPUvrQfZnEL+bjHZc6P0dQUgxIAdzFK6xx8NSs5SUPJw6pTiecorH0AzpbPBzAdkia HCyLua887CaJxKOrXQLzbToBXodOa0XRQDe3OncWVrqC+iXLokjWtjCuxRWSG5TeugzB xPnVevcIAHwV2V5A8fRdb6bOZKn64BTEzUnaY5uo3ppUa7nKacE0pg75evqDoOEC8y4P snB42qnGfgzLRxqEeEu/yPIxr3tVnXfnLvjyMp7kUEC4WwZE613/TSuNTuxhHWhfX22y bPsA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:list-unsubscribe:list-subscribe :list-id:precedence:dkim-signature; bh=CuSja05ZHB7F/dtB/ISByQyEm2D3jWgUODIQiPVlJyM=; fh=wPQrZ7JhUE7vrGjNpAi9DuStEN7IJXfKa8SGqukaS5s=; b=fuBKdWp2O6tt3Dx9zom3bLfmFuXp4IS6+pLxnyIal794/m2N7ju345vXEGvzu5vQi+ nkpXutTeFud96jFurzctnBibLYi954cgoco873WhUvj/+OFbzPpzSMjb3nUblrVDyrCX EfEWZH2pkryhBfJcFu9wBCTi7Y/cItndpViEjY1R+2GQK0N0GXhV+hvB6bkGqNy0l7ve srFxUdIDOzriN2Gu9EMJJJClRa0ydVpx6ahFYsSappGJV+XhTbPVvu0XCVwv4smJQcxQ gzZ8u4ZRKDN2PaeJdQqc23Wl55eMZpWoJbH3GNP1vRwioItz7PCud1RMCuOu2qqglOH7 d8ew==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@rivosinc-com.20230601.gappssmtp.com header.s=20230601 header.b="KkWzEZ/i"; arc=pass (i=1 spf=pass spfdomain=rivosinc.com dkim=pass dkdomain=rivosinc-com.20230601.gappssmtp.com); spf=pass (google.com: domain of linux-kernel+bounces-194951-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-194951-linux.lists.archive=gmail.com@vger.kernel.org" Return-Path: Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [2604:1380:45d1:ec00::1]) by mx.google.com with ESMTPS id d75a77b69052e-43fb18b1ee1si7966381cf.441.2024.05.29.22.30.34 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 May 2024 22:30:34 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-194951-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) client-ip=2604:1380:45d1:ec00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@rivosinc-com.20230601.gappssmtp.com header.s=20230601 header.b="KkWzEZ/i"; arc=pass (i=1 spf=pass spfdomain=rivosinc.com dkim=pass dkdomain=rivosinc-com.20230601.gappssmtp.com); spf=pass (google.com: domain of linux-kernel+bounces-194951-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-194951-linux.lists.archive=gmail.com@vger.kernel.org" Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id 5C2181C21487 for ; Thu, 30 May 2024 05:30:34 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id B5526143C59; Thu, 30 May 2024 05:30:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=rivosinc-com.20230601.gappssmtp.com header.i=@rivosinc-com.20230601.gappssmtp.com header.b="KkWzEZ/i" Received: from mail-ed1-f53.google.com (mail-ed1-f53.google.com [209.85.208.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C30C829B0 for ; Thu, 30 May 2024 05:30:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.53 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717047026; cv=none; b=rVUiQKOwDgE0lWh9ZOmFsw1g8TAzAWAukWOm/6GtHf2jvrfwRaEALcNK7hSpomyQ9foYhqYpN7crDUYZncvsfNophFcfAjgSWzwaK+P+K9Hxu25u5jnWDyzY3GZHlEMK9Bp8JZXdayzQU8LYceK1V2SX3mDcPuihi0O8UtDuI3c= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717047026; c=relaxed/simple; bh=WIb6BUszBIgzp5+4T44N74Rxc5r0cRxeqiTf8dN3JxM=; h=MIME-Version:References:In-Reply-To:From:Date:Message-ID:Subject: To:Cc:Content-Type; b=prSCGxiGpuz83sfEJIR1Fd0lJ45aYrmsCEZWjx5LGKu4IIZPSydeRAQ1da4Vkgx78FNde0EYqLEjrVLBGeBZxb0+x2qyEyCII1zdO0zqFCuEuBTHInh5SdnP2B7feQSAqkCk6V2G/S/BDG70dYUzf8yRQlk2NFOgQwydxtRrDxY= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=rivosinc.com; spf=pass smtp.mailfrom=rivosinc.com; dkim=pass (2048-bit key) header.d=rivosinc-com.20230601.gappssmtp.com header.i=@rivosinc-com.20230601.gappssmtp.com header.b=KkWzEZ/i; arc=none smtp.client-ip=209.85.208.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=rivosinc.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rivosinc.com Received: by mail-ed1-f53.google.com with SMTP id 4fb4d7f45d1cf-572c65cea55so794114a12.0 for ; Wed, 29 May 2024 22:30:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20230601.gappssmtp.com; s=20230601; t=1717047022; x=1717651822; darn=vger.kernel.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=CuSja05ZHB7F/dtB/ISByQyEm2D3jWgUODIQiPVlJyM=; b=KkWzEZ/i5vP65+OLhYA5dV8em8eKhkV7KPa1ngNitH6/LKsVnzvlDBTGCm+wczFhTO 8pdC0OFXkrO8FchvbOD7UiO9kGJWcXyuSupvSTH0LCXs/b15qzm2O6X8I19vNtBvW1/e tebAztOKTEKXUvpQUL/s8jXZXptJPTpaCGcX9v5E+Z7z/HXdNK7oV9nhYAY6TbFMmeWs 7OR+gCiimxJkZpDEkmSY3ISH6GR9MFokYen/AoVxL3rgDZxbjPouM7g8S/18TafYRh0s WwLltow9y2X6KZ+fCfcHjMLe9aoUy5Do9Q489vZCzRoIhfGesG73J+KNyUF4jO++1vQb H/dA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1717047022; x=1717651822; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=CuSja05ZHB7F/dtB/ISByQyEm2D3jWgUODIQiPVlJyM=; b=EjptD/g8cLCz838SOahi6a0hjXUnTjvskYRPi/8YjNOw2wK3FFlXTiTfszgUJJOxwS PMuqyfwh9fOi3FseN/bkVv6hVBGwQlA5gkdVbAWGQBoPs+V7bo6pp1vZmjdd7eD/AuLJ nQXYLphtwbKvJ9HuctRqCkB7cnHf2TgT7554DR0EitCKuFYgeiobwZYJwUkDYvwsYCPy sGmbt9qmS6PGLKZpyR4AmbRrhDWDmMG4GxFL58/4CWVuVIvSlAO6Den9r2bM5vaNQH1M fmNbM2dAm410NQbT/SYQmdMyeEOLGaHaCCQoMUhWka66YmrL39YKCZfLxMPfl0VCx60e 0K/g== X-Forwarded-Encrypted: i=1; AJvYcCVUwqf2FI7W4rBaHfB7N/561LO2Grk8rb6pLIKTqA2kaJqT1reWjE75t2fmsYMCIfnT1Qsl9yFdrIHe3Ck16auSXsoA0ZwBPn89Mk/R X-Gm-Message-State: AOJu0YzSGBotZKrDIrZyNs23acCXuRqawDeRFhBXrxhzTCtJiwbVlLYK 96CxeXYc0i4phzZhAL2zHTueb+cSsJ9QFD7FOT33IGRhyk8BBUKV6FtRu277Fkhcg38ACPTZG/D XTX1g+CTrmbs+GzQ6B9BJhbrP8qUsHhOJsRawtA== X-Received: by 2002:a50:aad5:0:b0:574:ecf3:f7d1 with SMTP id 4fb4d7f45d1cf-57a1940df3dmr724081a12.0.1717047021953; Wed, 29 May 2024 22:30:21 -0700 (PDT) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 References: <20240528151052.313031-1-alexghiti@rivosinc.com> <20240528151052.313031-8-alexghiti@rivosinc.com> In-Reply-To: From: Alexandre Ghiti Date: Thu, 30 May 2024 07:30:10 +0200 Message-ID: Subject: Re: [PATCH 7/7] riscv: Add qspinlock support based on Zabha extension To: Guo Ren Cc: Jonathan Corbet , Paul Walmsley , Palmer Dabbelt , Albert Ou , Peter Zijlstra , Ingo Molnar , Will Deacon , Waiman Long , Boqun Feng , Arnd Bergmann , Leonardo Bras , linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, linux-arch@vger.kernel.org Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi Guo, On Thu, May 30, 2024 at 3:55=E2=80=AFAM Guo Ren wrote: > > On Wed, May 29, 2024 at 9:03=E2=80=AFPM Alexandre Ghiti wrote: > > > > Hi Guo, > > > > On Wed, May 29, 2024 at 11:24=E2=80=AFAM Guo Ren wr= ote: > > > > > > On Tue, May 28, 2024 at 11:18=E2=80=AFPM Alexandre Ghiti wrote: > > > > > > > > In order to produce a generic kernel, a user can select > > > > CONFIG_QUEUED_SPINLOCKS which will fallback at runtime to the ticke= t > > > > spinlock implementation if Zabha is not present. > > > > > > > > Note that we can't use alternatives here because the discovery of > > > > extensions is done too late and we need to start with the qspinlock > > > > implementation because the ticket spinlock implementation would pol= lute > > > > the spinlock value, so let's use static keys. > > > > > > > > This is largely based on Guo's work and Leonardo reviews at [1]. > > > > > > > > Link: https://lore.kernel.org/linux-riscv/20231225125847.2778638-1-= guoren@kernel.org/ [1] > > > > Signed-off-by: Alexandre Ghiti > > > > --- > > > > .../locking/queued-spinlocks/arch-support.txt | 2 +- > > > > arch/riscv/Kconfig | 1 + > > > > arch/riscv/include/asm/Kbuild | 4 +- > > > > arch/riscv/include/asm/spinlock.h | 39 +++++++++++++++= ++++ > > > > arch/riscv/kernel/setup.c | 18 +++++++++ > > > > include/asm-generic/qspinlock.h | 2 + > > > > include/asm-generic/ticket_spinlock.h | 2 + > > > > 7 files changed, 66 insertions(+), 2 deletions(-) > > > > create mode 100644 arch/riscv/include/asm/spinlock.h > > > > > > > > diff --git a/Documentation/features/locking/queued-spinlocks/arch-s= upport.txt b/Documentation/features/locking/queued-spinlocks/arch-support.t= xt > > > > index 22f2990392ff..cf26042480e2 100644 > > > > --- a/Documentation/features/locking/queued-spinlocks/arch-support.= txt > > > > +++ b/Documentation/features/locking/queued-spinlocks/arch-support.= txt > > > > @@ -20,7 +20,7 @@ > > > > | openrisc: | ok | > > > > | parisc: | TODO | > > > > | powerpc: | ok | > > > > - | riscv: | TODO | > > > > + | riscv: | ok | > > > > | s390: | TODO | > > > > | sh: | TODO | > > > > | sparc: | ok | > > > > diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig > > > > index 184a9edb04e0..ccf1703edeb9 100644 > > > > --- a/arch/riscv/Kconfig > > > > +++ b/arch/riscv/Kconfig > > > > @@ -59,6 +59,7 @@ config RISCV > > > > select ARCH_SUPPORTS_SHADOW_CALL_STACK if HAVE_SHADOW_CALL_= STACK > > > > select ARCH_USE_MEMTEST > > > > select ARCH_USE_QUEUED_RWLOCKS > > > > + select ARCH_USE_QUEUED_SPINLOCKS if TOOLCHAIN_HAS_ZABHA > > > Using qspinlock or not depends on real hardware capabilities, not the > > > compiler flag. That's why I introduced combo-spinlock, ticket-spinloc= k > > > & qspinlock three Kconfigs, and the combo-spinlock would compat all > > > hardware platforms but waste some qspinlock code size. > > > > You're right, and I think your comment matches what Conor mentioned > > about the lack of clarity with some extensions: TOOLCHAIN_HAS_ZABHA > > will allow a platform with Zabha capability to use qspinlocks. But if > > the hardware does not, it will fallback to the ticket spinlocks. > > > > But I agree that looking at the config alone may be misleading, even > > though it will work as expected at runtime. So I agree with you: > > unless anyone is strongly against the combo spinlocks, I will do what > > you suggest and add them. > The problem with the v12 combo-spinlock is using a static_branch > instead of the full ALTERNATIVE. Frankly, that's a bad example that > costs more code space. I found that your cmpxchg32/64 also uses a > condition branch, which has a similar problem, right? > > Anyway, your patch series inspired me to update the v13 > combo-spinlock. My plan is: > 1. Separate native-qspinlock out of paravirt-qspinlock. > 2. Re-design an ALTERNATIVE(asm) code instead of static_branch generic > ticket-lock or qspinlock. What's your plan to make use of alternatives here? The alternatives patching depends on the discovery of the extensions, which is done too late, at least after the first use of a spinlock (the printk spinlock). So you'd need to find a way to first use qspinlocks (but without knowing Zabha is available) and then do the correct patching: an idea here could be to add an "init" value to the alternatives and let the patching process do the right thing when the extensions are known. Another solution would be the early discovery of the extensions, but I took a look and it's easy with a device tree, but not with ACPI. Let me know what you plan to do and how I can help! Thanks, Alex > > What do you think? > > > > > > Thanks again for your initial work, > > > > Alex > > > > > > > > > select ARCH_USES_CFI_TRAPS if CFI_CLANG > > > > select ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH if SMP && MMU > > > > select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT if MMU > > > > diff --git a/arch/riscv/include/asm/Kbuild b/arch/riscv/include/asm= /Kbuild > > > > index 504f8b7e72d4..ad72f2bd4cc9 100644 > > > > --- a/arch/riscv/include/asm/Kbuild > > > > +++ b/arch/riscv/include/asm/Kbuild > > > > @@ -2,10 +2,12 @@ > > > > generic-y +=3D early_ioremap.h > > > > generic-y +=3D flat.h > > > > generic-y +=3D kvm_para.h > > > > +generic-y +=3D mcs_spinlock.h > > > > generic-y +=3D parport.h > > > > -generic-y +=3D spinlock.h > > > > generic-y +=3D spinlock_types.h > > > > +generic-y +=3D ticket_spinlock.h > > > > generic-y +=3D qrwlock.h > > > > generic-y +=3D qrwlock_types.h > > > > +generic-y +=3D qspinlock.h > > > > generic-y +=3D user.h > > > > generic-y +=3D vmlinux.lds.h > > > > diff --git a/arch/riscv/include/asm/spinlock.h b/arch/riscv/include= /asm/spinlock.h > > > > new file mode 100644 > > > > index 000000000000..e00429ac20ed > > > > --- /dev/null > > > > +++ b/arch/riscv/include/asm/spinlock.h > > > > @@ -0,0 +1,39 @@ > > > > +/* SPDX-License-Identifier: GPL-2.0 */ > > > > + > > > > +#ifndef __ASM_RISCV_SPINLOCK_H > > > > +#define __ASM_RISCV_SPINLOCK_H > > > > + > > > > +#ifdef CONFIG_QUEUED_SPINLOCKS > > > > +#define _Q_PENDING_LOOPS (1 << 9) > > > > + > > > > +#define __no_arch_spinlock_redefine > > > > +#include > > > > +#include > > > > +#include > > > > + > > > > +DECLARE_STATIC_KEY_TRUE(qspinlock_key); > > > > + > > > > +#define SPINLOCK_BASE_DECLARE(op, type, type_lock) = \ > > > > +static __always_inline type arch_spin_##op(type_lock lock) = \ > > > > +{ = \ > > > > + if (static_branch_unlikely(&qspinlock_key)) = \ > > > > + return queued_spin_##op(lock); = \ > > > > + return ticket_spin_##op(lock); = \ > > > > +} > > > > + > > > > +SPINLOCK_BASE_DECLARE(lock, void, arch_spinlock_t *) > > > > +SPINLOCK_BASE_DECLARE(unlock, void, arch_spinlock_t *) > > > > +SPINLOCK_BASE_DECLARE(is_locked, int, arch_spinlock_t *) > > > > +SPINLOCK_BASE_DECLARE(is_contended, int, arch_spinlock_t *) > > > > +SPINLOCK_BASE_DECLARE(trylock, bool, arch_spinlock_t *) > > > > +SPINLOCK_BASE_DECLARE(value_unlocked, int, arch_spinlock_t) > > > > + > > > > +#else > > > > + > > > > +#include > > > > + > > > > +#endif > > > > + > > > > +#include > > > > + > > > > +#endif /* __ASM_RISCV_SPINLOCK_H */ > > > > diff --git a/arch/riscv/kernel/setup.c b/arch/riscv/kernel/setup.c > > > > index 4f73c0ae44b2..31ce75522fd4 100644 > > > > --- a/arch/riscv/kernel/setup.c > > > > +++ b/arch/riscv/kernel/setup.c > > > > @@ -244,6 +244,23 @@ static void __init parse_dtb(void) > > > > #endif > > > > } > > > > > > > > +DEFINE_STATIC_KEY_TRUE(qspinlock_key); > > > > +EXPORT_SYMBOL(qspinlock_key); > > > > + > > > > +static void __init riscv_spinlock_init(void) > > > > +{ > > > > + asm goto(ALTERNATIVE("nop", "j %[qspinlock]", 0, RISCV_ISA_= EXT_ZABHA, 1) > > > > + : : : : qspinlock); > > > > + > > > > + static_branch_disable(&qspinlock_key); > > > > + pr_info("Ticket spinlock: enabled\n"); > > > > + > > > > + return; > > > > + > > > > +qspinlock: > > > > + pr_info("Queued spinlock: enabled\n"); > > > > +} > > > > + > > > > extern void __init init_rt_signal_env(void); > > > > > > > > void __init setup_arch(char **cmdline_p) > > > > @@ -295,6 +312,7 @@ void __init setup_arch(char **cmdline_p) > > > > riscv_set_dma_cache_alignment(); > > > > > > > > riscv_user_isa_enable(); > > > > + riscv_spinlock_init(); > > > > } > > > > > > > > bool arch_cpu_is_hotpluggable(int cpu) > > > > diff --git a/include/asm-generic/qspinlock.h b/include/asm-generic/= qspinlock.h > > > > index 0655aa5b57b2..bf47cca2c375 100644 > > > > --- a/include/asm-generic/qspinlock.h > > > > +++ b/include/asm-generic/qspinlock.h > > > > @@ -136,6 +136,7 @@ static __always_inline bool virt_spin_lock(stru= ct qspinlock *lock) > > > > } > > > > #endif > > > > > > > > +#ifndef __no_arch_spinlock_redefine > > > > /* > > > > * Remapping spinlock architecture specific functions to the corre= sponding > > > > * queued spinlock functions. > > > > @@ -146,5 +147,6 @@ static __always_inline bool virt_spin_lock(stru= ct qspinlock *lock) > > > > #define arch_spin_lock(l) queued_spin_lock(l) > > > > #define arch_spin_trylock(l) queued_spin_trylock(l) > > > > #define arch_spin_unlock(l) queued_spin_unlock(l) > > > > +#endif > > > > > > > > #endif /* __ASM_GENERIC_QSPINLOCK_H */ > > > > diff --git a/include/asm-generic/ticket_spinlock.h b/include/asm-ge= neric/ticket_spinlock.h > > > > index cfcff22b37b3..325779970d8a 100644 > > > > --- a/include/asm-generic/ticket_spinlock.h > > > > +++ b/include/asm-generic/ticket_spinlock.h > > > > @@ -89,6 +89,7 @@ static __always_inline int ticket_spin_is_contend= ed(arch_spinlock_t *lock) > > > > return (s16)((val >> 16) - (val & 0xffff)) > 1; > > > > } > > > > > > > > +#ifndef __no_arch_spinlock_redefine > > > > /* > > > > * Remapping spinlock architecture specific functions to the corre= sponding > > > > * ticket spinlock functions. > > > > @@ -99,5 +100,6 @@ static __always_inline int ticket_spin_is_conten= ded(arch_spinlock_t *lock) > > > > #define arch_spin_lock(l) ticket_spin_lock(l) > > > > #define arch_spin_trylock(l) ticket_spin_trylock(l) > > > > #define arch_spin_unlock(l) ticket_spin_unlock(l) > > > > +#endif > > > > > > > > #endif /* __ASM_GENERIC_TICKET_SPINLOCK_H */ > > > > -- > > > > 2.39.2 > > > > > > > > > > > > > -- > > > Best Regards > > > Guo Ren > > > > -- > Best Regards > Guo Ren