diff -Naur linux-2.6.33.2/include/linux/sched.h linux-2.6.33.2-sched_simple/include/linux/sched.h
--- linux-2.6.33.2/include/linux/sched.h	2010-04-02 01:02:33.000000000 +0200
+++ linux-2.6.33.2-sched_simple/include/linux/sched.h	2010-05-16 22:54:10.029406766 +0200
@@ -38,6 +38,9 @@
 #define SCHED_BATCH		3
 /* SCHED_ISO: reserved but not implemented yet */
 #define SCHED_IDLE		5
+#ifdef CONFIG_SCHED_SIMPLE
+#define SCHED_SIMPLE		6
+#endif // CONFIG_SCHED_SIMPLE
 /* Can be ORed in to make sure the process is reverted back to SCHED_NORMAL on fork */
 #define SCHED_RESET_ON_FORK     0x40000000
 
@@ -94,6 +97,10 @@
 
 #include <asm/processor.h>
 
+#ifdef CONFIG_SCHED_SIMPLE
+#include <linux/sched_simple.h>
+#endif // CONFIG_SCHED_SIMPLE
+
 struct exec_domain;
 struct futex_pi_state;
 struct robust_list_head;
@@ -1253,6 +1260,10 @@
 	struct sched_entity se;
 	struct sched_rt_entity rt;
 
+#ifdef CONFIG_SCHED_SIMPLE
+	struct simple_task simple;
+#endif // CONFIG_SCHED_SIMPLE
+
 #ifdef CONFIG_PREEMPT_NOTIFIERS
 	/* list of struct preempt_notifier: */
 	struct hlist_head preempt_notifiers;
diff -Naur linux-2.6.33.2/include/linux/sched_simple.h linux-2.6.33.2-sched_simple/include/linux/sched_simple.h
--- linux-2.6.33.2/include/linux/sched_simple.h	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.33.2-sched_simple/include/linux/sched_simple.h	2010-05-16 23:53:43.520410605 +0200
@@ -0,0 +1,18 @@
+
+#ifndef _LINUX_SCHED_SIMPLE_H__
+#define _LINUX_SCHED_SIMPLE_H__
+
+#include <linux/list.h>
+
+#define SIMPLE_TIME_SLICE_LENGTH 100
+
+struct simple_task {
+	struct list_head queue;
+};
+
+struct simple_rq {
+	struct list_head queue;
+	int time_left;
+};
+
+#endif // _LINUX_SCHED_SIMPLE_H__
diff -Naur linux-2.6.33.2/init/Kconfig linux-2.6.33.2-sched_simple/init/Kconfig
--- linux-2.6.33.2/init/Kconfig	2010-04-02 01:02:33.000000000 +0200
+++ linux-2.6.33.2-sched_simple/init/Kconfig	2010-05-16 22:42:43.336409578 +0200
@@ -496,6 +496,12 @@
 
 endchoice
 
+config SCHED_SIMPLE
+       bool "Simple Scheduling Policy"
+       default n
+       help
+         This option enables the "Simple Scheduling Policy".
+
 menuconfig CGROUPS
 	boolean "Control Group support"
 	help
diff -Naur linux-2.6.33.2/kernel/printk.c linux-2.6.33.2-sched_simple/kernel/printk.c
--- linux-2.6.33.2/kernel/printk.c	2010-04-02 01:02:33.000000000 +0200
+++ linux-2.6.33.2-sched_simple/kernel/printk.c	2010-05-17 00:59:27.239425538 +0200
@@ -1069,7 +1069,17 @@
 	console_locked = 0;
 	up(&console_sem);
 	spin_unlock_irqrestore(&logbuf_lock, flags);
+#ifdef CONFIG_SCHED_SIMPLE
+	/*
+	 * If we try to wake up klogd while printing with the runqueue lock
+	 * held, this will deadlock. We don't have access to the runqueue
+	 * lock from here, but just checking for interrupts disabled
+	 * should be enough.
+	 */
+	if (!irqs_disabled() && wake_klogd)
+#else
 	if (wake_klogd)
+#endif
 		wake_up_klogd();
 }
 EXPORT_SYMBOL(release_console_sem);
