From: Eric Dumazet <[email protected]> Date: Wed, 17 Jan 2018 14:02:43 -0800
> On Wed, Jan 17, 2018 at 2:00 PM, Thomas Gleixner <[email protected]> wrote: >> On Wed, 17 Jan 2018, Linus Torvalds wrote: >> >>> On Wed, Jan 17, 2018 at 1:54 PM, Thomas Gleixner <[email protected]> wrote: >>> > raise_softirq() -> raise_softirq_irqoff() >>> > >>> > set_softirq_bit(); >>> > >>> > if (!in_interrupt()) >>> > wake_softirqd(); >>> > >>> > So if the caller is not in hard or soft interrupt context, which includes >>> > bottom half disabled regions softirqd is woken. >>> >>> That does seem unnecessarily expensive, and maybe we could just do it >>> with thread flag (TIF_NOTIFY_RESUME or whatever). >>> >>> In fact, that was what I *thought* we did. Maybe I just remember some >>> historical behavior. >>> >>> Since networking seems to largely prefer softirqd anyway, maybe that >>> wake_softirqd() is the right thing to do anyway. >> >> Well, but we only do it when we are not in a bh disabled region. The places >> where thread context raises the network softirqs is usually inside a bh >> disabled region, so the softirq is executed on local_bh_enable(). The >> thread is woken up rarely. > > There is also the netif_rx_ni() stuff. > > Can't remember right now why it is not using > local_bh_{diable,enable}() pair instead > of preempt_disable() ... if (local_softirq_pending()) do_softirq(); Hmmm, that code predates the initial GIT repository build. I do remember we had some back and forth with that stuff.

