Clean up duplicate includes in fs/ecryptfs/
[cascardo/linux.git] / kernel / sched_fair.c
index d8502ec..a17b785 100644 (file)
  * (default: 20ms, units: nanoseconds)
  *
  * NOTE: this latency value is not the same as the concept of
- * 'timeslice length' - timeslices in CFS are of variable length.
- * (to see the precise effective timeslice length of your workload,
- *  run vmstat and monitor the context-switches field)
+ * 'timeslice length' - timeslices in CFS are of variable length
+ * and have no persistent notion like in traditional, time-slice
+ * based scheduling concepts.
  *
- * On SMP systems the value of this is multiplied by the log2 of the
- * number of CPUs. (i.e. factor 2x on 2-way systems, 3x on 4-way
- * systems, 4x on 8-way systems, 5x on 16-way systems, etc.)
- * Targeted preemption latency for CPU-bound tasks:
+ * (to see the precise effective timeslice length of your workload,
+ *  run vmstat and monitor the context-switches (cs) field)
  */
 const_debug unsigned int sysctl_sched_latency = 20000000ULL;
 
@@ -76,6 +74,8 @@ const_debug unsigned int sysctl_sched_batch_wakeup_granularity = 10000000UL;
  */
 const_debug unsigned int sysctl_sched_wakeup_granularity = 10000000UL;
 
+const_debug unsigned int sysctl_sched_migration_cost = 500000UL;
+
 /**************************************************************
  * CFS operations on generic schedulable entities:
  */
@@ -112,8 +112,7 @@ static inline struct task_struct *task_of(struct sched_entity *se)
  * Scheduling class tree data structure manipulation methods:
  */
 
-static inline u64
-max_vruntime(u64 min_vruntime, u64 vruntime)
+static inline u64 max_vruntime(u64 min_vruntime, u64 vruntime)
 {
        s64 delta = (s64)(vruntime - min_vruntime);
        if (delta > 0)
@@ -122,8 +121,7 @@ max_vruntime(u64 min_vruntime, u64 vruntime)
        return min_vruntime;
 }
 
-static inline u64
-min_vruntime(u64 min_vruntime, u64 vruntime)
+static inline u64 min_vruntime(u64 min_vruntime, u64 vruntime)
 {
        s64 delta = (s64)(vruntime - min_vruntime);
        if (delta < 0)
@@ -132,8 +130,7 @@ min_vruntime(u64 min_vruntime, u64 vruntime)
        return min_vruntime;
 }
 
-static inline s64
-entity_key(struct cfs_rq *cfs_rq, struct sched_entity *se)
+static inline s64 entity_key(struct cfs_rq *cfs_rq, struct sched_entity *se)
 {
        return se->vruntime - cfs_rq->min_vruntime;
 }
@@ -141,8 +138,7 @@ entity_key(struct cfs_rq *cfs_rq, struct sched_entity *se)
 /*
  * Enqueue an entity into the rb-tree:
  */
-static void
-__enqueue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se)
+static void __enqueue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se)
 {
        struct rb_node **link = &cfs_rq->tasks_timeline.rb_node;
        struct rb_node *parent = NULL;
@@ -179,8 +175,7 @@ __enqueue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se)
        rb_insert_color(&se->run_node, &cfs_rq->tasks_timeline);
 }
 
