[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <874knlv5pq.fsf@nanos.tec.linutronix.de>
Date: Sat, 26 Sep 2020 00:42:25 +0200
From: Thomas Gleixner <tglx@...utronix.de>
To: Frederic Weisbecker <frederic@...nel.org>
Cc: qianjun.kernel@...il.com, peterz@...radead.org, will@...nel.org,
luto@...nel.org, linux-kernel@...r.kernel.org,
laoar.shao@...il.com, qais.yousef@....com, urezki@...il.com
Subject: Re: [PATCH V7 4/4] softirq: Allow early break the softirq processing loop
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
Powered by blists - more mailing lists