diff -Naur linux-2.6.33.2/kernel/sched.c linux-2.6.33.2-sched_simple/kernel/sched.c
--- linux-2.6.33.2/kernel/sched.c	2010-04-02 01:02:33.000000000 +0200
+++ linux-2.6.33.2-sched_simple/kernel/sched.c	2010-05-16 23:50:07.530407189 +0200
@@ -80,6 +80,10 @@
 #define CREATE_TRACE_POINTS
 #include <trace/events/sched.h>
 
+#ifdef CONFIG_SCHED_SIMPLE
+#include <linux/sched_simple.h>
+#endif // CONFIG_SCHED_SIMPLE
+
 /*
  * Convert user-nice values [ -20 ... 0 ... 19 ]
  * to static priority [ MAX_RT_PRIO..MAX_PRIO-1 ],
@@ -544,6 +548,9 @@
 
 	struct cfs_rq cfs;
 	struct rt_rq rt;
+#ifdef CONFIG_SCHED_SIMPLE
+	struct simple_rq simple;
+#endif // CONFIG_SCHED_SIMPLE
 
 #ifdef CONFIG_FAIR_GROUP_SCHED
 	/* list of leaf cfs_rq on this cpu: */
@@ -1836,6 +1843,9 @@
 
 #include "sched_stats.h"
 #include "sched_idletask.c"
+#ifdef CONFIG_SCHED_SIMPLE
+#include "sched_simple.c"
+#endif // CONFIG_SCHED_SIMPLE
 #include "sched_fair.c"
 #include "sched_rt.c"
 #ifdef CONFIG_SCHED_DEBUG
@@ -2568,6 +2578,10 @@
 #ifdef CONFIG_PREEMPT_NOTIFIERS
 	INIT_HLIST_HEAD(&p->preempt_notifiers);
 #endif
+
+#ifdef CONFIG_SCHED_SIMPLE
+	simple_sched_fork(p);
+#endif // CONFIG_SCHED_SIMPLE
 }
 
 /*
@@ -6275,7 +6289,13 @@
 	p->normal_prio = normal_prio(p);
 	/* we are holding p->pi_lock already */
 	p->prio = rt_mutex_getprio(p);
+#ifdef CONFIG_SCHED_SIMPLE
+	if (policy == SCHED_SIMPLE)
+		p->sched_class = &simple_sched_class;
+	else if (rt_prio(p->prio))
+#else
 	if (rt_prio(p->prio))
+#endif // CONFIG_SCHED_SIMPLE
 		p->sched_class = &rt_sched_class;
 	else
 		p->sched_class = &fair_sched_class;
@@ -6320,6 +6340,9 @@
 
 		if (policy != SCHED_FIFO && policy != SCHED_RR &&
 				policy != SCHED_NORMAL && policy != SCHED_BATCH &&
+#ifdef CONFIG_SCHED_SIMPLE
+		    policy != SCHED_SIMPLE &&
+#endif // CONFIG_SCHED_SIMPLE
 				policy != SCHED_IDLE)
 			return -EINVAL;
 	}
@@ -9594,6 +9617,9 @@
 		rq->calc_load_update = jiffies + LOAD_FREQ;
 		init_cfs_rq(&rq->cfs, rq);
 		init_rt_rq(&rq->rt, rq);
+#ifdef CONFIG_SCHED_SIMPLE
+		simple_init_rq(&rq->simple, rq);
+#endif // CONFIG_SCHED_SIMPLE
 #ifdef CONFIG_FAIR_GROUP_SCHED
 		init_task_group.shares = init_task_group_load;
 		INIT_LIST_HEAD(&rq->leaf_cfs_rq_list);
