Fixed I/O error at boot up. Still not possible to interact with os.
authorAnton Eisenbraun <anton.e@mailbox.tu-berlin.de>
Fri, 5 Jul 2013 16:08:50 +0000 (18:08 +0200)
committerAnton Eisenbraun <anton.e@mailbox.tu-berlin.de>
Fri, 5 Jul 2013 16:08:50 +0000 (18:08 +0200)
arch/x86/kernel/process.c
kernel/sched.new/core.c

index 3a4504b..2e3112f 100644 (file)
@@ -323,7 +323,6 @@ void cpu_idle(void)
                tick_nohz_idle_enter();
 //             printk("\n RUNQUEUE is empty!!!\n");
                while (!need_resched()) {
-                       break;
                        rmb();
 
                        if (cpu_is_offline(smp_processor_id()))
@@ -355,6 +354,7 @@ void cpu_idle(void)
                           has already called exit_idle. But some idle
                           loops can be woken up without interrupt. */
                        __exit_idle();
+                       break;
 
                }
                tick_nohz_idle_exit();
index c17921c..f86eddf 100644 (file)
@@ -104,6 +104,12 @@ __read_mostly int scheduler_running;
 DEFINE_PER_CPU_SHARED_ALIGNED(struct rq, runqueues);
 
 
+//
+// Prototypes
+//
+static void try_to_wake_up_local(struct task_struct *p);
+
+
 //
 // Functions
 //
@@ -247,7 +253,7 @@ void sched_fork(struct task_struct *p)
  */
 void account_idle_ticks(unsigned long ticks)
 {
-       printk("\naccount_idle_ticks");
+       //printk("\naccount_idle_ticks");
 
        return;
 }
@@ -276,7 +282,7 @@ void account_process_tick(struct task_struct *p, int user_tick)
  */
 void get_avenrun(unsigned long *loads, unsigned long offset, int shift)
 {
-       printk("\nget_avenrun");
+       //printk("\nget_avenrun");
 
        return;
 }
@@ -324,7 +330,7 @@ void calc_global_load(unsigned long ticks)
  */
 int can_nice(const struct task_struct *p, const int nice)
 {
-       printk("\ncan_nice");
+       //printk("\ncan_nice");
 
        return 0;
 }
@@ -336,7 +342,7 @@ int can_nice(const struct task_struct *p, const int nice)
  */
 struct task_struct *idle_task(int cpu)
 {
-       printk("\ntask_struct");
+       //printk("\ntask_struct");
 
        return 0;
 }
@@ -348,7 +354,7 @@ struct task_struct *idle_task(int cpu)
  */
 int idle_cpu(int cpu)
 {
-       printk("\nidle_cpu");
+       //printk("\nidle_cpu");
 
        return 0;
 }
@@ -359,7 +365,7 @@ int idle_cpu(int cpu)
  */
 void __cpuinit init_idle_bootup_task(struct task_struct *idle)
 {
-       printk("\ninit_idle_bootup_task");
+       //printk("\ninit_idle_bootup_task");
 
        return;
 }
@@ -371,7 +377,7 @@ void __cpuinit init_idle_bootup_task(struct task_struct *idle)
  */
 void normalize_rt_tasks(void)
 {
-       printk("\nnormalize_rt_tasks");
+       //printk("\nnormalize_rt_tasks");
 
        return;
 }
@@ -386,14 +392,14 @@ void normalize_rt_tasks(void)
  */
 unsigned long nr_running(void)
 {
-       printk("\nnr_running");
+       //printk("\nnr_running");
 
        return 0;
 }
 
 unsigned long long nr_context_switches(void)
 {
-       printk("\nnr_context_switches");
+       //printk("\nnr_context_switches");
 
        return 0;
 }
@@ -404,7 +410,7 @@ unsigned long long nr_context_switches(void)
  */
 unsigned long nr_iowait(void)
 {
-       printk("\nnr_iowait");
+       //printk("\nnr_iowait");
 
        return 0;
 }
@@ -421,7 +427,7 @@ unsigned long nr_iowait(void)
  */
 void rt_mutex_setprio(struct task_struct *p, int prio)
 {
-       printk("\nrt_mutex_setprio");
+       //printk("\nrt_mutex_setprio");
 
        return;
 }
@@ -456,7 +462,7 @@ void rt_mutex_setprio(struct task_struct *p, int prio)
  */
 long sched_getaffinity(pid_t pid, struct cpumask *mask)
 {
-       printk("\nsched_getaffinity");
+       //printk("\nsched_getaffinity");
 
        return 0;
 }
@@ -466,7 +472,7 @@ long sched_getaffinity(pid_t pid, struct cpumask *mask)
  */
 void sched_init_smp(void)
 {
-       printk("\nsched_init_smp");
+       //printk("\nsched_init_smp");
 
        return;
 }
@@ -478,7 +484,7 @@ int sched_rr_handler(struct ctl_table *table, int write,
                void __user *buffer, size_t *lenp,
                loff_t *ppos)
 {
-       printk("\nsched_rr_handler");
+       //printk("\nsched_rr_handler");
 
        return 0;
 }
