+++ /dev/null
-From: Gerald Schaefer <geraldsc@de.ibm.com>
-Subject: iucv: failing cpu hot remove for inactive iucv
-References: bnc#466462,LTC#51104
-
-Symptom: cpu hot remove rejected with NOTIFY_BAD
-Problem: If the iucv module is compiled in / loaded but no user
- is registered, cpu hot remove doesn't work. The iucv
- cpu hotplug notifier on CPU_DOWN_PREPARE checks, if
- the iucv_buffer_cpumask would be empty after the
- corresponding bit would be cleared. However the bit
- was never set since iucv wasn't enabled. That causes
- all cpu hot unplug operations to fail in this scenario.
-Solution: Use iucv_path_table as an indicator whether iucv is
- enabled or not.
-
-Acked-by: John Jolly <jjolly@suse.de>
----
-
- net/iucv/iucv.c | 18 +++++++++++-------
- 1 file changed, 11 insertions(+), 7 deletions(-)
-
-Index: linux-sles11/net/iucv/iucv.c
-===================================================================
---- linux-sles11.orig/net/iucv/iucv.c
-+++ linux-sles11/net/iucv/iucv.c
-@@ -516,6 +516,7 @@ static int iucv_enable(void)
- size_t alloc_size;
- int cpu, rc;
-
-+ get_online_cpus();
- rc = -ENOMEM;
- alloc_size = iucv_max_pathid * sizeof(struct iucv_path);
- iucv_path_table = kzalloc(alloc_size, GFP_KERNEL);
-@@ -523,19 +524,17 @@ static int iucv_enable(void)
- goto out;
- /* Declare per cpu buffers. */
- rc = -EIO;
-- get_online_cpus();
- for_each_online_cpu(cpu)
- smp_call_function_single(cpu, iucv_declare_cpu, NULL, 1);
- if (cpus_empty(iucv_buffer_cpumask))
- /* No cpu could declare an iucv buffer. */
-- goto out_path;
-+ goto out;
- put_online_cpus();
- return 0;
--
--out_path:
-- put_online_cpus();
-- kfree(iucv_path_table);
- out:
-+ kfree(iucv_path_table);
-+ iucv_path_table = NULL;
-+ put_online_cpus();
- return rc;
- }
-
-@@ -550,8 +549,9 @@ static void iucv_disable(void)
- {
- get_online_cpus();
- on_each_cpu(iucv_retrieve_cpu, NULL, 1);
-- put_online_cpus();
- kfree(iucv_path_table);
-+ iucv_path_table = NULL;
-+ put_online_cpus();
- }
-
- static int __cpuinit iucv_cpu_notify(struct notifier_block *self,
-@@ -588,10 +588,14 @@ static int __cpuinit iucv_cpu_notify(str
- case CPU_ONLINE_FROZEN:
- case CPU_DOWN_FAILED:
- case CPU_DOWN_FAILED_FROZEN:
-+ if (!iucv_path_table)
-+ break;
- smp_call_function_single(cpu, iucv_declare_cpu, NULL, 1);
- break;
- case CPU_DOWN_PREPARE:
- case CPU_DOWN_PREPARE_FROZEN:
-+ if (!iucv_path_table)
-+ break;
- cpumask = iucv_buffer_cpumask;
- cpu_clear(cpu, cpumask);
- if (cpus_empty(cpumask))