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.