blob: f057f4d5bef7ae1cd416b413f4a62b782f9f11ae [file] [log] [blame]
From adad24bc843641bc62f0e9e137f7c239cd99c4b6 Mon Sep 17 00:00:00 2001
From: Thomas Gleixner <tglx@linutronix.de>
Date: Fri, 3 Jul 2009 08:44:51 -0500
Subject: [PATCH] powerpc: realtime support
commit 92bfe2d63ed46764b0b0a6e9b63bb9e81023ab80 in tip.
[PG: dropped entry_64.S changes; they arent in v2.6.33.5-rt25]
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
---
arch/powerpc/Kconfig | 15 ++++++++-------
arch/powerpc/kernel/idle.c | 6 ++++--
arch/powerpc/platforms/chrp/time.c | 5 +++++
arch/powerpc/xmon/xmon.c | 2 ++
4 files changed, 19 insertions(+), 9 deletions(-)
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index 2e19500..acef6fd 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -81,13 +81,6 @@ config LOCKDEP_SUPPORT
bool
default y
-config RWSEM_GENERIC_SPINLOCK
- bool
-
-config RWSEM_XCHGADD_ALGORITHM
- bool
- default y
-
config GENERIC_LOCKBREAK
bool
default y
@@ -284,6 +277,14 @@ config HIGHMEM
source kernel/time/Kconfig
source kernel/Kconfig.hz
source kernel/Kconfig.preempt
+
+config RWSEM_GENERIC_SPINLOCK
+ bool
+ default y
+
+config RWSEM_XCHGADD_ALGORITHM
+ bool
+
source "fs/Kconfig.binfmt"
config HUGETLB_PAGE_SIZE_VARIABLE
diff --git a/arch/powerpc/kernel/idle.c b/arch/powerpc/kernel/idle.c
index 049dda6..1925982 100644
--- a/arch/powerpc/kernel/idle.c
+++ b/arch/powerpc/kernel/idle.c
@@ -96,9 +96,11 @@ void cpu_idle(void)
tick_nohz_restart_sched_tick();
if (cpu_should_die())
cpu_die();
- preempt_enable_no_resched();
- schedule();
+ local_irq_disable();
+ __preempt_enable_no_resched();
+ __schedule();
preempt_disable();
+ local_irq_enable();
}
}
diff --git a/arch/powerpc/platforms/chrp/time.c b/arch/powerpc/platforms/chrp/time.c
index 054dfe5..8f1d8cd 100644
--- a/arch/powerpc/platforms/chrp/time.c
+++ b/arch/powerpc/platforms/chrp/time.c
@@ -83,7 +83,12 @@ int chrp_set_rtc_time(struct rtc_time *tmarg)
unsigned char save_control, save_freq_select;
struct rtc_time tm = *tmarg;
+#if CONFIG_PREEMPT_RT
+ if (!spin_trylock(&rtc_lock))
+ return -1;
+#else
spin_lock(&rtc_lock);
+#endif
save_control = chrp_cmos_clock_read(RTC_CONTROL); /* tell the clock it's being set */
diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c
index 8bad7d5..2358421 100644
--- a/arch/powerpc/xmon/xmon.c
+++ b/arch/powerpc/xmon/xmon.c
@@ -358,6 +358,7 @@ static int xmon_core(struct pt_regs *regs, int fromipi)
unsigned long timeout;
#endif
+ preempt_disable();
local_irq_save(flags);
bp = in_breakpoint_table(regs->nip, &offset);
@@ -543,6 +544,7 @@ static int xmon_core(struct pt_regs *regs, int fromipi)
insert_cpu_bpts();
local_irq_restore(flags);
+ preempt_enable();
return cmd != 'X' && cmd != EOF;
}
--
1.7.0.4