On Tue, 8 Oct 2019 at 19:39, Peter Zijlstra <pet...@infradead.org> wrote: > > On Tue, Oct 08, 2019 at 05:30:02PM +0200, Vincent Guittot wrote: > > > This is how I plan to get ride of the problem: > > + if (busiest->group_weight == 1 || sds->prefer_sibling) { > > + unsigned int nr_diff = busiest->sum_h_nr_running; > > + /* > > + * When prefer sibling, evenly spread running tasks on > > + * groups. > > + */ > > + env->migration_type = migrate_task; > > + lsub_positive(&nr_diff, local->sum_h_nr_running); > > + env->imbalance = nr_diff >> 1; > > + return; > > + } > > I'm thinking the max_t(long, 0, ...); variant reads a lot simpler and > really _should_ work given that -fno-strict-overflow / -fwrapv mandates > 2s complement.
Another point that I have overlooked is that sum_h_nr_running is unsigned int whereas imbalance is long In fact, (long) (unsigned long A - unsigned long B) >> 1 works correctly but (long) (unsigned int A - unsigned int B) >> 1 doesn't