[PATCH v4 07/10] sched/fair: Provide can_migrate_task_llc

2018-12-06 Thread Steve Sistare
Define a simpler version of can_migrate_task called can_migrate_task_llc
which does not require a struct lb_env argument, and judges whether a
migration from one CPU to another within the same LLC should be allowed.

Signed-off-by: Steve Sistare 
---
 kernel/sched/fair.c | 28 
 1 file changed, 28 insertions(+)

diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 9b7c85b..3804156 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -7207,6 +7207,34 @@ int can_migrate_task(struct task_struct *p, struct 
lb_env *env)
 }
 
 /*
+ * Return true if task @p can migrate from @rq to @dst_rq in the same LLC.
+ * No need to test for co-locality, and no need to test task_hot(), as sharing
+ * LLC provides cache warmth at that level.
+ */
+static bool
+can_migrate_task_llc(struct task_struct *p, struct rq *rq, struct rq *dst_rq)
+{
+   int dst_cpu = dst_rq->cpu;
+
+   lockdep_assert_held(>lock);
+
+   if (throttled_lb_pair(task_group(p), cpu_of(rq), dst_cpu))
+   return false;
+
+   if (!cpumask_test_cpu(dst_cpu, >cpus_allowed)) {
+   schedstat_inc(p->se.statistics.nr_failed_migrations_affine);
+   return false;
+   }
+
+   if (task_running(rq, p)) {
+   schedstat_inc(p->se.statistics.nr_failed_migrations_running);
+   return false;
+   }
+
+   return true;
+}
+
+/*
  * detach_task() -- detach the task for the migration from @src_rq to @dst_cpu.
  */
 static void detach_task(struct task_struct *p, struct rq *src_rq, int dst_cpu)
-- 
1.8.3.1



[PATCH v4 07/10] sched/fair: Provide can_migrate_task_llc

2018-12-06 Thread Steve Sistare
Define a simpler version of can_migrate_task called can_migrate_task_llc
which does not require a struct lb_env argument, and judges whether a
migration from one CPU to another within the same LLC should be allowed.

Signed-off-by: Steve Sistare 
---
 kernel/sched/fair.c | 28 
 1 file changed, 28 insertions(+)

diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 9b7c85b..3804156 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -7207,6 +7207,34 @@ int can_migrate_task(struct task_struct *p, struct 
lb_env *env)
 }
 
 /*
+ * Return true if task @p can migrate from @rq to @dst_rq in the same LLC.
+ * No need to test for co-locality, and no need to test task_hot(), as sharing
+ * LLC provides cache warmth at that level.
+ */
+static bool
+can_migrate_task_llc(struct task_struct *p, struct rq *rq, struct rq *dst_rq)
+{
+   int dst_cpu = dst_rq->cpu;
+
+   lockdep_assert_held(>lock);
+
+   if (throttled_lb_pair(task_group(p), cpu_of(rq), dst_cpu))
+   return false;
+
+   if (!cpumask_test_cpu(dst_cpu, >cpus_allowed)) {
+   schedstat_inc(p->se.statistics.nr_failed_migrations_affine);
+   return false;
+   }
+
+   if (task_running(rq, p)) {
+   schedstat_inc(p->se.statistics.nr_failed_migrations_running);
+   return false;
+   }
+
+   return true;
+}
+
+/*
  * detach_task() -- detach the task for the migration from @src_rq to @dst_cpu.
  */
 static void detach_task(struct task_struct *p, struct rq *src_rq, int dst_cpu)
-- 
1.8.3.1