jun qian <[email protected]> writes:
> On Thu, Jul 23, 2020 at 6:58 PM Thomas Gleixner <[email protected]> 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

Reply via email to