Messages in this thread | | | Date | Mon, 15 Aug 2022 09:37:02 -0400 | Subject | Re: [PATCH v3 2/3] sched: Provide copy_user_cpus_mask() to copy out user mask | From | Waiman Long <> |
| |
On 8/15/22 04:58, Peter Zijlstra wrote: > On Fri, Aug 12, 2022 at 04:39:28PM -0400, Waiman Long wrote: >> Since accessing the content of the user_cpus_ptr requires lock protection >> to ensure its validity, provide a helper function copy_user_cpus_mask() >> to facilitate its reading. > Sure, but this is atrocious. > >> --- a/kernel/sched/core.c >> +++ b/kernel/sched/core.c >> @@ -2619,6 +2619,24 @@ void release_user_cpus_ptr(struct task_struct *p) >> kfree(clear_user_cpus_ptr(p)); >> } >> >> +/* >> + * Return the copied mask pointer or NULL if user mask not available. >> + */ >> +struct cpumask *copy_user_cpus_mask(struct task_struct *p, >> + struct cpumask *user_mask) >> +{ >> + struct rq_flags rf; >> + struct rq *rq = task_rq_lock(p, &rf); >> + struct cpumask *mask = NULL; >> + >> + if (p->user_cpus_ptr) { >> + cpumask_copy(user_mask, p->user_cpus_ptr); >> + mask = user_mask; >> + } >> + task_rq_unlock(rq, p, &rf); >> + return mask; >> +} > For reading the mask you only need one of those locks, and I would > suggest p->pi_lock is much less contended than rq->lock. > Right. pi_lock should be enough for read access. Will make the change.
Thanks, Longman
| |