diff -Naur linux-2.6.33.2/kernel/sched_fair.c linux-2.6.33.2-sched_simple/kernel/sched_fair.c
--- linux-2.6.33.2/kernel/sched_fair.c	2010-04-02 01:02:33.000000000 +0200
+++ linux-2.6.33.2-sched_simple/kernel/sched_fair.c	2010-05-16 23:26:01.188409069 +0200
@@ -2095,7 +2095,11 @@
  * All the scheduling class methods:
  */
 static const struct sched_class fair_sched_class = {
+#ifdef CONFIG_SCHED_SIMPLE
+	.next			= &simple_sched_class,
+#else
 	.next			= &idle_sched_class,
+#endif
 	.enqueue_task		= enqueue_task_fair,
 	.dequeue_task		= dequeue_task_fair,
 	.yield_task		= yield_task_fair,
diff -Naur linux-2.6.33.2/kernel/sched_simple.c linux-2.6.33.2-sched_simple/kernel/sched_simple.c
--- linux-2.6.33.2/kernel/sched_simple.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.33.2-sched_simple/kernel/sched_simple.c	2010-05-17 01:02:10.703659605 +0200
@@ -0,0 +1,122 @@
+
+static inline struct task_struct *simple_task_of(struct simple_task *st) {
+	return container_of(st, struct task_struct, simple);
+}
+
+static void simple_init_rq(struct simple_rq *simple_rq, struct rq *rq) {
+	memset(simple_rq, 0, sizeof(struct simple_rq));
+	INIT_LIST_HEAD(&simple_rq->queue);
+	simple_rq->time_left = SIMPLE_TIME_SLICE_LENGTH;
+}
+
+static void simple_sched_fork(struct task_struct *p) {
+	INIT_LIST_HEAD(&p->simple.queue);
+}
+
+static void simple_enqueue_task(struct rq *rq, struct task_struct *p, int wakeup)
+{
+	list_add_tail(&p->simple.queue, &rq->simple.queue);
+}
+
+static void simple_dequeue_task(struct rq *rq, struct task_struct *p, int sleep)
+{
+	list_del(&p->simple.queue);
+}
+
+static void simple_yield_task(struct rq *rq)
+{
+	simple_dequeue_task(rq, rq->curr, 0);
+	simple_enqueue_task(rq, rq->curr, 0);
+}
+
+static void simple_check_preempt_curr(struct rq *rq, struct task_struct *p, int flags)
+{
+	if (p->policy < SCHED_SIMPLE)
+		 resched_task(rq->curr);
+}
+
+static struct task_struct *simple_pick_next_task(struct rq *rq) {
+	struct simple_task *st;
+	struct task_struct *p;
+	if (list_empty(&rq->simple.queue))
+		return NULL;
+	st = list_first_entry(&rq->simple.queue, struct simple_task, queue);
+	p = simple_task_of(st);
+	if (p != rq->curr) {
+		printk("Picking task %d\n", p->pid);
+	}
+	return p;
+}
+
+static void simple_put_prev_task(struct rq *rq, struct task_struct *p) {
+}
+
+static int simple_select_task_rq(struct task_struct *p, int sd_flag, int flags)
+{
+	return task_cpu(p);
+}
+
+static unsigned long
+simple_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)
+{
+	return 0;
+}
+
+static int
+simple_move_one_task(struct rq *this_rq, int this_cpu, struct rq *busiest,
+		 struct sched_domain *sd, enum cpu_idle_type idle)
+{
+	return 0;
+}
+
+static void simple_set_curr_task(struct rq *rq)
+{
+}
+
+static void simple_task_tick(struct rq *rq, struct task_struct *p, int queued)
+{
+	if (rq->simple.time_left-- < 0) {
+		simple_dequeue_task(rq, rq->curr, 0);
+		simple_enqueue_task(rq, rq->curr, 0);
+		resched_task(rq->curr);
+		rq->simple.time_left = SIMPLE_TIME_SLICE_LENGTH;
+	}
+}
+
+unsigned int simple_get_rr_interval(struct rq *rq, struct task_struct *task)
+{
+	return SIMPLE_TIME_SLICE_LENGTH;
+}
+
+static void simple_prio_changed(struct rq *rq, struct task_struct *p,
+				int oldprio, int running)
+{
+}
+
+static void simple_switched_to(struct rq *rq, struct task_struct *p,
+			       int running)
+{
+}
+
+static const struct sched_class simple_sched_class = {
+	.next			= &idle_sched_class,
+	.enqueue_task		= simple_enqueue_task,
+	.dequeue_task		= simple_dequeue_task,
+	.yield_task		= simple_yield_task,
+	.check_preempt_curr	= simple_check_preempt_curr,
+	.pick_next_task		= simple_pick_next_task,
+	.put_prev_task		= simple_put_prev_task,
+#ifdef CONFIG_SMP
+	.select_task_rq		= simple_select_task_rq,
+	.load_balance		= simple_load_balance,
+	.move_one_task		= simple_move_one_task,
+#endif
+	.set_curr_task          = simple_set_curr_task,
+	.task_tick		= simple_task_tick,
+	.get_rr_interval	= simple_get_rr_interval,
+	.prio_changed		= simple_prio_changed,
+	.switched_to		= simple_switched_to,
+};
