Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=a2b51812a4dc5db09ab4d4638d4d8ed456e2457e
Commit:     a2b51812a4dc5db09ab4d4638d4d8ed456e2457e
Parent:     fbe481756df57673b6acbcd2e139d0d2658f2188
Author:     Linas Vepstas <[EMAIL PROTECTED]>
AuthorDate: Tue Nov 20 12:28:15 2007 +1100
Committer:  Paul Mackerras <[EMAIL PROTECTED]>
CommitDate: Tue Nov 20 16:10:09 2007 +1100

    [POWERPC] Fix RTAS os-term usage on kernel panic
    
    The rtas_os_term() routine was being called at the wrong time.
    The actual rtas call "os-term" will not ever return, and so
    calling it from the panic notifier is too early.  Instead,
    call it from the machine_reset() call.
    
    This splits the rtas_os_term() routine into two: one part to capture
    the kernel panic message, invoked during the panic notifier, and
    another part that is invoked during machine_reset().
    
    Prior to this patch, the os-term call was never being made,
    because panic_timeout was always non-zero.  Calling os-term
    helps keep the hypervisor happy!  We have to keep the hypervisor
    happy to avoid service, dump and error reporting problems.
    
    Signed-off-by: Linas Vepstas <[EMAIL PROTECTED]>
    Signed-off-by: Paul Mackerras <[EMAIL PROTECTED]>
---
 arch/powerpc/kernel/rtas.c             |   12 ++++++------
 arch/powerpc/platforms/pseries/setup.c |    3 ++-
 include/asm-powerpc/rtas.h             |    3 ++-
 3 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c
index 52e95c2..053cac1 100644
--- a/arch/powerpc/kernel/rtas.c
+++ b/arch/powerpc/kernel/rtas.c
@@ -638,18 +638,18 @@ void rtas_halt(void)
 /* Must be in the RMO region, so we place it here */
 static char rtas_os_term_buf[2048];
 
-void rtas_os_term(char *str)
+void rtas_panic_msg(char *str)
 {
-       int status;
+       snprintf(rtas_os_term_buf, 2048, "OS panic: %s", str);
+}
 
-       if (panic_timeout)
-               return;
+void rtas_os_term(void)
+{
+       int status;
 
        if (RTAS_UNKNOWN_SERVICE == rtas_token("ibm,os-term"))
                return;
 
-       snprintf(rtas_os_term_buf, 2048, "OS panic: %s", str);
-
        do {
                status = rtas_call(rtas_token("ibm,os-term"), 1, 1, NULL,
                                   __pa(rtas_os_term_buf));
diff --git a/arch/powerpc/platforms/pseries/setup.c 
b/arch/powerpc/platforms/pseries/setup.c
index fdb9b1c..fdeefe5 100644
--- a/arch/powerpc/platforms/pseries/setup.c
+++ b/arch/powerpc/platforms/pseries/setup.c
@@ -507,7 +507,8 @@ define_machine(pseries) {
        .restart                = rtas_restart,
        .power_off              = pSeries_power_off,
        .halt                   = rtas_halt,
-       .panic                  = rtas_os_term,
+       .panic                  = rtas_panic_msg,
+       .machine_shutdown       = rtas_os_term,
        .get_boot_time          = rtas_get_boot_time,
        .get_rtc_time           = rtas_get_rtc_time,
        .set_rtc_time           = rtas_set_rtc_time,
diff --git a/include/asm-powerpc/rtas.h b/include/asm-powerpc/rtas.h
index 8eaa7b2..87db872 100644
--- a/include/asm-powerpc/rtas.h
+++ b/include/asm-powerpc/rtas.h
@@ -164,7 +164,8 @@ extern int rtas_call(int token, int, int, int *, ...);
 extern void rtas_restart(char *cmd);
 extern void rtas_power_off(void);
 extern void rtas_halt(void);
-extern void rtas_os_term(char *str);
+extern void rtas_panic_msg(char *str);
+extern void rtas_os_term(void);
 extern int rtas_get_sensor(int sensor, int index, int *state);
 extern int rtas_get_power_level(int powerdomain, int *level);
 extern int rtas_set_power_level(int powerdomain, int level, int *setlevel);
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to