On Fri, Sep 25 2020 at 02:42, Frederic Weisbecker wrote:

> On Thu, Sep 24, 2020 at 05:37:42PM +0200, Thomas Gleixner wrote:
>> Subject: softirq; Prevent starvation of higher softirq vectors
> [...]
>> +    /*
>> +     * Word swap pending to move the not yet handled bits of the previous
>> +     * run first and then clear the duplicates in the newly raised ones.
>> +     */
>> +    swahw32s(&cur_pending);
>> +    pending = cur_pending & ~(cur_pending << SIRQ_PREV_SHIFT);
>> +
>>      for_each_set_bit(vec_nr, &pending, NR_SOFTIRQS) {
>>              int prev_count;
>>  
>> +            vec_nr &= SIRQ_VECTOR_MASK;
>
> Shouldn't NR_SOFTIRQS above protect from that?

It does, but that's wrong. The bitmap size in that for_each() loop must
obviously be SIRQ_PREV_SHIFT + NR_SOFTIRQS for this to work.

>> +    } else {
>> +            /*
>> +             * Retain the unprocessed bits and swap @cur_pending back
>> +             * into normal ordering
>> +             */
>> +            cur_pending = (u32)pending;
>> +            swahw32s(&cur_pending);
>> +            /*
>> +             * If the previous bits are done move the low word of
>> +             * @pending into the high word so it's processed first.
>> +             */
>> +            if (!(cur_pending & SIRQ_PREV_MASK))
>> +                    cur_pending <<= SIRQ_PREV_SHIFT;
>
> If the previous bits are done and there is no timeout, should
> we consider to restart a loop?

We only enter this code path if there was a timeout. Otherwise pending
would be 0.

Thanks,

        tglx

Reply via email to