|
@@ -28,12 +28,11 @@ static atomic_t __cpuinitdata count_reference = ATOMIC_INIT(0);
|
|
|
#define COUNTON 100
|
|
|
#define NR_LOOPS 5
|
|
|
|
|
|
-void __cpuinit synchronise_count_master(void)
|
|
|
+void __cpuinit synchronise_count_master(int cpu)
|
|
|
{
|
|
|
int i;
|
|
|
unsigned long flags;
|
|
|
unsigned int initcount;
|
|
|
- int nslaves;
|
|
|
|
|
|
#ifdef CONFIG_MIPS_MT_SMTC
|
|
|
/*
|
|
@@ -43,8 +42,7 @@ void __cpuinit synchronise_count_master(void)
|
|
|
return;
|
|
|
#endif
|
|
|
|
|
|
- printk(KERN_INFO "Synchronize counters across %u CPUs: ",
|
|
|
- num_online_cpus());
|
|
|
+ printk(KERN_INFO "Synchronize counters for CPU %u: ", cpu);
|
|
|
|
|
|
local_irq_save(flags);
|
|
|
|
|
@@ -52,7 +50,7 @@ void __cpuinit synchronise_count_master(void)
|
|
|
* Notify the slaves that it's time to start
|
|
|
*/
|
|
|
atomic_set(&count_reference, read_c0_count());
|
|
|
- atomic_set(&count_start_flag, 1);
|
|
|
+ atomic_set(&count_start_flag, cpu);
|
|
|
smp_wmb();
|
|
|
|
|
|
/* Count will be initialised to current timer for all CPU's */
|
|
@@ -69,10 +67,9 @@ void __cpuinit synchronise_count_master(void)
|
|
|
* two CPUs.
|
|
|
*/
|
|
|
|
|
|
- nslaves = num_online_cpus()-1;
|
|
|
for (i = 0; i < NR_LOOPS; i++) {
|
|
|
- /* slaves loop on '!= ncpus' */
|
|
|
- while (atomic_read(&count_count_start) != nslaves)
|
|
|
+ /* slaves loop on '!= 2' */
|
|
|
+ while (atomic_read(&count_count_start) != 1)
|
|
|
mb();
|
|
|
atomic_set(&count_count_stop, 0);
|
|
|
smp_wmb();
|
|
@@ -89,7 +86,7 @@ void __cpuinit synchronise_count_master(void)
|
|
|
/*
|
|
|
* Wait for all slaves to leave the synchronization point:
|
|
|
*/
|
|
|
- while (atomic_read(&count_count_stop) != nslaves)
|
|
|
+ while (atomic_read(&count_count_stop) != 1)
|
|
|
mb();
|
|
|
atomic_set(&count_count_start, 0);
|
|
|
smp_wmb();
|
|
@@ -97,6 +94,7 @@ void __cpuinit synchronise_count_master(void)
|
|
|
}
|
|
|
/* Arrange for an interrupt in a short while */
|
|
|
write_c0_compare(read_c0_count() + COUNTON);
|
|
|
+ atomic_set(&count_start_flag, 0);
|
|
|
|
|
|
local_irq_restore(flags);
|
|
|
|
|
@@ -108,11 +106,10 @@ void __cpuinit synchronise_count_master(void)
|
|
|
printk("done.\n");
|
|
|
}
|
|
|
|
|
|
-void __cpuinit synchronise_count_slave(void)
|
|
|
+void __cpuinit synchronise_count_slave(int cpu)
|
|
|
{
|
|
|
int i;
|
|
|
unsigned int initcount;
|
|
|
- int ncpus;
|
|
|
|
|
|
#ifdef CONFIG_MIPS_MT_SMTC
|
|
|
/*
|
|
@@ -127,16 +124,15 @@ void __cpuinit synchronise_count_slave(void)
|
|
|
* so we first wait for the master to say everyone is ready
|
|
|
*/
|
|
|
|
|
|
- while (!atomic_read(&count_start_flag))
|
|
|
+ while (atomic_read(&count_start_flag) != cpu)
|
|
|
mb();
|
|
|
|
|
|
/* Count will be initialised to next expire for all CPU's */
|
|
|
initcount = atomic_read(&count_reference);
|
|
|
|
|
|
- ncpus = num_online_cpus();
|
|
|
for (i = 0; i < NR_LOOPS; i++) {
|
|
|
atomic_inc(&count_count_start);
|
|
|
- while (atomic_read(&count_count_start) != ncpus)
|
|
|
+ while (atomic_read(&count_count_start) != 2)
|
|
|
mb();
|
|
|
|
|
|
/*
|
|
@@ -146,7 +142,7 @@ void __cpuinit synchronise_count_slave(void)
|
|
|
write_c0_count(initcount);
|
|
|
|
|
|
atomic_inc(&count_count_stop);
|
|
|
- while (atomic_read(&count_count_stop) != ncpus)
|
|
|
+ while (atomic_read(&count_count_stop) != 2)
|
|
|
mb();
|
|
|
}
|
|
|
/* Arrange for an interrupt in a short while */
|