]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
sched: Simplify sched_{set,get}affinity()
authorPeter Zijlstra <peterz@infradead.org>
Fri, 9 Jun 2023 14:57:35 +0000 (16:57 +0200)
committerIngo Molnar <mingo@kernel.org>
Wed, 13 Sep 2023 13:01:24 +0000 (15:01 +0200)
Use guards to reduce gotos and simplify control flow.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
kernel/sched/core.c

index 67c32c43a94b1081b79c9cae2c0b2815fc66fe83..1d5cbb3050570263be558bd0f57027a035fb63a1 100644 (file)
@@ -8347,39 +8347,24 @@ long sched_setaffinity(pid_t pid, const struct cpumask *in_mask)
 {
        struct affinity_context ac;
        struct cpumask *user_mask;
-       struct task_struct *p;
        int retval;
 
-       rcu_read_lock();
-
-       p = find_process_by_pid(pid);
-       if (!p) {
-               rcu_read_unlock();
+       CLASS(find_get_task, p)(pid);
+       if (!p)
                return -ESRCH;
-       }
-
-       /* Prevent p going away */
-       get_task_struct(p);
-       rcu_read_unlock();
 
-       if (p->flags & PF_NO_SETAFFINITY) {
-               retval = -EINVAL;
-               goto out_put_task;
-       }
+       if (p->flags & PF_NO_SETAFFINITY)
+               return -EINVAL;
 
        if (!check_same_owner(p)) {
-               rcu_read_lock();
-               if (!ns_capable(__task_cred(p)->user_ns, CAP_SYS_NICE)) {
-                       rcu_read_unlock();
-                       retval = -EPERM;
-                       goto out_put_task;
-               }
-               rcu_read_unlock();
+               guard(rcu)();
+               if (!ns_capable(__task_cred(p)->user_ns, CAP_SYS_NICE))
+                       return -EPERM;
        }
 
        retval = security_task_setscheduler(p);
        if (retval)
-               goto out_put_task;
+               return retval;
 
        /*
         * With non-SMP configs, user_cpus_ptr/user_mask isn't used and
@@ -8389,8 +8374,7 @@ long sched_setaffinity(pid_t pid, const struct cpumask *in_mask)
        if (user_mask) {
                cpumask_copy(user_mask, in_mask);
        } else if (IS_ENABLED(CONFIG_SMP)) {
-               retval = -ENOMEM;
-               goto out_put_task;
+               return -ENOMEM;
        }
 
        ac = (struct affinity_context){
@@ -8402,8 +8386,6 @@ long sched_setaffinity(pid_t pid, const struct cpumask *in_mask)
        retval = __sched_setaffinity(p, &ac);
        kfree(ac.user_mask);
 
-out_put_task:
-       put_task_struct(p);
        return retval;
 }
 
@@ -8445,28 +8427,21 @@ SYSCALL_DEFINE3(sched_setaffinity, pid_t, pid, unsigned int, len,
 long sched_getaffinity(pid_t pid, struct cpumask *mask)
 {
        struct task_struct *p;
-       unsigned long flags;
        int retval;
 
-       rcu_read_lock();
-
-       retval = -ESRCH;
+       guard(rcu)();
        p = find_process_by_pid(pid);
        if (!p)
-               goto out_unlock;
+               return -ESRCH;
 
        retval = security_task_getscheduler(p);
        if (retval)
-               goto out_unlock;
+               return retval;
 
-       raw_spin_lock_irqsave(&p->pi_lock, flags);
+       guard(raw_spinlock_irqsave)(&p->pi_lock);
        cpumask_and(mask, &p->cpus_mask, cpu_active_mask);
-       raw_spin_unlock_irqrestore(&p->pi_lock, flags);
 
-out_unlock:
-       rcu_read_unlock();
-
-       return retval;
+       return 0;
 }
 
 /**