mirror of
https://github.com/genesi/linux-legacy.git
synced 2026-09-17 20:24:24 +00:00
BFS: back out BFS scheduler for stability reasons
It works faster sometimes, other times not.. the code is so old now
This commit is contained in:
@@ -109,68 +109,6 @@ extern struct cred init_cred;
|
||||
* INIT_TASK is used to set up the first task table, touch at
|
||||
* your own risk!. Base=0, limit=0x1fffff (=2MB)
|
||||
*/
|
||||
#ifdef CONFIG_SCHED_BFS
|
||||
#define INIT_TASK(tsk) \
|
||||
{ \
|
||||
.state = 0, \
|
||||
.stack = &init_thread_info, \
|
||||
.usage = ATOMIC_INIT(2), \
|
||||
.flags = PF_KTHREAD, \
|
||||
.lock_depth = -1, \
|
||||
.prio = NORMAL_PRIO, \
|
||||
.static_prio = MAX_PRIO-20, \
|
||||
.normal_prio = NORMAL_PRIO, \
|
||||
.deadline = 0, \
|
||||
.policy = SCHED_NORMAL, \
|
||||
.cpus_allowed = CPU_MASK_ALL, \
|
||||
.mm = NULL, \
|
||||
.active_mm = &init_mm, \
|
||||
.run_list = LIST_HEAD_INIT(tsk.run_list), \
|
||||
.time_slice = HZ, \
|
||||
.tasks = LIST_HEAD_INIT(tsk.tasks), \
|
||||
.pushable_tasks = PLIST_NODE_INIT(tsk.pushable_tasks, MAX_PRIO), \
|
||||
.ptraced = LIST_HEAD_INIT(tsk.ptraced), \
|
||||
.ptrace_entry = LIST_HEAD_INIT(tsk.ptrace_entry), \
|
||||
.real_parent = &tsk, \
|
||||
.parent = &tsk, \
|
||||
.children = LIST_HEAD_INIT(tsk.children), \
|
||||
.sibling = LIST_HEAD_INIT(tsk.sibling), \
|
||||
.group_leader = &tsk, \
|
||||
.real_cred = &init_cred, \
|
||||
.cred = &init_cred, \
|
||||
.cred_guard_mutex = \
|
||||
__MUTEX_INITIALIZER(tsk.cred_guard_mutex), \
|
||||
.comm = "swapper", \
|
||||
.thread = INIT_THREAD, \
|
||||
.fs = &init_fs, \
|
||||
.files = &init_files, \
|
||||
.signal = &init_signals, \
|
||||
.sighand = &init_sighand, \
|
||||
.nsproxy = &init_nsproxy, \
|
||||
.pending = { \
|
||||
.list = LIST_HEAD_INIT(tsk.pending.list), \
|
||||
.signal = {{0}}}, \
|
||||
.blocked = {{0}}, \
|
||||
.alloc_lock = __SPIN_LOCK_UNLOCKED(tsk.alloc_lock), \
|
||||
.journal_info = NULL, \
|
||||
.cpu_timers = INIT_CPU_TIMERS(tsk.cpu_timers), \
|
||||
.fs_excl = ATOMIC_INIT(0), \
|
||||
.pi_lock = __SPIN_LOCK_UNLOCKED(tsk.pi_lock), \
|
||||
.timer_slack_ns = 50000, /* 50 usec default slack */ \
|
||||
.pids = { \
|
||||
[PIDTYPE_PID] = INIT_PID_LINK(PIDTYPE_PID), \
|
||||
[PIDTYPE_PGID] = INIT_PID_LINK(PIDTYPE_PGID), \
|
||||
[PIDTYPE_SID] = INIT_PID_LINK(PIDTYPE_SID), \
|
||||
}, \
|
||||
.dirties = INIT_PROP_LOCAL_SINGLE(dirties), \
|
||||
INIT_IDS \
|
||||
INIT_PERF_COUNTERS(tsk) \
|
||||
INIT_TRACE_IRQFLAGS \
|
||||
INIT_LOCKDEP \
|
||||
INIT_FTRACE_GRAPH \
|
||||
INIT_TRACE_RECURSION \
|
||||
}
|
||||
#else /* CONFIG_SCHED_BFS */
|
||||
#define INIT_TASK(tsk) \
|
||||
{ \
|
||||
.state = 0, \
|
||||
@@ -230,14 +168,13 @@ extern struct cred init_cred;
|
||||
}, \
|
||||
.dirties = INIT_PROP_LOCAL_SINGLE(dirties), \
|
||||
INIT_IDS \
|
||||
INIT_PERF_EVENTS(tsk) \
|
||||
INIT_PERF_COUNTERS(tsk) \
|
||||
INIT_TRACE_IRQFLAGS \
|
||||
INIT_LOCKDEP \
|
||||
INIT_FTRACE_GRAPH \
|
||||
INIT_TRACE_RECURSION \
|
||||
INIT_TASK_RCU_PREEMPT(tsk) \
|
||||
}
|
||||
#endif /* CONFIG_SCHED_BFS */
|
||||
|
||||
|
||||
#define INIT_CPU_TIMERS(cpu_timers) \
|
||||
{ \
|
||||
|
||||
@@ -64,8 +64,6 @@ static inline int task_ioprio_class(struct io_context *ioc)
|
||||
|
||||
static inline int task_nice_ioprio(struct task_struct *task)
|
||||
{
|
||||
if (iso_task(task))
|
||||
return 0;
|
||||
return (task_nice(task) + 20) / 5;
|
||||
}
|
||||
|
||||
|
||||
@@ -164,7 +164,7 @@ static inline u64 get_jiffies_64(void)
|
||||
* Have the 32 bit jiffies value wrap 5 minutes after boot
|
||||
* so jiffies wrap bugs show up earlier.
|
||||
*/
|
||||
#define INITIAL_JIFFIES ((unsigned long)(unsigned int) (-10*HZ))
|
||||
#define INITIAL_JIFFIES ((unsigned long)(unsigned int) (-300*HZ))
|
||||
|
||||
/*
|
||||
* Change timeval to jiffies, trying to avoid the
|
||||
|
||||
@@ -36,16 +36,8 @@
|
||||
#define SCHED_FIFO 1
|
||||
#define SCHED_RR 2
|
||||
#define SCHED_BATCH 3
|
||||
/* SCHED_ISO: Implemented on BFS only */
|
||||
/* SCHED_ISO: reserved but not implemented yet */
|
||||
#define SCHED_IDLE 5
|
||||
#ifdef CONFIG_SCHED_BFS
|
||||
#define SCHED_ISO 4
|
||||
#define SCHED_IDLEPRIO SCHED_IDLE
|
||||
|
||||
#define SCHED_MAX (SCHED_IDLEPRIO)
|
||||
#define SCHED_RANGE(policy) ((policy) <= SCHED_MAX)
|
||||
#endif
|
||||
|
||||
/* Can be ORed in to make sure the process is reverted back to SCHED_NORMAL on fork */
|
||||
#define SCHED_RESET_ON_FORK 0x40000000
|
||||
|
||||
@@ -148,7 +140,7 @@ extern int nr_processes(void);
|
||||
extern unsigned long nr_running(void);
|
||||
extern unsigned long nr_uninterruptible(void);
|
||||
extern unsigned long nr_iowait(void);
|
||||
extern void calc_global_load(void);
|
||||
extern void calc_global_load(unsigned long ticks);
|
||||
extern u64 cpu_nr_migrations(int cpu);
|
||||
|
||||
extern unsigned long get_parent_ip(unsigned long addr);
|
||||
@@ -264,6 +256,9 @@ extern asmlinkage void schedule_tail(struct task_struct *prev);
|
||||
extern void init_idle(struct task_struct *idle, int cpu);
|
||||
extern void init_idle_bootup_task(struct task_struct *idle);
|
||||
|
||||
extern int runqueue_is_locked(void);
|
||||
extern void task_rq_unlock_wait(struct task_struct *p);
|
||||
|
||||
extern cpumask_var_t nohz_cpu_mask;
|
||||
#if defined(CONFIG_SMP) && defined(CONFIG_NO_HZ)
|
||||
extern int select_nohz_load_balancer(int cpu);
|
||||
@@ -1028,6 +1023,148 @@ struct uts_namespace;
|
||||
struct rq;
|
||||
struct sched_domain;
|
||||
|
||||
struct sched_class {
|
||||
const struct sched_class *next;
|
||||
|
||||
void (*enqueue_task) (struct rq *rq, struct task_struct *p, int wakeup);
|
||||
void (*dequeue_task) (struct rq *rq, struct task_struct *p, int sleep);
|
||||
void (*yield_task) (struct rq *rq);
|
||||
|
||||
void (*check_preempt_curr) (struct rq *rq, struct task_struct *p, int sync);
|
||||
|
||||
struct task_struct * (*pick_next_task) (struct rq *rq);
|
||||
void (*put_prev_task) (struct rq *rq, struct task_struct *p);
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
int (*select_task_rq)(struct task_struct *p, int sync);
|
||||
|
||||
unsigned long (*load_balance) (struct rq *this_rq, int this_cpu,
|
||||
struct rq *busiest, unsigned long max_load_move,
|
||||
struct sched_domain *sd, enum cpu_idle_type idle,
|
||||
int *all_pinned, int *this_best_prio);
|
||||
|
||||
int (*move_one_task) (struct rq *this_rq, int this_cpu,
|
||||
struct rq *busiest, struct sched_domain *sd,
|
||||
enum cpu_idle_type idle);
|
||||
void (*pre_schedule) (struct rq *this_rq, struct task_struct *task);
|
||||
int (*needs_post_schedule) (struct rq *this_rq);
|
||||
void (*post_schedule) (struct rq *this_rq);
|
||||
void (*task_wake_up) (struct rq *this_rq, struct task_struct *task);
|
||||
|
||||
void (*set_cpus_allowed)(struct task_struct *p,
|
||||
const struct cpumask *newmask);
|
||||
|
||||
void (*rq_online)(struct rq *rq);
|
||||
void (*rq_offline)(struct rq *rq);
|
||||
#endif
|
||||
|
||||
void (*set_curr_task) (struct rq *rq);
|
||||
void (*task_tick) (struct rq *rq, struct task_struct *p, int queued);
|
||||
void (*task_new) (struct rq *rq, struct task_struct *p);
|
||||
|
||||
void (*switched_from) (struct rq *this_rq, struct task_struct *task,
|
||||
int running);
|
||||
void (*switched_to) (struct rq *this_rq, struct task_struct *task,
|
||||
int running);
|
||||
void (*prio_changed) (struct rq *this_rq, struct task_struct *task,
|
||||
int oldprio, int running);
|
||||
|
||||
#ifdef CONFIG_FAIR_GROUP_SCHED
|
||||
void (*moved_group) (struct task_struct *p);
|
||||
#endif
|
||||
};
|
||||
|
||||
struct load_weight {
|
||||
unsigned long weight, inv_weight;
|
||||
};
|
||||
|
||||
/*
|
||||
* CFS stats for a schedulable entity (task, task-group etc)
|
||||
*
|
||||
* Current field usage histogram:
|
||||
*
|
||||
* 4 se->block_start
|
||||
* 4 se->run_node
|
||||
* 4 se->sleep_start
|
||||
* 6 se->load.weight
|
||||
*/
|
||||
struct sched_entity {
|
||||
struct load_weight load; /* for load-balancing */
|
||||
struct rb_node run_node;
|
||||
struct list_head group_node;
|
||||
unsigned int on_rq;
|
||||
|
||||
u64 exec_start;
|
||||
u64 sum_exec_runtime;
|
||||
u64 vruntime;
|
||||
u64 prev_sum_exec_runtime;
|
||||
|
||||
u64 last_wakeup;
|
||||
u64 avg_overlap;
|
||||
|
||||
u64 nr_migrations;
|
||||
|
||||
u64 start_runtime;
|
||||
u64 avg_wakeup;
|
||||
|
||||
#ifdef CONFIG_SCHEDSTATS
|
||||
u64 wait_start;
|
||||
u64 wait_max;
|
||||
u64 wait_count;
|
||||
u64 wait_sum;
|
||||
|
||||
u64 sleep_start;
|
||||
u64 sleep_max;
|
||||
s64 sum_sleep_runtime;
|
||||
|
||||
u64 block_start;
|
||||
u64 block_max;
|
||||
u64 exec_max;
|
||||
u64 slice_max;
|
||||
|
||||
u64 nr_migrations_cold;
|
||||
u64 nr_failed_migrations_affine;
|
||||
u64 nr_failed_migrations_running;
|
||||
u64 nr_failed_migrations_hot;
|
||||
u64 nr_forced_migrations;
|
||||
u64 nr_forced2_migrations;
|
||||
|
||||
u64 nr_wakeups;
|
||||
u64 nr_wakeups_sync;
|
||||
u64 nr_wakeups_migrate;
|
||||
u64 nr_wakeups_local;
|
||||
u64 nr_wakeups_remote;
|
||||
u64 nr_wakeups_affine;
|
||||
u64 nr_wakeups_affine_attempts;
|
||||
u64 nr_wakeups_passive;
|
||||
u64 nr_wakeups_idle;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_FAIR_GROUP_SCHED
|
||||
struct sched_entity *parent;
|
||||
/* rq on which this entity is (to be) queued: */
|
||||
struct cfs_rq *cfs_rq;
|
||||
/* rq "owned" by this entity/group: */
|
||||
struct cfs_rq *my_q;
|
||||
#endif
|
||||
};
|
||||
|
||||
struct sched_rt_entity {
|
||||
struct list_head run_list;
|
||||
unsigned long timeout;
|
||||
unsigned int time_slice;
|
||||
int nr_cpus_allowed;
|
||||
|
||||
struct sched_rt_entity *back;
|
||||
#ifdef CONFIG_RT_GROUP_SCHED
|
||||
struct sched_rt_entity *parent;
|
||||
/* rq on which this entity is (to be) queued: */
|
||||
struct rt_rq *rt_rq;
|
||||
/* rq "owned" by this entity/group: */
|
||||
struct rt_rq *my_q;
|
||||
#endif
|
||||
};
|
||||
|
||||
struct task_struct {
|
||||
volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */
|
||||
void *stack;
|
||||
@@ -1037,33 +1174,17 @@ struct task_struct {
|
||||
|
||||
int lock_depth; /* BKL lock depth */
|
||||
|
||||
#ifndef CONFIG_SCHED_BFS
|
||||
#ifdef CONFIG_SMP
|
||||
#ifdef __ARCH_WANT_UNLOCKED_CTXSW
|
||||
int oncpu;
|
||||
#endif
|
||||
#endif
|
||||
#else /* CONFIG_SCHED_BFS */
|
||||
int oncpu;
|
||||
#endif
|
||||
|
||||
int prio, static_prio, normal_prio;
|
||||
unsigned int rt_priority;
|
||||
#ifdef CONFIG_SCHED_BFS
|
||||
int time_slice;
|
||||
u64 deadline;
|
||||
struct list_head run_list;
|
||||
u64 last_ran;
|
||||
u64 sched_time; /* sched_clock time spent running */
|
||||
#ifdef CONFIG_SMP
|
||||
int sticky; /* Soft affined flag */
|
||||
#endif
|
||||
unsigned long rt_timeout;
|
||||
#else /* CONFIG_SCHED_BFS */
|
||||
const struct sched_class *sched_class;
|
||||
struct sched_entity se;
|
||||
struct sched_rt_entity rt;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PREEMPT_NOTIFIERS
|
||||
/* list of struct preempt_notifier: */
|
||||
@@ -1158,9 +1279,6 @@ struct task_struct {
|
||||
int __user *clear_child_tid; /* CLONE_CHILD_CLEARTID */
|
||||
|
||||
cputime_t utime, stime, utimescaled, stimescaled;
|
||||
#ifdef CONFIG_SCHED_BFS
|
||||
unsigned long utime_pc, stime_pc;
|
||||
#endif
|
||||
cputime_t gtime;
|
||||
cputime_t prev_utime, prev_stime;
|
||||
unsigned long nvcsw, nivcsw; /* context switch counts */
|
||||
@@ -1370,66 +1488,6 @@ struct task_struct {
|
||||
#endif /* CONFIG_TRACING */
|
||||
};
|
||||
|
||||
#ifdef CONFIG_SCHED_BFS
|
||||
extern int grunqueue_is_locked(void);
|
||||
extern void grq_unlock_wait(void);
|
||||
extern void cpu_scaling(int cpu);
|
||||
extern void cpu_nonscaling(int cpu);
|
||||
#define tsk_seruntime(t) ((t)->sched_time)
|
||||
#define tsk_rttimeout(t) ((t)->rt_timeout)
|
||||
#define task_rq_unlock_wait(tsk) grq_unlock_wait()
|
||||
|
||||
static inline void set_oom_timeslice(struct task_struct *p)
|
||||
{
|
||||
p->time_slice = HZ;
|
||||
}
|
||||
|
||||
static inline void tsk_cpus_current(struct task_struct *p)
|
||||
{
|
||||
}
|
||||
|
||||
#define runqueue_is_locked(cpu) grunqueue_is_locked()
|
||||
|
||||
static inline void print_scheduler_version(void)
|
||||
{
|
||||
printk(KERN_INFO"BFS CPU scheduler v0.376 by Con Kolivas.\n");
|
||||
}
|
||||
|
||||
static inline int iso_task(struct task_struct *p)
|
||||
{
|
||||
return (p->policy == SCHED_ISO);
|
||||
}
|
||||
#else
|
||||
extern int runqueue_is_locked(int cpu);
|
||||
extern void task_rq_unlock_wait(struct task_struct *p);
|
||||
#define tsk_seruntime(t) ((t)->se.sum_exec_runtime)
|
||||
#define tsk_rttimeout(t) ((t)->rt.timeout)
|
||||
|
||||
static inline void sched_exit(struct task_struct *p)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void set_oom_timeslice(struct task_struct *p)
|
||||
{
|
||||
p->rt.time_slice = HZ;
|
||||
}
|
||||
|
||||
static inline void tsk_cpus_current(struct task_struct *p)
|
||||
{
|
||||
p->rt.nr_cpus_allowed = current->rt.nr_cpus_allowed;
|
||||
}
|
||||
|
||||
static inline void print_scheduler_version(void)
|
||||
{
|
||||
printk(KERN_INFO"CFS CPU scheduler.\n");
|
||||
}
|
||||
|
||||
static inline int iso_task(struct task_struct *p)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Future-safe accessor for struct task_struct's cpus_allowed. */
|
||||
#define tsk_cpumask(tsk) (&(tsk)->cpus_allowed)
|
||||
|
||||
@@ -1448,19 +1506,9 @@ static inline int iso_task(struct task_struct *p)
|
||||
|
||||
#define MAX_USER_RT_PRIO 100
|
||||
#define MAX_RT_PRIO MAX_USER_RT_PRIO
|
||||
#define DEFAULT_PRIO (MAX_RT_PRIO + 20)
|
||||
|
||||
#ifdef CONFIG_SCHED_BFS
|
||||
#define PRIO_RANGE (40)
|
||||
#define MAX_PRIO (MAX_RT_PRIO + PRIO_RANGE)
|
||||
#define ISO_PRIO (MAX_RT_PRIO)
|
||||
#define NORMAL_PRIO (MAX_RT_PRIO + 1)
|
||||
#define IDLE_PRIO (MAX_RT_PRIO + 2)
|
||||
#define PRIO_LIMIT ((IDLE_PRIO) + 1)
|
||||
#else /* CONFIG_SCHED_BFS */
|
||||
#define MAX_PRIO (MAX_RT_PRIO + 40)
|
||||
#define NORMAL_PRIO DEFAULT_PRIO
|
||||
#endif /* CONFIG_SCHED_BFS */
|
||||
#define DEFAULT_PRIO (MAX_RT_PRIO + 20)
|
||||
|
||||
static inline int rt_prio(int prio)
|
||||
{
|
||||
@@ -1743,7 +1791,7 @@ task_sched_runtime(struct task_struct *task);
|
||||
extern unsigned long long thread_group_sched_runtime(struct task_struct *task);
|
||||
|
||||
/* sched_exec is called by processes performing an exec */
|
||||
#if defined(CONFIG_SMP) && !defined(CONFIG_SCHED_BFS)
|
||||
#ifdef CONFIG_SMP
|
||||
extern void sched_exec(void);
|
||||
#else
|
||||
#define sched_exec() {}
|
||||
@@ -1897,9 +1945,6 @@ extern void wake_up_new_task(struct task_struct *tsk,
|
||||
static inline void kick_process(struct task_struct *tsk) { }
|
||||
#endif
|
||||
extern void sched_fork(struct task_struct *p, int clone_flags);
|
||||
#ifdef CONFIG_SCHED_BFS
|
||||
extern void sched_exit(struct task_struct *p);
|
||||
#endif
|
||||
extern void sched_dead(struct task_struct *p);
|
||||
|
||||
extern void proc_caches_init(void);
|
||||
|
||||
Reference in New Issue
Block a user