packages (Titanium): kernel-desktop/kernel-desktop-sched-bfs.patch - up to 240
cactus
cactus at pld-linux.org
Mon Sep 28 13:15:08 CEST 2009
Author: cactus Date: Mon Sep 28 11:15:08 2009 GMT
Module: packages Tag: Titanium
---- Log message:
- up to 240
---- Files affected:
packages/kernel-desktop:
kernel-desktop-sched-bfs.patch (1.1.2.9 -> 1.1.2.10)
---- Diffs:
================================================================
Index: packages/kernel-desktop/kernel-desktop-sched-bfs.patch
diff -u packages/kernel-desktop/kernel-desktop-sched-bfs.patch:1.1.2.9 packages/kernel-desktop/kernel-desktop-sched-bfs.patch:1.1.2.10
--- packages/kernel-desktop/kernel-desktop-sched-bfs.patch:1.1.2.9 Fri Sep 25 23:51:42 2009
+++ packages/kernel-desktop/kernel-desktop-sched-bfs.patch Mon Sep 28 13:15:03 2009
@@ -7660,3 +7660,621 @@
run_local_timers();
if (rcu_pending(cpu))
rcu_check_callbacks(cpu, user_tick);
+--- linux-2.6.31-bfs.orig/kernel/sched_bfs.c 2009-09-28 11:27:32.314473654 +1000
++++ linux-2.6.31-bfs/kernel/sched_bfs.c 2009-09-28 12:36:58.278472258 +1000
+@@ -184,12 +184,12 @@ struct rq {
+
+ struct task_struct *curr, *idle;
+ struct mm_struct *prev_mm;
+- struct list_head queue; /* Place to store currently running task */
+
+ /* Stored data about rq->curr to work outside grq lock */
+ unsigned long rq_deadline;
+ unsigned int rq_policy;
+ int rq_time_slice;
++ u64 rq_last_ran;
+ int rq_prio;
+
+ /* Accurate timekeeping data */
+@@ -417,12 +417,12 @@ static inline void task_grq_unlock(unsig
+ * This interface allows printk to be called with the runqueue lock
+ * held and know whether or not it is OK to wake up the klogd.
+ */
+-int grunqueue_is_locked(void)
++inline int grunqueue_is_locked(void)
+ {
+ return spin_is_locked(&grq.lock);
+ }
+
+-void grq_unlock_wait(void)
++inline void grq_unlock_wait(void)
+ __releases(grq.lock)
+ {
+ smp_mb(); /* spin-unlock-wait is not a full memory barrier */
+@@ -504,11 +504,6 @@ static inline int task_queued(struct tas
+ return (!list_empty(&p->run_list));
+ }
+
+-static inline int task_queued_only(struct task_struct *p)
+-{
+- return (!list_empty(&p->run_list) && !task_running(p));
+-}
+-
+ /*
+ * Removing from the global runqueue. Enter with grq locked.
+ */
+@@ -646,7 +641,7 @@ static inline void clear_cpuidle_map(uns
+ }
+
+ /* Always called from a busy cpu on UP */
+-static int suitable_idle_cpus(struct task_struct *p)
++static inline int suitable_idle_cpus(struct task_struct *p)
+ {
+ return 0;
+ }
+@@ -702,7 +697,10 @@ static int effective_prio(struct task_st
+ */
+ static void activate_task(struct task_struct *p, struct rq *rq)
+ {
+- u64 now = rq->clock;
++ u64 now;
++
++ update_rq_clock(rq);
++ now = rq->clock;
+
+ /*
+ * Sleep time is in units of nanosecs, so shift by 20 to get a
+@@ -712,11 +710,10 @@ static void activate_task(struct task_st
+ if (unlikely(prof_on == SLEEP_PROFILING)) {
+ if (p->state == TASK_UNINTERRUPTIBLE)
+ profile_hits(SLEEP_PROFILING, (void *)get_wchan(p),
+- (now - p->timestamp) >> 20);
++ (now - p->last_ran) >> 20);
+ }
+
+ p->prio = effective_prio(p);
+- p->timestamp = now;
+ if (task_contributes_to_load(p))
+ grq.nr_uninterruptible--;
+ enqueue_task(p);
+@@ -739,6 +736,7 @@ static inline void deactivate_task(struc
+ void set_task_cpu(struct task_struct *p, unsigned int cpu)
+ {
+ trace_sched_migrate_task(p, cpu);
++ perf_swcounter_event(PERF_COUNT_SW_CPU_MIGRATIONS, 1, 1, NULL, 0);
+ /*
+ * After ->cpu is set up to a new value, task_grq_lock(p, ...) can be
+ * successfuly executed on another CPU. We must ensure that updates of
+@@ -757,7 +755,6 @@ static inline void take_task(struct rq *
+ {
+ set_task_cpu(p, rq->cpu);
+ dequeue_task(p);
+- list_add(&p->run_list, &rq->queue);
+ dec_qnr();
+ }
+
+@@ -767,7 +764,6 @@ static inline void take_task(struct rq *
+ */
+ static inline void return_task(struct task_struct *p, int deactivate)
+ {
+- list_del_init(&p->run_list);
+ if (deactivate)
+ deactivate_task(p);
+ else {
+@@ -1034,27 +1030,25 @@ static inline int task_preempts_curr(str
+ /*
+ * Wake up *any* suitable cpu to schedule this task.
+ */
+-static void try_preempt(struct task_struct *p)
++static void try_preempt(struct task_struct *p, struct rq *this_rq)
+ {
+- struct rq *highest_prio_rq, *this_rq;
+ unsigned long latest_deadline, cpu;
++ struct rq *highest_prio_rq;
+ int highest_prio;
+ cpumask_t tmp;
+
+- /* Try the task's previous rq first and as a fallback */
+- this_rq = task_rq(p);
++ cpus_and(tmp, cpu_online_map, p->cpus_allowed);
+
+- if (cpu_isset(this_rq->cpu, p->cpus_allowed)) {
++ /* Use this_rq as fallback */
++ if (likely(cpu_isset(this_rq->cpu, tmp))) {
+ highest_prio_rq = this_rq;
+ /* If this_rq is idle, use that. */
+- if (rq_idle(this_rq))
++ if (rq_idle(highest_prio_rq))
+ goto found_rq;
+ } else
+- highest_prio_rq = cpu_rq(any_online_cpu(p->cpus_allowed));
+- latest_deadline = this_rq->rq_deadline;
+- highest_prio = this_rq->rq_prio;
+-
+- cpus_and(tmp, cpu_online_map, p->cpus_allowed);
++ highest_prio_rq = cpu_rq(any_online_cpu(tmp));
++ latest_deadline = highest_prio_rq->rq_deadline;
++ highest_prio = highest_prio_rq->rq_prio;
+
+ for_each_cpu_mask(cpu, tmp) {
+ struct rq *rq;
+@@ -1069,12 +1063,11 @@ static void try_preempt(struct task_stru
+ }
+
+ rq_prio = rq->rq_prio;
+- if (rq_prio > highest_prio ||
+- (rq_prio == highest_prio &&
+- time_after(rq->rq_deadline, latest_deadline))) {
+- highest_prio = rq_prio;
+- latest_deadline = rq->rq_deadline;
+- highest_prio_rq = rq;
++ if (rq_prio > highest_prio || (rq_prio == highest_prio &&
++ time_after(rq->rq_deadline, latest_deadline))) {
++ highest_prio = rq_prio;
++ latest_deadline = rq->rq_deadline;
++ highest_prio_rq = rq;
+ }
+ }
+
+@@ -1124,20 +1117,19 @@ static int try_to_wake_up(struct task_st
+ {
+ unsigned long flags;
+ int success = 0;
+- long old_state;
+ struct rq *rq;
+
+- rq = time_task_grq_lock(p, &flags);
+- old_state = p->state;
+- if (!(old_state & state))
+- goto out_unlock;
+-
+ /*
+- * Note this catches tasks that are running and queued, but returns
+- * false during the context switch when they're running and no
+- * longer queued.
++ * No need to do time_lock_grq as we only need to update the rq clock
++ * if we activate the task
+ */
+- if (task_queued(p))
++ rq = task_grq_lock(p, &flags);
++
++ /* state is a volatile long, どうして、分からない */
++ if (!(unsigned int)p->state & state)
++ goto out_unlock;
++
++ if (task_queued(p) || task_running(p))
+ goto out_running;
+
+ activate_task(p, rq);
+@@ -1148,7 +1140,7 @@ static int try_to_wake_up(struct task_st
+ * instead waiting for current to deschedule.
+ */
+ if (!sync || (sync && suitable_idle_cpus(p)))
+- try_preempt(p);
++ try_preempt(p, rq);
+ success = 1;
+
+ out_running:
+@@ -1259,7 +1251,7 @@ void wake_up_new_task(struct task_struct
+ unsigned long flags;
+ struct rq *rq;
+
+- rq = time_task_grq_lock(p, &flags); ;
++ rq = task_grq_lock(p, &flags); ;
+ parent = p->parent;
+ BUG_ON(p->state != TASK_RUNNING);
+ set_task_cpu(p, task_cpu(parent));
+@@ -1274,7 +1266,7 @@ void wake_up_new_task(struct task_struct
+ */
+ resched_task(parent);
+ } else
+- try_preempt(p);
++ try_preempt(p, rq);
+ task_grq_unlock(&flags);
+ }
+
+@@ -1718,7 +1710,7 @@ static void pc_user_time(struct rq *rq,
+ static void
+ update_cpu_clock(struct rq *rq, struct task_struct *p, int tick)
+ {
+- long time_diff = rq->clock - p->last_ran;
++ long time_diff = rq->clock - rq->rq_last_ran;
+ long account_ns = rq->clock - rq->timekeep_clock;
+ struct task_struct *idle = rq->idle;
+ unsigned long account_pc;
+@@ -1760,7 +1752,7 @@ update_cpu_clock(struct rq *rq, struct t
+ /* time_slice accounting is done in usecs to avoid overflow on 32bit */
+ if (rq->rq_policy != SCHED_FIFO && p != idle)
+ rq->rq_time_slice -= time_diff / 1000;
+- p->last_ran = rq->timekeep_clock = rq->clock;
++ rq->rq_last_ran = rq->timekeep_clock = rq->clock;
+ }
+
+ /*
+@@ -1775,7 +1767,7 @@ static u64 do_task_delta_exec(struct tas
+
+ if (p == rq->curr) {
+ update_rq_clock(rq);
+- ns = rq->clock - p->last_ran;
++ ns = rq->clock - rq->rq_last_ran;
+ if ((s64)ns < 0)
+ ns = 0;
+ }
+@@ -2039,10 +2031,8 @@ static void task_running_tick(struct rq
+ /* p->time_slice <= 0. We only modify task_struct under grq lock */
+ grq_lock();
+ p = rq->curr;
+- if (likely(task_running(p))) {
+- requeue_task(p);
+- set_tsk_need_resched(p);
+- }
++ requeue_task(p);
++ set_tsk_need_resched(p);
+ grq_unlock();
+ }
+
+@@ -2065,6 +2055,7 @@ void scheduler_tick(void)
+ task_running_tick(rq);
+ else
+ no_iso_tick();
++ perf_counter_task_tick(rq->curr, cpu);
+ }
+
+ notrace unsigned long get_parent_ip(unsigned long addr)
+@@ -2282,6 +2273,7 @@ static inline void set_rq_task(struct rq
+ {
+ rq->rq_time_slice = p->time_slice;
+ rq->rq_deadline = p->deadline;
++ rq->rq_last_ran = p->last_ran;
+ rq->rq_policy = p->policy;
+ rq->rq_prio = p->prio;
+ }
+@@ -2289,16 +2281,20 @@ static inline void set_rq_task(struct rq
+ /*
+ * schedule() is the main scheduler function.
+ */
+-asmlinkage void __sched __schedule(void)
++asmlinkage void __sched schedule(void)
+ {
+ struct task_struct *prev, *next, *idle;
+- int deactivate = 0, cpu;
+- long *switch_count;
++ unsigned long *switch_count;
++ int deactivate, cpu;
+ struct rq *rq;
+ u64 now;
+
++need_resched:
++ preempt_disable();
++
+ cpu = smp_processor_id();
+- rq = this_rq();
++ rq = cpu_rq(cpu);
++ idle = rq->idle;
+ rcu_qsctr_inc(cpu);
+ prev = rq->curr;
+ switch_count = &prev->nivcsw;
+@@ -2306,22 +2302,15 @@ asmlinkage void __sched __schedule(void)
+ release_kernel_lock(prev);
+ need_resched_nonpreemptible:
+
++ deactivate = 0;
+ schedule_debug(prev);
+- idle = rq->idle;
+- /*
+- * The idle thread is not allowed to schedule!
+- * Remove this check after it has been exercised a bit.
+- */
+- if (unlikely(prev == idle) && prev->state != TASK_RUNNING) {
+- printk(KERN_ERR "bad: scheduling from the idle thread!\n");
+- dump_stack();
+- }
+
+- grq_lock_irq();
++ local_irq_disable();
+ update_rq_clock(rq);
+ now = rq->clock;
+ update_cpu_clock(rq, prev, 0);
+
++ grq_lock();
+ clear_tsk_need_resched(prev);
+
+ if (prev->state && !(preempt_count() & PREEMPT_ACTIVE)) {
+@@ -2351,23 +2340,24 @@ need_resched_nonpreemptible:
+ schedstat_inc(rq, sched_goidle);
+ }
+
++ prefetch(next);
++ prefetch_stack(next);
++
+ if (task_idle(next))
+ set_cpuidle_map(cpu);
+ else
+ clear_cpuidle_map(cpu);
+
+- prefetch(next);
+- prefetch_stack(next);
+-
+- prev->timestamp = prev->last_ran = now;
++ prev->last_ran = now;
+
+ if (likely(prev != next)) {
+- set_rq_task(rq, next);
+-
+ sched_info_switch(prev, next);
++ perf_counter_task_sched_out(prev, next, cpu);
++
++ set_rq_task(rq, next);
+ grq.nr_switches++;
+- next->oncpu = 1;
+ prev->oncpu = 0;
++ next->oncpu = 1;
+ rq->curr = next;
+ ++*switch_count;
+
+@@ -2378,21 +2368,15 @@ need_resched_nonpreemptible:
+ */
+ cpu = smp_processor_id();
+ rq = cpu_rq(cpu);
++ idle = rq->idle;
+ } else
+ grq_unlock_irq();
+
+ if (unlikely(reacquire_kernel_lock(current) < 0))
+ goto need_resched_nonpreemptible;
+-}
+-
+-asmlinkage void __sched schedule(void)
+-{
+-need_resched:
+- preempt_disable();
+- __schedule();
+ preempt_enable_no_resched();
+- if (unlikely(test_thread_flag(TIF_NEED_RESCHED)))
+- goto need_resched;
++ if (need_resched())
++ goto need_resched;
+ }
+ EXPORT_SYMBOL(schedule);
+
+@@ -2869,7 +2853,7 @@ void rt_mutex_setprio(struct task_struct
+ rq = time_task_grq_lock(p, &flags);
+
+ oldprio = p->prio;
+- queued = task_queued_only(p);
++ queued = task_queued(p);
+ if (queued)
+ dequeue_task(p);
+ p->prio = prio;
+@@ -2877,7 +2861,7 @@ void rt_mutex_setprio(struct task_struct
+ resched_task(p);
+ if (queued) {
+ enqueue_task(p);
+- try_preempt(p);
++ try_preempt(p, rq);
+ }
+
+ task_grq_unlock(&flags);
+@@ -2889,7 +2873,7 @@ void rt_mutex_setprio(struct task_struct
+ * Adjust the deadline for when the priority is to change, before it's
+ * changed.
+ */
+-static void adjust_deadline(struct task_struct *p, int new_prio)
++static inline void adjust_deadline(struct task_struct *p, int new_prio)
+ {
+ p->deadline += (prio_ratios[USER_PRIO(new_prio)] - pratio(p)) *
+ rr_interval * HZ / 1000 / 100;
+@@ -2919,7 +2903,7 @@ void set_user_nice(struct task_struct *p
+ p->static_prio = new_static;
+ goto out_unlock;
+ }
+- queued = task_queued_only(p);
++ queued = task_queued(p);
+ /*
+ * If p is actually running, we don't need to do anything when
+ * changing the priority because the grq is unaffected.
+@@ -2933,7 +2917,7 @@ void set_user_nice(struct task_struct *p
+
+ if (queued) {
+ enqueue_task(p);
+- try_preempt(p);
++ try_preempt(p, rq);
+ }
+
+ /* Just resched the task, schedule() will know what to do. */
+@@ -3062,9 +3046,10 @@ static inline struct task_struct *find_p
+ }
+
+ /* Actually do priority change: must hold grq lock. */
+-static void __setscheduler(struct task_struct *p, int policy, int prio)
++static void
++__setscheduler(struct task_struct *p, struct rq *rq, int policy, int prio)
+ {
+- BUG_ON(task_queued_only(p));
++ BUG_ON(task_queued(p));
+
+ p->policy = policy;
+ p->rt_priority = prio;
+@@ -3207,14 +3192,14 @@ recheck:
+ goto recheck;
+ }
+ update_rq_clock(rq);
+- queued = task_queued_only(p);
++ queued = task_queued(p);
+ if (queued)
+ dequeue_task(p);
+ oldprio = p->prio;
+- __setscheduler(p, policy, param->sched_priority);
++ __setscheduler(p, rq, policy, param->sched_priority);
+ if (queued) {
+ enqueue_task(p);
+- try_preempt(p);
++ try_preempt(p, rq);
+ }
+ __task_grq_unlock();
+ spin_unlock_irqrestore(&p->pi_lock, flags);
+@@ -3845,13 +3830,11 @@ void __cpuinit init_idle(struct task_str
+ unsigned long flags;
+
+ time_grq_lock(rq, &flags);
+- idle->timestamp = idle->last_ran = rq->clock;
++ idle->last_ran = rq->clock;
+ idle->state = TASK_RUNNING;
+ /* Setting prio to illegal value shouldn't matter when never queued */
+- idle->prio = rq->rq_prio = PRIO_LIMIT;
+- rq->rq_deadline = idle->deadline;
+- rq->rq_policy = idle->policy;
+- rq->rq_time_slice = idle->time_slice;
++ idle->prio = PRIO_LIMIT;
++ set_rq_task(rq, idle);
+ idle->cpus_allowed = cpumask_of_cpu(cpu);
+ set_task_cpu(idle, cpu);
+ rq->curr = rq->idle = idle;
+@@ -4039,10 +4022,9 @@ int set_cpus_allowed_ptr(struct task_str
+ goto out;
+ }
+
+- queued = task_queued_only(p);
++ queued = task_queued(p);
+
+ cpumask_copy(&p->cpus_allowed, new_mask);
+- p->rt_nr_cpus_allowed = cpumask_weight(new_mask);
+
+ /* Can the task run on the task's current CPU? If so, we're done */
+ if (cpumask_test_cpu(task_cpu(p), new_mask))
+@@ -4057,7 +4039,7 @@ int set_cpus_allowed_ptr(struct task_str
+
+ out:
+ if (queued)
+- try_preempt(p);
++ try_preempt(p, rq);
+ task_grq_unlock(&flags);
+
+ if (running_wrong)
+@@ -4088,7 +4070,7 @@ void sched_idle_next(void)
+ */
+ time_grq_lock(rq, &flags);
+
+- __setscheduler(idle, SCHED_FIFO, MAX_RT_PRIO - 1);
++ __setscheduler(idle, rq, SCHED_FIFO, MAX_RT_PRIO - 1);
+
+ activate_idle_task(idle);
+ set_tsk_need_resched(rq->curr);
+@@ -4318,8 +4300,6 @@ static void remove_cpu(unsigned long cpu
+ if (cpus_empty(cpus_remaining)) {
+ cpumask_copy(&p->unplugged_mask, &p->cpus_allowed);
+ cpumask_copy(&p->cpus_allowed, &cpu_possible_map);
+- p->rt_nr_cpus_allowed =
+- cpumask_weight(&cpu_possible_map);
+ }
+ } while_each_thread(t, p);
+
+@@ -4352,8 +4332,6 @@ static void add_cpu(unsigned long cpu)
+ * set all the cpus back.
+ */
+ cpumask_copy(&p->cpus_allowed, &p->unplugged_mask);
+- p->rt_nr_cpus_allowed =
+- cpumask_weight(&p->cpus_allowed);
+ cpus_clear(p->unplugged_mask);
+ }
+ }
+@@ -4413,7 +4391,7 @@ migration_call(struct notifier_block *nf
+ remove_cpu(cpu);
+ return_task(idle, 1);
+ idle->static_prio = MAX_PRIO;
+- __setscheduler(idle, SCHED_NORMAL, 0);
++ __setscheduler(idle, rq, SCHED_NORMAL, 0);
+ idle->prio = PRIO_LIMIT;
+ set_rq_task(rq, idle);
+ update_rq_clock(rq);
+@@ -5904,7 +5882,7 @@ int in_sched_functions(unsigned long add
+ && addr < (unsigned long)__sched_text_end);
+ }
+
+-void __init sched_init(void)
++void sched_init(void)
+ {
+ int i;
+ int highest_cpu = 0;
+@@ -5913,16 +5891,16 @@ void __init sched_init(void)
+ for (i = 1 ; i < PRIO_RANGE ; i++)
+ prio_ratios[i] = prio_ratios[i - 1] * 11 / 10;
+
++ spin_lock_init(&grq.lock);
+ #ifdef CONFIG_SMP
+ init_defrootdomain();
+ cpus_clear(grq.cpu_idle_map);
++ grq.qnr = 0;
+ #endif
+- spin_lock_init(&grq.lock);
+ for_each_possible_cpu(i) {
+ struct rq *rq;
+
+ rq = cpu_rq(i);
+- INIT_LIST_HEAD(&rq->queue);
+ rq->rq_deadline = 0;
+ rq->rq_prio = 0;
+ rq->cpu = i;
+@@ -6026,13 +6004,13 @@ void normalize_rt_tasks(void)
+ rq = __task_grq_lock(p);
+ update_rq_clock(rq);
+
+- queued = task_queued_only(p);
++ queued = task_queued(p);
+ if (queued)
+ dequeue_task(p);
+- __setscheduler(p, SCHED_NORMAL, 0);
++ __setscheduler(p, rq, SCHED_NORMAL, 0);
+ if (queued) {
+ enqueue_task(p);
+- try_preempt(p);
++ try_preempt(p, rq);
+ }
+
+ __task_grq_unlock();
+Index: linux-2.6.31-bfs/include/linux/sched.h
+===================================================================
+--- linux-2.6.31-bfs.orig/include/linux/sched.h 2009-09-28 11:27:32.302471533 +1000
++++ linux-2.6.31-bfs/include/linux/sched.h 2009-09-28 11:30:10.346471389 +1000
+@@ -1027,16 +1027,14 @@ struct task_struct {
+ int lock_depth; /* BKL lock depth */
+
+ int oncpu;
+- int load_weight; /* for niceness load balancing purposes */
+ int prio, static_prio, normal_prio;
+ int time_slice, first_time_slice;
+ unsigned long deadline;
+ struct list_head run_list;
+ unsigned int rt_priority;
+- unsigned long long timestamp, last_ran;
++ u64 last_ran;
<<Diff was trimmed, longer than 597 lines>>
---- CVS-web:
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/kernel-desktop/kernel-desktop-sched-bfs.patch?r1=1.1.2.9&r2=1.1.2.10&f=u
More information about the pld-cvs-commit
mailing list