A task can only be moved between monitor groups if both groups belong to
the same control group. This is checked fairly late however: by that time
we already have appended a task_work() callback, the execution of which
will be useless (there are no closid/rmid updates to handle, barring
concurrent writes).

Check the validity of the move earlier to save any kzalloc() /
task_work_add() if it wasn't going to be necessary.

Reviewed-by: James Morse <james.mo...@arm.com>
Signed-off-by: Valentin Schneider <valentin.schnei...@arm.com>
---
 arch/x86/kernel/cpu/resctrl/rdtgroup.c | 21 +++++++++++++--------
 1 file changed, 13 insertions(+), 8 deletions(-)

diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c 
b/arch/x86/kernel/cpu/resctrl/rdtgroup.c
index af323e2e3100..b6b5b95df833 100644
--- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c
+++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c
@@ -581,12 +581,7 @@ static int __rdtgroup_move_task(struct task_struct *tsk,
                        tsk->closid = rdtgrp->closid;
                        tsk->rmid = rdtgrp->mon.rmid;
                } else if (rdtgrp->type == RDTMON_GROUP) {
-                       if (rdtgrp->mon.parent->closid == tsk->closid) {
-                               tsk->rmid = rdtgrp->mon.rmid;
-                       } else {
-                               rdt_last_cmd_puts("Can't move task to different 
control group\n");
-                               ret = -EINVAL;
-                       }
+                       tsk->rmid = rdtgrp->mon.rmid;
                }
        }
        return ret;
@@ -673,9 +668,19 @@ static int rdtgroup_move_task(pid_t pid, struct rdtgroup 
*rdtgrp,
        rcu_read_unlock();
 
        ret = rdtgroup_task_write_permission(tsk, of);
-       if (!ret)
-               ret = __rdtgroup_move_task(tsk, rdtgrp);
+       if (ret)
+               goto out;
 
+       if (rdtgrp->type == RDTMON_GROUP &&
+           rdtgrp->mon.parent->closid != tsk->closid) {
+               rdt_last_cmd_puts("Can't move task to different control 
group\n");
+               ret = -EINVAL;
+               goto out;
+       }
+
+       ret = __rdtgroup_move_task(tsk, rdtgrp);
+
+out:
        put_task_struct(tsk);
        return ret;
 }
-- 
2.27.0

Reply via email to