blob: 9702886d1e9b66a4f02471ac8cbba4d6ffcb9f10 [file] [log] [blame]
From 29b6b6cbc841566dc7e2f997ae3c15ffbb0facca 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>
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index ba3948c..209b1b0 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
@@ -256,6 +249,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 4e6152c..dcf8888 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.1.1