On Tue, Nov 12, 2024 at 09:49:15AM +0800, Guo Ren wrote: > On Tue, Nov 12, 2024 at 12:43 AM Will Deacon <will@xxxxxxxxxx> wrote: > > > > On Sun, Nov 03, 2024 at 03:51:53PM +0100, Alexandre Ghiti wrote: > > > In order to produce a generic kernel, a user can select > > > CONFIG_COMBO_SPINLOCKS which will fallback at runtime to the ticket > > > spinlock implementation if Zabha or Ziccrse are 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 pollute > > > the spinlock value, so let's use static keys. > > > > I think the static key toggling takes a mutex (jump_label_lock()) which > > can take a spinlock (lock->wait_lock) internally, so I don't grok how > > this works: > > > > > +static void __init riscv_spinlock_init(void) > > > +{ > > > + char *using_ext = NULL; > > > + > > > + if (IS_ENABLED(CONFIG_RISCV_TICKET_SPINLOCKS)) { > > > + pr_info("Ticket spinlock: enabled\n"); > > > + return; > > > + } > > > + > > > + if (IS_ENABLED(CONFIG_RISCV_ISA_ZABHA) && > > > + IS_ENABLED(CONFIG_RISCV_ISA_ZACAS) && > > > + riscv_isa_extension_available(NULL, ZABHA) && > > > + riscv_isa_extension_available(NULL, ZACAS)) { > > > + using_ext = "using Zabha"; > > > + } else if (riscv_isa_extension_available(NULL, ZICCRSE)) { > > > + using_ext = "using Ziccrse"; > > > + } > > > +#if defined(CONFIG_RISCV_COMBO_SPINLOCKS) > > > + else { > > > + static_branch_disable(&qspinlock_key); > > > + pr_info("Ticket spinlock: enabled\n"); > > > + return; > > > + } > > > +#endif > > > > i.e. we've potentially already used the qspinlock at this point. > Yes, I've used qspinlock here. But riscv_spinlock_init is called with > irq_disabled and smp_off. That means this qspinlock only performs a > test-set lock behavior by qspinlock fast-path. That's... horrendous. Will