Przeglądaj źródła

[PATCH] cpu_relax(): smpboot.c

Add cpu_relax() to various smpboot.c init loops.  cpu_relax() always implies a
barrier (according to Arjan), so remove those as well.

Signed-off-by: Andreas Mohr <andi@lisas.de>
Cc: Arjan van de Ven <arjan@linux.intel.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Andreas Mohr 19 lat temu
rodzic
commit
186989177e
1 zmienionych plików z 8 dodań i 6 usunięć
  1. 8 6
      arch/i386/kernel/smpboot.c

+ 8 - 6
arch/i386/kernel/smpboot.c

@@ -257,7 +257,7 @@ static void __init synchronize_tsc_bp (void)
 		 * all APs synchronize but they loop on '== num_cpus'
 		 */
 		while (atomic_read(&tsc_count_start) != num_booting_cpus()-1)
-			mb();
+			cpu_relax();
 		atomic_set(&tsc_count_stop, 0);
 		wmb();
 		/*
@@ -276,7 +276,7 @@ static void __init synchronize_tsc_bp (void)
 		 * Wait for all APs to leave the synchronization point:
 		 */
 		while (atomic_read(&tsc_count_stop) != num_booting_cpus()-1)
-			mb();
+			cpu_relax();
 		atomic_set(&tsc_count_start, 0);
 		wmb();
 		atomic_inc(&tsc_count_stop);
@@ -333,19 +333,21 @@ static void __init synchronize_tsc_ap (void)
 	 * this gets called, so we first wait for the BP to
 	 * finish SMP initialization:
 	 */
-	while (!atomic_read(&tsc_start_flag)) mb();
+	while (!atomic_read(&tsc_start_flag))
+		cpu_relax();
 
 	for (i = 0; i < NR_LOOPS; i++) {
 		atomic_inc(&tsc_count_start);
 		while (atomic_read(&tsc_count_start) != num_booting_cpus())
-			mb();
+			cpu_relax();
 
 		rdtscll(tsc_values[smp_processor_id()]);
 		if (i == NR_LOOPS-1)
 			write_tsc(0, 0);
 
 		atomic_inc(&tsc_count_stop);
-		while (atomic_read(&tsc_count_stop) != num_booting_cpus()) mb();
+		while (atomic_read(&tsc_count_stop) != num_booting_cpus())
+			cpu_relax();
 	}
 }
 #undef NR_LOOPS
@@ -1433,7 +1435,7 @@ int __devinit __cpu_up(unsigned int cpu)
 	/* Unleash the CPU! */
 	cpu_set(cpu, smp_commenced_mask);
 	while (!cpu_isset(cpu, cpu_online_map))
-		mb();
+		cpu_relax();
 	return 0;
 }