Messages in this thread |  | | From | Thomas Gleixner <> | Subject | Re: [PATCH V7 4/4] softirq: Allow early break the softirq processing loop | Date | Sat, 26 Sep 2020 00:42:25 +0200 |
| |
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
|  |