@@ -491,7 +497,7 @@ int sched_rr_handler(struct ctl_table *table, int write,
  */
 long sched_setaffinity(pid_t pid, const struct cpumask *new_mask)
 {
-       printk("\nsched_setaffinity");
+       //printk("\nsched_setaffinity");
 
        return 0;
 }
@@ -508,7 +514,7 @@ long sched_setaffinity(pid_t pid, const struct cpumask *new_mask)
 int sched_setscheduler(struct task_struct *p, int policy,
                const struct sched_param *param)
 {
-       printk("\nsched_setscheduler");
+       //printk("\nsched_setscheduler");
 
        return 0;
 }
@@ -528,7 +534,7 @@ int sched_setscheduler(struct task_struct *p, int policy,
 int sched_setscheduler_nocheck(struct task_struct *p, int policy,
 const struct sched_param *param)
 {
-//     printk("\nsched_setscheduler_nocheck");
+//     //printk("\nsched_setscheduler_nocheck");
 
        return 0;
 }
@@ -538,7 +544,7 @@ const struct sched_param *param)
  */
 void sched_show_task(struct task_struct *p)
 {
-       printk("\nsched_show_task");
+       //printk("\nsched_show_task");
 
        return;
 }
@@ -688,7 +694,7 @@ void scheduler_tick(void)
  */
 unsigned long long task_delta_exec(struct task_struct *p)
 {
-       printk("\ntask_delta_exec");
+       //printk("\ntask_delta_exec");
 
        return 0;
 }
@@ -704,7 +710,7 @@ unsigned long long task_delta_exec(struct task_struct *p)
  */
 int task_prio(const struct task_struct *p)
 {
-       printk("\ntask_prio");
+       //printk("\ntask_prio");
 
        return 0;
 }
@@ -717,7 +723,7 @@ int task_prio(const struct task_struct *p)
  */
 unsigned long long task_sched_runtime(struct task_struct *task)
 {
-       printk("\ntask_sched_runtime");
+       //printk("\ntask_sched_runtime");
 
        return 0;
 }
@@ -728,7 +734,7 @@ unsigned long long task_sched_runtime(struct task_struct *task)
  */
 unsigned long this_cpu_load(void)
 {
-       printk("\nthis_cpu_load");
+       //printk("\nthis_cpu_load");
 
        return 0;
 }
@@ -739,7 +745,7 @@ unsigned long this_cpu_load(void)
  */
 void update_cpu_load_nohz(void)
 {
-       printk("\nupdate_cpu_load_nohz");
+       //printk("\nupdate_cpu_load_nohz");
 
        return;
 }
@@ -870,7 +876,6 @@ context_switch(struct rq *rq, struct task_struct *prev,
  *          - return from syscall or exception to user-space
  *          - return from interrupt-handler to user-space
  */
-volatile int kernel_blub = 0;
 static void __sched __schedule(void)
 {
        struct task_struct *prev, *next;
@@ -878,16 +883,13 @@ static void __sched __schedule(void)
        struct rq *rq;
        int cpu;
 
-       if (irqs_disabled())
-                       kernel_blub++;
 need_resched:
        preempt_disable();
        cpu = smp_processor_id();
        rq = cpu_rq(cpu);
        rcu_note_context_switch(cpu);
        prev = rq->curr;
-       if (irqs_disabled())
-                               kernel_blub++;
+
 //     schedule_debug(prev);
 
 //     if (sched_feat(HRTICK))
@@ -914,8 +916,8 @@ need_resched:
 
                                to_wakeup = wq_worker_sleeping(prev, cpu);
                                if (to_wakeup)
-                                       printk("\ntry_to_wake_up_local() needs to be implemented");
-//                                     try_to_wake_up_local(to_wakeup);
+                                       //printk("\ntry_to_wake_up_local() needs to be implemented");
+                                       try_to_wake_up_local(to_wakeup);
                        }
                }
 //             switch_count = &prev->nvcsw;
@@ -929,9 +931,8 @@ need_resched:
 //     put_prev_task(rq, prev);
 //     next = pick_next_task(rq);
 
-       /*XXX:  In case the only runnable task gets deactivated, we need to schedule
-        *              the idle tasks to prevent a kernel panic. Anyway at the bootup procedure
-        *              this should be never the case.
+       /*      In case the only runnable task gets deactivated, we need to schedule
+        *      the idle tasks.
         */
        if(!list_empty(&rq->rq_list)) {
                next = list_first_entry(&rq->rq_list, struct task_struct, rq_tasks);
@@ -941,15 +942,6 @@ need_resched:
        else
                next = rq->idle;
 
-       //printk("\nKernel_thread counter: %i", kernel_blub++);
-
-//     if (next == (struct task_struct*)0xffff880007054000)
-//             //printk("\nKernel_init counter: %i", kernel_blub++);
-//             kernel_blub++;
-
-       if (kernel_blub == 1329) {
-               printk("\nWe are most likely to die now");
-       }
 
 //     clear_tsk_need_resched(prev);
 //     rq->skip_clock_update = 0;
@@ -975,8 +967,7 @@ need_resched:
                raw_spin_unlock_irq(&rq->lock);
 
 //     post_schedule(rq);
-       if (irqs_disabled())
-                               kernel_blub++;
+
        sched_preempt_enable_no_resched();
        if (need_resched())
                goto need_resched;
@@ -1037,6 +1028,52 @@ out:
        return success;
 }
 
+
+/**
+ * kernel/sched/core.c:1497
+ * try_to_wake_up_local - try to wake up a local task with rq lock held
+ * @p: the thread to be awakened
+ *
+ * Put @p on the run-queue if it's not already there. The caller must
+ * ensure that this_rq() is locked, @p is bound to this_rq() and not
+ * the current task.
+ */
+static void try_to_wake_up_local(struct task_struct *p)
+{
+       //struct rq *rq = task_rq(p);
+
+       struct rq *rq = cpu_rq(0);
+
+//     if (WARN_ON_ONCE(rq != this_rq()) ||
+//         WARN_ON_ONCE(p == current))
+//             return;
+
+//     lockdep_assert_held(&rq->lock);
+//
+//     if (!raw_spin_trylock(&p->pi_lock)) {
+//             raw_spin_unlock(&rq->lock);
+//             raw_spin_lock(&p->pi_lock);
+//             raw_spin_lock(&rq->lock);
+//     }
+
+       if (!(p->state & TASK_NORMAL))
+                       goto out;
+
+       p->on_rq = 1;
+       p->state = TASK_RUNNING;
+       list_add(&p->rq_tasks, &rq->rq_list);
+
+
+//     if (!p->on_rq)
+//             ttwu_activate(rq, p, ENQUEUE_WAKEUP);
+//
+//     ttwu_do_wakeup(rq, p, 0);
+//     ttwu_stat(p, smp_processor_id(), 0);
+out:
+       raw_spin_unlock(&p->pi_lock);
+}
+
+
 /*
  * kernel/sched/core.c:3125
  * The core wakeup function. Non-exclusive wakeups (nr_exclusive == 0) just
@@ -1100,7 +1137,6 @@ int wake_up_process(struct task_struct *p)
        return try_to_wake_up(p, TASK_NORMAL, 0);
 }
 
-
 static inline long __sched
 do_wait_for_common(struct completion *x,
                   long (*action)(long), long timeout, int state)
@@ -1404,7 +1440,7 @@ void __wake_up_locked_key(wait_queue_head_t *q, unsigned int mode, void *key)
  */
 unsigned long nr_iowait_cpu(int cpu)
 {
-       printk("\nnr_iowait_cpu");
+       //printk("\nnr_iowait_cpu");
 
        return 0;
 }
@@ -1416,8 +1452,8 @@ unsigned long nr_iowait_cpu(int cpu)
  */
 void __sched io_schedule(void)
 {
-       printk("\nio_schedule");
-
+//     printk("\nio_schedule");
+       schedule();
        return;
 }
 
@@ -1426,11 +1462,13 @@ void __sched io_schedule(void)
  */
 long __sched io_schedule_timeout(long timeout)
 {
-       printk("\nio_schedule_timeout");
-
-       return 0;
+       long ret;
+//     printk("\nio_schedule_timeout");
+       ret = schedule_timeout(timeout);
+       return ret;
 }
 
+
 /*
  * kernel/sched/core.c:7590
  */
@@ -1438,7 +1476,7 @@ int sched_rt_handler(struct ctl_table *table, int write,
                void __user *buffer, size_t *lenp,
                loff_t *ppos)
 {
-       printk("\nsched_rt_handler");
+       //printk("\nsched_rt_handler");
 
        return 0;
 }
@@ -1449,7 +1487,7 @@ int sched_rt_handler(struct ctl_table *table, int write,
  */
 void __wake_up_sync(wait_queue_head_t *q, unsigned int mode, int nr_exclusive)
 {
-       printk("\n__wake_up_sync");
+       //printk("\n__wake_up_sync");
 
        return;
 }
@@ -1460,7 +1498,7 @@ void __wake_up_sync(wait_queue_head_t *q, unsigned int mode, int nr_exclusive)
  */
 void __wake_up_locked(wait_queue_head_t *q, unsigned int mode, int nr)
 {
-       printk("\n__wake_up_locked");
+       //printk("\n__wake_up_locked");
 
        return;
 }
@@ -1494,7 +1532,7 @@ EXPORT_SYMBOL(wait_for_completion_io);
  */
 void show_state_filter(unsigned long state_filter)
 {
-       printk("\nshow_state_filter");
+       //printk("\nshow_state_filter");
 
        return;
 }
@@ -1536,9 +1574,8 @@ EXPORT_SYMBOL(complete_all);
 unsigned long __sched
 wait_for_completion_timeout(struct completion *x, unsigned long timeout)
 {
-       printk("\nwait_for_completion_timeout");
+       return wait_for_common(x, timeout, TASK_UNINTERRUPTIBLE);
 
-       return 0;
 }