Re: [PATCH net-next] net: Treat __napi_schedule_irqoff() as __napi_schedule() on PREEMPT_RT
flat view
From: Thomas Gleixner <hidden>
Date: 2021-05-14 20:16:19
Also in:
linux-rt-users, lkml
On Fri, May 14 2021 at 11:56, Jakub Kicinski wrote:
On Thu, 13 May 2021 00:28:02 +0200 Thomas Gleixner wrote:quoted
quoted
--- Alternatively __napi_schedule_irqoff() could be #ifdef'ed out on RT and an inline provided which invokes __napi_schedule(). This was not chosen as it creates #ifdeffery all over the place and with the proposed solution the code reflects the documentation consistently and in one obvious place.Blame me for that decision. No matter which variant we end up with, this needs to go into all stable RT kernels ASAP.Mumble mumble. I thought we concluded that drivers used on RT can be fixed, we've already done it for a couple drivers (by which I mean two). If all the IRQ handler is doing is scheduling NAPI (which it is for modern NICs) - IRQF_NO_THREAD seems like the right option.
Yes. That works, but there are a bunch which do more than that IIRC.
Is there any driver you care about that we can convert to using IRQF_NO_THREAD so we can have new drivers to "do the right thing" while the old ones depend on this workaround for now?
The start of this thread was about i40e_msix_clean_rings() which probably falls under the IRQF_NO_THREAD category, but I'm sure that there are others. So I chose the safe way for RT for now.
Another thing while I have your attention - ____napi_schedule() does __raise_softirq_irqoff() which AFAIU does not wake the ksoftirq thread. On non-RT we get occasional NOHZ warnings when drivers schedule napi from process context, but on RT this is even more of a problem, right? ksoftirqd won't run until something else actually wakes it up?
Correct. I sent a patch for the r8152 usb network driver today which
suffers from that problem. :)
As I said there, we want a (debug/lockdep) check in __napi_schedule()
whether soft interrupts are disabled, but let me have a look whether
that check might make more sense directly in __raise_softirq_irqoff().
Thanks,
tglx