Re: [Softirq] a76eadba0d: WARNING:at_net/mac80211/rx.c:#ieee80211_rx_napi[mac80211]

From: Thomas Gleixner
Date: Thu Jul 23 2020 - 10:35:58 EST


jun qian <qianjun.kernel@xxxxxxxxx> writes:
> On Thu, Jul 23, 2020 at 6:58 PM Thomas Gleixner <tglx@xxxxxxxxxxxxx> wrote:
>> That drops everything which has not yet been processed and the above
>> warning is due to this.
>>
> wow, I made a mistake, thank you for finding the cause of the problem
> so quickly.
>
> How about the following code. we need to clear the corresponding
> pending bit at the
> right time Instead of all the pending bits cleared in the start.
>
> pending = softirq_pending();
>
> while ((softirq_bit = ffs(pending))) {
>
> pending >>= softirq_bit;
>
> set_softirq_pending(pending); //Only clear the corresponding
> bit which will be processed.

How is that supposed to be correct. pending has been shifted
right. Something like this should work:

h++;
pending >>= softirq_bit;

if (timeout()) {
/*
* Ensure that the remaining pending bits
* are handled.
*/
or_softirq_pending(pending << (vec_nr + 1));
break;
}
}

Thanks,

tglx