[PATCH] powerpc/xive: fix the fuzz value in xive_pick_irq_target()
Cédric Le Goater
clg at kaod.org
Thu Aug 3 17:45:51 AEST 2017
On 08/02/2017 11:57 PM, Benjamin Herrenschmidt wrote:
> On Wed, 2017-08-02 at 18:43 +0200, Cédric Le Goater wrote:
>> If xive_find_target_in_mask() fails to find a cpu, the fuzz value used
>> in xive_pick_irq_target() is decremented and reused in the last
>> returning call to xive_find_target_in_mask(). This can result in such
>> WARNINGs if the initial fuzz value is zero :
>
> Ah indeed ... would have worked better if "fuzz" had been unsigned.
but 'fuzz' is unsigned !
With a -1, unsigned or not, the 'first' cpu becomes out of range for
the calculation below :
/* Pick up a starting point CPU in the mask based on fuzz */
num = cpumask_weight(mask);
first = fuzz % num;
/* Locate it */
cpu = cpumask_first(mask);
for (i = 0; i < first && cpu < nr_cpu_ids; i++)
cpu = cpumask_next(cpu, mask);
May be there is a better fix ?
Also, I am not sure of :
num = cpumask_weight(mask);
shouldn't we be using :
num = nr_cpu_ids;
In that case, 'first' would have been in the cpu range.
Cheers,
C.
More information about the Linuxppc-dev
mailing list