On Wed, Aug 18, 2021 at 11:42:28AM +0100, Will Deacon wrote: > As for your other suggestion: > > > --- a/kernel/sched/core.c > > +++ b/kernel/sched/core.c > > @@ -2733,6 +2733,7 @@ static int __set_cpus_allowed_ptr_locked > > const struct cpumask *cpu_allowed_mask = task_cpu_possible_mask(p); > > const struct cpumask *cpu_valid_mask = cpu_active_mask; > > bool kthread = p->flags & PF_KTHREAD; > > + struct cpumask *user_mask = NULL; > > unsigned int dest_cpu; > > int ret = 0; > > > > @@ -2792,9 +2793,13 @@ static int __set_cpus_allowed_ptr_locked > > __do_set_cpus_allowed(p, new_mask, flags); > > > > if (flags & SCA_USER) > > - release_user_cpus_ptr(p); > > + swap(user_mask, p->user_cpus_ptr); > > + > > + ret = affine_move_task(rq, p, rf, dest_cpu, flags); > > + > > + kfree(user_mask); > > > > - return affine_move_task(rq, p, rf, dest_cpu, flags); > > + return ret; > > > > out: > > task_rq_unlock(rq, p, rf); > > @@ -2954,8 +2959,10 @@ void relax_compatible_cpus_allowed_ptr(s > > return; > > > > raw_spin_lock_irqsave(&p->pi_lock, flags); > > - release_user_cpus_ptr(p); > > + p->user_cpus_ptr = NULL; > > raw_spin_unlock_irqrestore(&p->pi_lock, flags); > > + > > + kfree(mask); > > I think the idea looks good, but perhaps we could wrap things up a bit: > > /* Comment about why this is useful with RT */ > static cpumask_t *clear_user_cpus_ptr(struct task_struct *p) > { > struct cpumask *user_mask = NULL; > > swap(user_mask, p->user_cpus_ptr); > return user_mask; > } > > void release_user_cpus_ptr(struct task_struct *p) > { > kfree(clear_user_cpus_ptr(p)); > } > > Then just use clear_user_cpus_ptr() in sched/core.c where we know what > we're doing (well, at least one of us does!). OK, I'll go make it like that.