On Tue, 27 Feb 2024 11:49:21 +0000 David Woodhouse <dwmw2@xxxxxxxxxxxxx> wrote: > diff --git a/arch/x86/kvm/xen.c b/arch/x86/kvm/xen.c > index c16b6d394d55..d8b5326ecebc 100644 > --- a/arch/x86/kvm/xen.c > +++ b/arch/x86/kvm/xen.c > @@ -1736,9 +1736,23 @@ static int set_shinfo_evtchn_pending(struct kvm_vcpu *vcpu, u32 port) > unsigned long flags; > int rc = -EWOULDBLOCK; > > - read_lock_irqsave(&gpc->lock, flags); > + local_irq_save(flags); > + if (!read_trylock(&gpc->lock)) { Note, directly disabling interrupts in PREEMPT_RT is just as bad as doing so in non RT and the taking a mutex. Worse yet, in PREEMPT_RT read_unlock_irqrestore() isn't going to re-enable interrupts. Not really sure what the best solution is here. -- Steve > + /* > + * When PREEMPT_RT turns locks into mutexes, rwlocks are > + * turned into mutexes and most interrupts are threaded. > + * But timer events may be delivered in hardirq mode due > + * to using HRTIMER_MODE_ABS_HARD. So bail to the slow > + * path if the trylock fails in interrupt context. > + */ > + if (in_interrupt()) > + goto out; > + > + read_lock(&gpc->lock); > + } > + > if (!kvm_gpc_check(gpc, PAGE_SIZE)) > - goto out; > + goto out_unlock; > > if (IS_ENABLED(CONFIG_64BIT) && kvm->arch.xen.long_mode) { > struct shared_info *shinfo = gpc->khva;