Re: [PATCH v5 03/15] sched/core: uclamp: map TASK's clamp values into CPU's clamp groups

From: Peter Zijlstra
Date: Wed Nov 07 2018 - 08:16:42 EST


On Mon, Oct 29, 2018 at 06:32:57PM +0000, Patrick Bellasi wrote:

> +static void uclamp_group_put(unsigned int clamp_id, unsigned int group_id)
> {
> + union uclamp_map *uc_maps = &uclamp_maps[clamp_id][0];
> + union uclamp_map uc_map_old, uc_map_new;
> + long res;
> +
> +retry:
> +
> + uc_map_old.data = atomic_long_read(&uc_maps[group_id].adata);
> + uc_map_new = uc_map_old;
> + uc_map_new.se_count -= 1;
> + res = atomic_long_cmpxchg(&uc_maps[group_id].adata,
> + uc_map_old.data, uc_map_new.data);
> + if (res != uc_map_old.data)
> + goto retry;
> +}

Please write cmpxchg loops in the form:

atomic_long_t *ptr = &uclamp_maps[clamp_id][group_id].adata;
union uclamp_map old, new;

old.data = atomic_long_read(ptr);
do {
new.data = old.data;
new.se_cound--;
} while (!atomic_long_try_cmpxchg(ptr, &old.data, new.data));


(same for all the others of course)