Merge branch 'linux-linaro-lsk-v4.4' into linux-linaro-lsk-v4.4-android
[firefly-linux-kernel-4.4.55.git] / kernel / sched / tune.c
index d24f365b0c908e09bdcc97aaa506837c4b6dac7d..505d7b35b0e1fd27fb29cb7aa6b039c6ddc7e886 100644 (file)
@@ -125,6 +125,10 @@ struct schedtune {
 
        /* Performance Constraint (C) region threshold params */
        int perf_constrain_idx;
+
+       /* Hint to bias scheduling of tasks on that SchedTune CGroup
+        * towards idle CPUs */
+       int prefer_idle;
 };
 
 static inline struct schedtune *css_st(struct cgroup_subsys_state *css)
@@ -156,6 +160,7 @@ root_schedtune = {
        .boost  = 0,
        .perf_boost_idx = 0,
        .perf_constrain_idx = 0,
+       .prefer_idle = 0,
 };
 
 int
@@ -536,6 +541,38 @@ int schedtune_task_boost(struct task_struct *p)
        return task_boost;
 }
 
+int schedtune_prefer_idle(struct task_struct *p)
+{
+       struct schedtune *st;
+       int prefer_idle;
+
+       /* Get prefer_idle value */
+       rcu_read_lock();
+       st = task_schedtune(p);
+       prefer_idle = st->prefer_idle;
+       rcu_read_unlock();
+
+       return prefer_idle;
+}
+
+static u64
+prefer_idle_read(struct cgroup_subsys_state *css, struct cftype *cft)
+{
+       struct schedtune *st = css_st(css);
+
+       return st->prefer_idle;
+}
+
+static int
+prefer_idle_write(struct cgroup_subsys_state *css, struct cftype *cft,
+           u64 prefer_idle)
+{
+       struct schedtune *st = css_st(css);
+       st->prefer_idle = prefer_idle;
+
+       return 0;
+}
+
 static s64
 boost_read(struct cgroup_subsys_state *css, struct cftype *cft)
 {
@@ -587,6 +624,11 @@ static struct cftype files[] = {
                .read_s64 = boost_read,
                .write_s64 = boost_write,
        },
+       {
+               .name = "prefer_idle",
+               .read_u64 = prefer_idle_read,
+               .write_u64 = prefer_idle_write,
+       },
        { }     /* terminate */
 };
 
@@ -673,7 +715,7 @@ schedtune_css_free(struct cgroup_subsys_state *css)
 struct cgroup_subsys schedtune_cgrp_subsys = {
        .css_alloc      = schedtune_css_alloc,
        .css_free       = schedtune_css_free,
-//     .allow_attach   = schedtune_allow_attach,
+       .allow_attach   = schedtune_allow_attach,
        .can_attach     = schedtune_can_attach,
        .cancel_attach  = schedtune_cancel_attach,
        .legacy_cftypes = files,
@@ -694,6 +736,8 @@ schedtune_init_cgroups(void)
 
        pr_info("schedtune: configured to support %d boost groups\n",
                BOOSTGROUPS_COUNT);
+
+       schedtune_initialized = true;
 }
 
 #else /* CONFIG_CGROUP_SCHEDTUNE */
@@ -904,4 +948,4 @@ nodata:
        rcu_read_unlock();
        return -EINVAL;
 }
-late_initcall(schedtune_init);
+postcore_initcall(schedtune_init);