Re: [RFC 1/2] softirq: Defer net rx/tx processing to ksoftirqd context

From: David Miller
Date: Wed Jan 17 2018 - 15:31:00 EST


From: Mike Galbraith <efault@xxxxxx>
Date: Fri, 12 Jan 2018 19:44:30 +0100

> On Fri, 2018-01-12 at 19:15 +0100, Mike Galbraith wrote:
>> On Fri, 2018-01-12 at 09:51 -0800, Linus Torvalds wrote:
>> > On Fri, Jan 12, 2018 at 9:44 AM, Mike Galbraith <efault@xxxxxx> wrote:
>> > >
>> > > Nah, a misunderstanding happened. RT that still offers full threading
>> > > creates per-softirq threads per cpu. The regular trees split ksoftirqd
>> > > into only two threads per cpu, one processes timer/hrtimer softriqs,
>> > > the other processes the rest.
>> >
>> > Ok, that sounds like it should work, but it also sounds like it's very
>> > specific to RT itself.
>> >
>> > For example, the dvb issue was not about the timer softirqs, but about
>> > the tasklet ones.
>> >
>> > So maybe we wouldn't need to split it for _every_ softirq, but we'd
>> > need to split it more than just along the timer case.
>> >
>> > And it does sound a bit excessive to have ten fixed threads for every
>> > CPU. The days when tens of CPU's meant "huge system" are gone. These
>> > days it can be a phone.
>>
>> Yeah, it is excessive more often than not. You get to prioritize, and
>> segregate, which is nice, but you pay for it.
>
> BTW, much of the softirq load in RT is processed by the raising task.
>
> tbench_srv-6985 [000] d...112 293.902511: softirq_raise: vec=3 [action=NET_RX]
> tbench_srv-6985 [000] .....13 293.902511: softirq_entry: vec=3 [action=NET_RX]
> tbench_srv-6985 [000] .....13 293.902515: softirq_exit: vec=3 [action=NET_RX]
> tbench-6984 [003] d...112 293.902520: softirq_raise: vec=3 [action=NET_RX]
> tbench-6984 [003] .....13 293.902520: softirq_entry: vec=3 [action=NET_RX]
> tbench-6984 [003] .....13 293.902523: softirq_exit: vec=3 [action=NET_RX]

And this is because tbench runs over loopback, which triggers softirqs in
the context of whatever generates the loopback packet transmit. Which in
this case is the tbench process calling sendmsg().

I wanted to chime in about this earlier, and make it clear that it isn't
just IRQs that can trigger softirqs. User context actions in the kernel
can trigger softirqs too.