Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=c3e8506c54f7263e71289e9e66533236d09f2fb7
Commit:     c3e8506c54f7263e71289e9e66533236d09f2fb7
Parent:     a52572ddcd3d16cc5ccc9679bcbb7256d0ddad84
Author:     Nathan Fontenot <[EMAIL PROTECTED]>
AuthorDate: Thu Feb 7 07:37:31 2008 +1100
Committer:  Paul Mackerras <[EMAIL PROTECTED]>
CommitDate: Thu Feb 7 11:40:19 2008 +1100

    [POWERPC] Split xics_teardown_cpu()
    
    This splits off the kexec path bits of the xics_teardown_cpu() routine
    into its own xics_kexec_teardown_cpu() routine.  With the previous
    combined routine the CPPR for a cpu that is being removed may have its
    CPPR reset in the plpar_eoi() call (which explicitly sets the CPPR to
    a non-zero value).  Splitting of the kexec bits of the code prevents
    this from happening in the cpu remove path.
    
    Once again, this does not cause the cpu remove from the kernel to
    fail, but it does cause cpu dlpar operations to not be able to return
    the cpu to the hypervisor.
    
    Signed-off-by: Nathan Fontenot <[EMAIL PROTECTED]>
    Signed-off-by: Paul Mackerras <[EMAIL PROTECTED]>
---
 arch/powerpc/platforms/pseries/hotplug-cpu.c |    2 +-
 arch/powerpc/platforms/pseries/kexec.c       |    2 +-
 arch/powerpc/platforms/pseries/xics.c        |   14 ++++++++++----
 arch/powerpc/platforms/pseries/xics.h        |    3 ++-
 4 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/arch/powerpc/platforms/pseries/hotplug-cpu.c 
b/arch/powerpc/platforms/pseries/hotplug-cpu.c
index c4ad54e..1f03248 100644
--- a/arch/powerpc/platforms/pseries/hotplug-cpu.c
+++ b/arch/powerpc/platforms/pseries/hotplug-cpu.c
@@ -58,7 +58,7 @@ static void pseries_mach_cpu_die(void)
 {
        local_irq_disable();
        idle_task_exit();
-       xics_teardown_cpu(0);
+       xics_teardown_cpu();
        unregister_slb_shadow(hard_smp_processor_id(), __pa(get_slb_shadow()));
        rtas_stop_self();
        /* Should never get here... */
diff --git a/arch/powerpc/platforms/pseries/kexec.c 
b/arch/powerpc/platforms/pseries/kexec.c
index 412a5e7..e9dd5fe 100644
--- a/arch/powerpc/platforms/pseries/kexec.c
+++ b/arch/powerpc/platforms/pseries/kexec.c
@@ -54,7 +54,7 @@ void __init setup_kexec_cpu_down_mpic(void)
 static void pseries_kexec_cpu_down_xics(int crash_shutdown, int secondary)
 {
        pseries_kexec_cpu_down(crash_shutdown, secondary);
-       xics_teardown_cpu(secondary);
+       xics_kexec_teardown_cpu(secondary);
 }
 
 void __init setup_kexec_cpu_down_xics(void)
diff --git a/arch/powerpc/platforms/pseries/xics.c 
b/arch/powerpc/platforms/pseries/xics.c
index 00e9d29..485cb39 100644
--- a/arch/powerpc/platforms/pseries/xics.c
+++ b/arch/powerpc/platforms/pseries/xics.c
@@ -775,11 +775,9 @@ void xics_request_IPIs(void)
 }
 #endif /* CONFIG_SMP */
 
-void xics_teardown_cpu(int secondary)
+void xics_teardown_cpu()
 {
        int cpu = smp_processor_id();
-       unsigned int ipi;
-       struct irq_desc *desc;
 
        xics_set_cpu_priority(0);
 
@@ -790,9 +788,17 @@ void xics_teardown_cpu(int secondary)
                lpar_qirr_info(cpu, 0xff);
        else
                direct_qirr_info(cpu, 0xff);
+}
+
+void xics_kexec_teardown_cpu(int secondary)
+{
+       unsigned int ipi;
+       struct irq_desc *desc;
+
+       xics_teardown_cpu();
 
        /*
-        * we need to EOI the IPI if we got here from kexec down IPI
+        * we need to EOI the IPI
         *
         * probably need to check all the other interrupts too
         * should we be flagging idle loop instead?
diff --git a/arch/powerpc/platforms/pseries/xics.h 
b/arch/powerpc/platforms/pseries/xics.h
index 9ffd809..c26bcff 100644
--- a/arch/powerpc/platforms/pseries/xics.h
+++ b/arch/powerpc/platforms/pseries/xics.h
@@ -16,7 +16,8 @@
 
 extern void xics_init_IRQ(void);
 extern void xics_setup_cpu(void);
-extern void xics_teardown_cpu(int secondary);
+extern void xics_teardown_cpu(void);
+extern void xics_kexec_teardown_cpu(int secondary);
 extern void xics_cause_IPI(int cpu);
 extern  void xics_request_IPIs(void);
 extern void xics_migrate_irqs_away(void);
-
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