| From 10ccaf178b2b961d8bca252d647ed7ed8aae2a20 Mon Sep 17 00:00:00 2001 |
| From: Dan Streetman <ddstreet@ieee.org> |
| Date: Fri, 31 Oct 2014 15:41:34 -0400 |
| Subject: powerpc: use device_online/offline() instead of cpu_up/down() |
| |
| From: Dan Streetman <ddstreet@ieee.org> |
| |
| commit 10ccaf178b2b961d8bca252d647ed7ed8aae2a20 upstream. |
| |
| In powerpc pseries platform dlpar operations, use device_online() and |
| device_offline() instead of cpu_up() and cpu_down(). |
| |
| Calling cpu_up/down() directly does not update the cpu device offline |
| field, which is used to online/offline a cpu from sysfs. Calling |
| device_online/offline() instead keeps the sysfs cpu online value |
| correct. The hotplug lock, which is required to be held when calling |
| device_online/offline(), is already held when dlpar_online/offline_cpu() |
| are called, since they are called only from cpu_probe|release_store(). |
| |
| This patch fixes errors on phyp (PowerVM) systems that have cpu(s) |
| added/removed using dlpar operations; without this patch, the |
| /sys/devices/system/cpu/cpuN/online nodes do not correctly show the |
| online state of added/removed cpus. |
| |
| Signed-off-by: Dan Streetman <ddstreet@ieee.org> |
| Cc: Nathan Fontenot <nfont@linux.vnet.ibm.com> |
| Fixes: 0902a9044fa5 ("Driver core: Use generic offline/online for CPU offline/online") |
| Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/powerpc/platforms/pseries/dlpar.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/arch/powerpc/platforms/pseries/dlpar.c |
| +++ b/arch/powerpc/platforms/pseries/dlpar.c |
| @@ -379,7 +379,7 @@ static int dlpar_online_cpu(struct devic |
| BUG_ON(get_cpu_current_state(cpu) |
| != CPU_STATE_OFFLINE); |
| cpu_maps_update_done(); |
| - rc = cpu_up(cpu); |
| + rc = device_online(get_cpu_device(cpu)); |
| if (rc) |
| goto out; |
| cpu_maps_update_begin(); |
| @@ -462,7 +462,7 @@ static int dlpar_offline_cpu(struct devi |
| if (get_cpu_current_state(cpu) == CPU_STATE_ONLINE) { |
| set_preferred_offline_state(cpu, CPU_STATE_OFFLINE); |
| cpu_maps_update_done(); |
| - rc = cpu_down(cpu); |
| + rc = device_offline(get_cpu_device(cpu)); |
| if (rc) |
| goto out; |
| cpu_maps_update_begin(); |