-static void
-__dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se)
+static void __dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se)
 {
        if (cfs_rq->rb_leftmost == &se->run_node)
                cfs_rq->rb_leftmost = rb_next(&se->run_node);
@@ -366,7 +361,6 @@ update_stats_wait_end(struct cfs_rq *cfs_rq, struct sched_entity *se)
 static inline void
 update_stats_dequeue(struct cfs_rq *cfs_rq, struct sched_entity *se)
 {
-       update_curr(cfs_rq);
        /*
         * Mark the end of the wait period if dequeueing a
         * waiting task:
@@ -387,15 +381,6 @@ update_stats_curr_start(struct cfs_rq *cfs_rq, struct sched_entity *se)
        se->exec_start = rq_of(cfs_rq)->clock;
 }
 
-/*
- * We are descheduling a task - update its stats:
- */
-static inline void
-update_stats_curr_end(struct cfs_rq *cfs_rq, struct sched_entity *se)
-{
-       se->exec_start = 0;
-}
-
 /**************************************************
  * Scheduling class queueing methods:
  */
@@ -478,7 +463,7 @@ place_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int initial)
 
        vruntime = cfs_rq->min_vruntime;
 
-       if (sched_feat(USE_TREE_AVG)) {
+       if (sched_feat(TREE_AVG)) {
                struct sched_entity *last = __pick_last_entity(cfs_rq);
                if (last) {
                        vruntime += last->vruntime;
@@ -491,7 +476,8 @@ place_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int initial)
                vruntime += sched_vslice_add(cfs_rq, se);
 
        if (!initial) {
-               if (sched_feat(NEW_FAIR_SLEEPERS))
+               if (sched_feat(NEW_FAIR_SLEEPERS) && entity_is_task(se) &&
+                               task_of(se)->policy != SCHED_BATCH)
                        vruntime -= sysctl_sched_latency;
 
                vruntime = max_t(s64, vruntime, se->vruntime);
@@ -505,7 +491,7 @@ static void
 enqueue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int wakeup)
 {
        /*
-        * Update the fair clock.
+        * Update run-time statistics of the 'current'.
         */
        update_curr(cfs_rq);
 
@@ -524,8 +510,14 @@ enqueue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int wakeup)
 static void
 dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int sleep)
 {
+       /*
+        * Update run-time statistics of the 'current'.
+        */
+       update_curr(cfs_rq);
+
        update_stats_dequeue(cfs_rq, se);
        if (sleep) {
+               se->peer_preempt = 0;
 #ifdef CONFIG_SCHEDSTATS
                if (entity_is_task(se)) {
                        struct task_struct *tsk = task_of(se);
@@ -553,8 +545,10 @@ check_preempt_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr)
 
        ideal_runtime = sched_slice(cfs_rq, curr);
        delta_exec = curr->sum_exec_runtime - curr->prev_sum_exec_runtime;
-       if (delta_exec > ideal_runtime)
+       if (delta_exec > ideal_runtime ||
+                       (sched_feat(PREEMPT_RESTRICT) && curr->peer_preempt))
                resched_task(rq_of(cfs_rq)->curr);
+       curr->peer_preempt = 0;
 }
 
 static void
@@ -608,8 +602,6 @@ static void put_prev_entity(struct cfs_rq *cfs_rq, struct sched_entity *prev)
        if (prev->on_rq)
                update_curr(cfs_rq);
 
-       update_stats_curr_end(cfs_rq, prev);
-
        check_spread(cfs_rq, prev);
        if (prev->on_rq) {
                update_stats_wait_start(cfs_rq, prev);
@@ -626,7 +618,7 @@ static void entity_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr)
         */
        update_curr(cfs_rq);
 
-       if (cfs_rq->nr_running > 1)
+       if (cfs_rq->nr_running > 1 || !sched_feat(WAKEUP_PREEMPT))
                check_preempt_tick(cfs_rq, curr);
 }
 
@@ -787,8 +779,7 @@ static void yield_task_fair(struct rq *rq)
        if (likely(!sysctl_sched_compat_yield)) {
                __update_rq_clock(rq);
                /*
-                * Dequeue and enqueue the task to update its
-                * position within the tree:
+                * Update run-time statistics of the 'current'.
                 */
                update_curr(cfs_rq);
 
@@ -820,7 +811,7 @@ static void check_preempt_wakeup(struct rq *rq, struct task_struct *p)
        struct task_struct *curr = rq->curr;
        struct cfs_rq *cfs_rq = task_cfs_rq(curr);
        struct sched_entity *se = &curr->se, *pse = &p->se;
-       s64 delta;
+       s64 delta, gran;
 
        if (unlikely(rt_prio(p->prio))) {
                update_rq_clock(rq);
@@ -828,16 +819,31 @@ static void check_preempt_wakeup(struct rq *rq, struct task_struct *p)
                resched_task(curr);
                return;
        }
+       /*
+        * Batch tasks do not preempt (their preemption is driven by
+        * the tick):
+        */
+       if (unlikely(p->policy == SCHED_BATCH))
+               return;
 
-       while (!is_same_group(se, pse)) {
-               se = parent_entity(se);
-               pse = parent_entity(pse);
-       }
+       if (sched_feat(WAKEUP_PREEMPT)) {
+               while (!is_same_group(se, pse)) {
+                       se = parent_entity(se);
+                       pse = parent_entity(pse);
+               }
 
-       delta = se->vruntime - pse->vruntime;
+               delta = se->vruntime - pse->vruntime;
+               gran = sysctl_sched_wakeup_granularity;
+               if (unlikely(se->load.weight != NICE_0_LOAD))
+                       gran = calc_delta_fair(gran, &se->load);
 
-       if (delta > (s64)sysctl_sched_wakeup_granularity)
-               resched_task(curr);
+               if (delta > gran) {
+                       int now = !sched_feat(PREEMPT_RESTRICT);
+
+                       if (now || p->prio < curr->prio || !se->peer_preempt++)
+                               resched_task(curr);
+               }
+       }
 }
 
 static struct task_struct *pick_next_task_fair(struct rq *rq)
@@ -1009,13 +1015,14 @@ static void task_new_fair(struct rq *rq, struct task_struct *p)
 {
        struct cfs_rq *cfs_rq = task_cfs_rq(p);
        struct sched_entity *se = &p->se, *curr = cfs_rq->curr;
+       int this_cpu = smp_processor_id();
 
        sched_info_queued(p);
 
        update_curr(cfs_rq);
        place_entity(cfs_rq, se, 1);
 
-       if (sysctl_sched_child_runs_first &&
+       if (sysctl_sched_child_runs_first && this_cpu == task_cpu(p) &&
                        curr->vruntime < se->vruntime) {
                /*
                 * Upon rescheduling, sched_class::put_prev_task() will place
@@ -1029,6 +1036,7 @@ static void task_new_fair(struct rq *rq, struct task_struct *p)
        check_spread(cfs_rq, curr);
        __enqueue_entity(cfs_rq, se);
        account_entity_enqueue(cfs_rq, se);
+       se->peer_preempt = 0;
        resched_task(rq->curr);
 }