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.


Reply via email to