Modifications for Linux v4.2.
authorAnselm Busse <anselm.busse@tu-berlin.de>
Mon, 18 Jan 2016 20:49:40 +0000 (21:49 +0100)
committerAnselm Busse <anselm.busse@tu-berlin.de>
Wed, 20 Jan 2016 10:21:13 +0000 (11:21 +0100)
framework/include/os/linux.h
framework/os/linux/linux_sched.c

index 0bf0413..2eb4129 100644 (file)
@@ -355,9 +355,9 @@ int can_nice(const struct task_struct *p, const int nice);
 
 int idle_cpu(int cpu);
 
-void __cpuinit init_idle(struct task_struct *idle, int cpu);
+void init_idle(struct task_struct *idle, int cpu);
 
-void __cpuinit init_idle_bootup_task(struct task_struct *idle);
+void init_idle_bootup_task(struct task_struct *idle);
 
 void normalize_rt_tasks(void);
 
index 2223b76..fa02c85 100644 (file)
@@ -331,7 +331,7 @@ int sched_fork(unsigned long clone_flags, struct task_struct *p)
  * NOTE: this function does not set the idle thread's NEED_RESCHED
  * flag, to make booting more robust.
  */
-void /*__cpuinit*/ init_idle(struct task_struct *idle, int cpu)
+void init_idle(struct task_struct *idle, int cpu)
 {
        struct rq *rq = cpu_rq(cpu);
        unsigned long flags;
@@ -470,7 +470,7 @@ int idle_cpu(int cpu)
  * /kernel/sched/core.c:4669
  * Sets sched_class of idle task, see struct sched_class idle_sched_class;
  */
-void __cpuinit init_idle_bootup_task(struct task_struct *idle)
+void init_idle_bootup_task(struct task_struct *idle)
 {
        return;
 }
@@ -730,6 +730,53 @@ void sched_show_task(struct task_struct *p)
        return;
 }
 
+void wake_q_add(struct wake_q_head *head, struct task_struct *task)
+{
+       struct wake_q_node *node = &task->wake_q;
+       
+       /*
+        * Atomically grab the task, if ->wake_q is !nil already it means
+        * its already queued (either by us or someone else) and will get the
+        * wakeup due to that.
+        *
+        * This cmpxchg() implies a full barrier, which pairs with the write
+        * barrier implied by the wakeup in wake_up_list().
+        */
+       if (cmpxchg(&node->next, NULL, WAKE_Q_TAIL))
+               return;
+       
+       get_task_struct(task);
+       
+       /*
+        * The head is context local, there can be no concurrency.
+        */
+       *head->lastp = node;
+       head->lastp = &node->next;
+}
+
+void wake_up_q(struct wake_q_head *head)
+{
+       struct wake_q_node *node = head->first;
+
+       while (node != WAKE_Q_TAIL) {
+               struct task_struct *task;
+
+               task = container_of(node, struct task_struct, wake_q);
+               BUG_ON(!task);
+               /* task can safely be re-inserted now */
+               node = node->next;
+               task->wake_q.next = NULL;
+
+               /*
+                * wake_up_process() implies a wmb() to pair with the queueing
+                * in wake_q_add() so as not to miss wakeups.
+                */
+               wake_up_process(task);
+               put_task_struct(task);
+       }
+}
+
+
 /**
  * kernel/sched/core.c:652
  */
@@ -1059,11 +1106,12 @@ unsigned long this_cpu_load(void)
  * kernel/sched/core.c:2556
  * update_cpu_load_nohz - called from tick_nohz_idle_exit() -- try and fix up the ticks we missed.
  */
+#if defined(CONFIG_SMP) && defined(CONFIG_NO_HZ_COMMON)
 void update_cpu_load_nohz(void)
 {
        return;
 }
-
+#endif
 
 /*
  * kernel/sched/core.c:1207
@@ -1365,7 +1413,6 @@ context_switch(struct rq *rq, struct task_struct *prev,
        spin_release(&rq->lock.dep_map, 1, _THIS_IP_);
 #endif
 
-       context_tracking_task_switch(prev, next);
        /* Here we just switch the register state and the stack. */
        switch_to(prev, next, prev);
 
@@ -1881,7 +1928,7 @@ static void set_rq_online(struct rq *rq)
  * migration_call - callback that gets triggered when a CPU is added.
  * Here we can start up the necessary migration thread for the new CPU.
  */
-static int __cpuinit
+static int
 migration_call(struct notifier_block *nfb, unsigned long action, void *hcpu)
 {
        int cpu = (long)hcpu;
@@ -1931,12 +1978,12 @@ void idle_task_exit(void)
  * happens before everything else.  This has to be lower priority than
  * the notifier in the perf_event subsystem, though.
  */
-static struct notifier_block __cpuinitdata migration_notifier = {
+static struct notifier_block migration_notifier = {
        .notifier_call = migration_call,
        .priority = CPU_PRI_MIGRATION,
 };
 
-static int __cpuinit sched_cpu_active(struct notifier_block *nfb,
+static int sched_cpu_active(struct notifier_block *nfb,
                                      unsigned long action, void *hcpu)
 {
        switch (action & ~CPU_TASKS_FROZEN) {
@@ -1949,7 +1996,7 @@ static int __cpuinit sched_cpu_active(struct notifier_block *nfb,
        }
 }
 
-static int __cpuinit sched_cpu_inactive(struct notifier_block *nfb,
+static int sched_cpu_inactive(struct notifier_block *nfb,
                                        unsigned long action, void *hcpu)
 {
        switch (action & ~CPU_TASKS_FROZEN) {