---
 kernel/trace/latency_hist.c |   15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

Index: linux-3.18.36-rt37/kernel/trace/latency_hist.c
===================================================================
@ linux-3.18.36-rt37/kernel/trace/latency_hist.c:129 @ static notrace void probe_wakeup_latency
 	struct task_struct *p);
 static notrace void probe_wakeup_latency_hist_stop(void *v,
 	struct task_struct *prev, struct task_struct *next);
+#ifdef CONFIG_SMP
 static notrace void probe_sched_migrate_task(void *,
 	struct task_struct *task, int cpu);
+#endif
 static struct enable_data wakeup_latency_enabled_data = {
 	.latency_type = WAKEUP_LATENCY,
 	.enabled = 0,
@ linux-3.18.36-rt37/kernel/trace/latency_hist.c:697 @ do_enable(struct file *file, const char 
 				    probe_wakeup_latency_hist_start, NULL);
 				return ret;
 			}
+#ifdef CONFIG_SMP
 			ret = register_trace_sched_migrate_task(
 			    probe_sched_migrate_task, NULL);
 			if (ret) {
@ linux-3.18.36-rt37/kernel/trace/latency_hist.c:710 @ do_enable(struct file *file, const char 
 				    probe_wakeup_latency_hist_stop, NULL);
 				return ret;
 			}
+#endif
 			break;
 #endif
 #ifdef CONFIG_MISSED_TIMER_OFFSETS_HIST
@ linux-3.18.36-rt37/kernel/trace/latency_hist.c:793 @ do_enable(struct file *file, const char 
 				    probe_wakeup_latency_hist_start, NULL);
 				unregister_trace_sched_switch(
 				    probe_wakeup_latency_hist_stop, NULL);
+#ifdef CONFIG_SMP
 				unregister_trace_sched_migrate_task(
 				    probe_sched_migrate_task, NULL);
+#endif
 
 				for_each_online_cpu(cpu) {
 					per_cpu(wakeup_task, cpu) = NULL;
@ linux-3.18.36-rt37/kernel/trace/latency_hist.c:984 @ static DEFINE_RAW_SPINLOCK(wakeup_lock);
 #ifdef CONFIG_SWITCHTIME_HIST
 static DEFINE_RAW_SPINLOCK(switchtime_lock);
 #endif
+#ifdef CONFIG_SMP
 static notrace void probe_sched_migrate_task(void *v, struct task_struct *task,
 	int cpu)
 {
@ linux-3.18.36-rt37/kernel/trace/latency_hist.c:1022 @ static notrace void probe_sched_migrate_
 #endif
 	}
 }
+#endif /* CONFIG_SMP */
 
 static notrace void probe_wakeup_latency_hist_start(void *v,
 	struct task_struct *p)
@ linux-3.18.36-rt37/kernel/trace/latency_hist.c:1151 @ out:
 
 		raw_spin_lock_irqsave(&switchtime_lock, flags);
 
-		cpu_switchtime_task = per_cpu(switchtime_task, cpu) =
-		    next;
+		cpu_switchtime_task = per_cpu(switchtime_task, cpu);
+		if (cpu_switchtime_task != NULL)
+			put_task_struct(cpu_switchtime_task);
+		cpu_switchtime_task = next;
+		per_cpu(switchtime_task, cpu) = cpu_switchtime_task;
 		get_task_struct(cpu_switchtime_task);
 
 		raw_spin_unlock_irqrestore(&switchtime_lock, flags);