ソースを参照

[IA64] cpu-hotplug: Fixing confliction between CPU hot-add and IPI

Signed-off-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>
Acked-by: Satoru Takeuchi <takeuchi_satoru@jp.fujitsu.com>
Acked-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
Kenji Kaneshige 18 年 前
コミット
5ee7737379
1 ファイル変更6 行追加4 行削除
  1. 6 4
      arch/ia64/kernel/smp.c

+ 6 - 4
arch/ia64/kernel/smp.c

@@ -328,10 +328,14 @@ int
 smp_call_function (void (*func) (void *info), void *info, int nonatomic, int wait)
 smp_call_function (void (*func) (void *info), void *info, int nonatomic, int wait)
 {
 {
 	struct call_data_struct data;
 	struct call_data_struct data;
-	int cpus = num_online_cpus()-1;
+	int cpus;
 
 
-	if (!cpus)
+	spin_lock(&call_lock);
+	cpus = num_online_cpus() - 1;
+	if (!cpus) {
+		spin_unlock(&call_lock);
 		return 0;
 		return 0;
+	}
 
 
 	/* Can deadlock when called with interrupts disabled */
 	/* Can deadlock when called with interrupts disabled */
 	WARN_ON(irqs_disabled());
 	WARN_ON(irqs_disabled());
@@ -343,8 +347,6 @@ smp_call_function (void (*func) (void *info), void *info, int nonatomic, int wai
 	if (wait)
 	if (wait)
 		atomic_set(&data.finished, 0);
 		atomic_set(&data.finished, 0);
 
 
-	spin_lock(&call_lock);
-
 	call_data = &data;
 	call_data = &data;
 	mb();	/* ensure store to call_data precedes setting of IPI_CALL_FUNC */
 	mb();	/* ensure store to call_data precedes setting of IPI_CALL_FUNC */
 	send_IPI_allbutself(IPI_CALL_FUNC);
 	send_IPI_allbutself(IPI_CALL_FUNC);