Skip to content

Commit

Permalink
powerpc: Reset kernel stack on cpu online from cede state
Browse files Browse the repository at this point in the history
Cpu hotplug (offline) without dlpar operation will place cpu
in cede state and the extended_cede_processor() function will
return when resumed.

Kernel stack pointer needs to be reset before
start_secondary() is called to continue the online operation.

Added new function start_secondary_resume() to do the above
steps.

Signed-off-by: Vaidyanathan Srinivasan <svaidy@linux.vnet.ibm.com>
Cc: Gautham R Shenoy <ego@in.ibm.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
  • Loading branch information
Vaidyanathan Srinivasan authored and Benjamin Herrenschmidt committed Mar 9, 2010
1 parent de0b632 commit 8dbce53
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 5 deletions.
11 changes: 11 additions & 0 deletions arch/powerpc/kernel/head_64.S
Original file line number Diff line number Diff line change
Expand Up @@ -617,6 +617,17 @@ _GLOBAL(start_secondary_prolog)
std r3,0(r1) /* Zero the stack frame pointer */
bl .start_secondary
b .
/*
* Reset stack pointer and call start_secondary
* to continue with online operation when woken up
* from cede in cpu offline.
*/
_GLOBAL(start_secondary_resume)
ld r1,PACAKSAVE(r13) /* Reload kernel stack pointer */
li r3,0
std r3,0(r1) /* Zero the stack frame pointer */
bl .start_secondary
b .
#endif

/*
Expand Down
9 changes: 4 additions & 5 deletions arch/powerpc/platforms/pseries/hotplug-cpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -146,12 +146,11 @@ static void pseries_mach_cpu_die(void)
unregister_slb_shadow(hwcpu, __pa(get_slb_shadow()));

/*
* NOTE: Calling start_secondary() here for now to
* start new context.
* However, need to do it cleanly by resetting the
* stack pointer.
* Call to start_secondary_resume() will not return.
* Kernel stack will be reset and start_secondary()
* will be called to continue the online operation.
*/
start_secondary();
start_secondary_resume();

} else if (get_preferred_offline_state(cpu) == CPU_STATE_OFFLINE) {

Expand Down
1 change: 1 addition & 0 deletions arch/powerpc/platforms/pseries/offline_states.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,5 @@ static inline void set_default_offline_state(int cpu)

extern enum cpu_state_vals get_preferred_offline_state(int cpu);
extern int start_secondary(void);
extern void start_secondary_resume(void);
#endif

0 comments on commit 8dbce53

Please sign in to comment.