Commit-ID:  d6aaba615a482ce7d3ec218cf7b8d02d0d5753b8
Gitweb:     http://git.kernel.org/tip/d6aaba615a482ce7d3ec218cf7b8d02d0d5753b8
Author:     Vikas Shivappa <[email protected]>
AuthorDate: Tue, 25 Jul 2017 14:14:34 -0700
Committer:  Thomas Gleixner <[email protected]>
CommitDate: Tue, 1 Aug 2017 22:41:24 +0200

x86/intel_rdt/cqm: Add tasks file support

The root directory, ctrl_mon and monitor groups are populated
with a read/write file named "tasks". When read, it shows all the task
IDs assigned to the resource group.

Tasks can be added to groups by writing the PID to the file. A task can
be present in one "ctrl_mon" group "and" one "monitor" group. IOW a
PID_x can be seen in a ctrl_mon group and a monitor group at the same
time. When a task is added to a ctrl_mon group, it is automatically
removed from the previous ctrl_mon group where it belonged. Similarly if
a task is moved to a monitor group it is removed from the previous
monitor group . Also since the monitor groups can only have subset of
tasks of parent ctrl_mon group, a task can be moved to a monitor group
only if its already present in the parent ctrl_mon group.

Task membership is indicated by a new field in the task_struct "u32
rmid" which holds the RMID for the task. RMID=0 is reserved for the
default root group where the tasks belong to at mount.

[tony: zero the rmid if rdtgroup was deleted when task was being moved]

Signed-off-by: Tony Luck <[email protected]>
Signed-off-by: Vikas Shivappa <[email protected]>
Signed-off-by: Thomas Gleixner <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Link: 
http://lkml.kernel.org/r/1501017287-28083-16-git-send-email-vikas.shiva...@linux.intel.com

---
 arch/x86/kernel/cpu/intel_rdt_rdtgroup.c | 19 +++++++++++++++++--
 include/linux/sched.h                    |  1 +
 2 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c 
b/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c
index 8404054..aedad1d 100644
--- a/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c
+++ b/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c
@@ -314,6 +314,7 @@ static void move_myself(struct callback_head *head)
        if (atomic_dec_and_test(&rdtgrp->waitcount) &&
            (rdtgrp->flags & RDT_DELETED)) {
                current->closid = 0;
+               current->rmid = 0;
                kfree(rdtgrp);
        }
 
@@ -352,7 +353,20 @@ static int __rdtgroup_move_task(struct task_struct *tsk,
                atomic_dec(&rdtgrp->waitcount);
                kfree(callback);
        } else {
-               tsk->closid = rdtgrp->closid;
+               /*
+                * For ctrl_mon groups move both closid and rmid.
+                * For monitor groups, can move the tasks only from
+                * their parent CTRL group.
+                */
+               if (rdtgrp->type == RDTCTRL_GROUP) {
+                       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
+                               ret = -EINVAL;
+               }
        }
        return ret;
 }
@@ -432,7 +446,8 @@ static void show_rdt_tasks(struct rdtgroup *r, struct 
seq_file *s)
 
        rcu_read_lock();
        for_each_process_thread(p, t) {
-               if (t->closid == r->closid)
+               if ((r->type == RDTCTRL_GROUP && t->closid == r->closid) ||
+                   (r->type == RDTMON_GROUP && t->rmid == r->mon.rmid))
                        seq_printf(s, "%d\n", t->pid);
        }
        rcu_read_unlock();
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 8839fd0..067a41a 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -900,6 +900,7 @@ struct task_struct {
 #endif
 #ifdef CONFIG_INTEL_RDT
        u32                             closid;
+       u32                             rmid;
 #endif
 #ifdef CONFIG_FUTEX
        struct robust_list_head __user  *robust_list;

Reply via email to