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. The qspinlock is a clean implementation. After qspin_unlock, the lock value remains at zero, but the ticket lock makes the value dirty. So we use Qspinlock at first or change it to ticket-lock before irq & smp up. > > Will -- Best Regards Guo Ren