patch-2.3.47 linux/arch/alpha/kernel/smp.c
Next file: linux/arch/alpha/kernel/sys_alcor.c
Previous file: linux/arch/alpha/kernel/setup.c
Back to the patch index
Back to the overall index
- Lines: 96
- Date:
Sun Feb 20 08:13:56 2000
- Orig file:
v2.3.46/linux/arch/alpha/kernel/smp.c
- Orig date:
Thu Feb 10 17:11:02 2000
diff -u --recursive --new-file v2.3.46/linux/arch/alpha/kernel/smp.c linux/arch/alpha/kernel/smp.c
@@ -33,6 +33,7 @@
#include <asm/unistd.h>
#include "proto.h"
+#include "irq_impl.h"
#define DEBUG_SMP 0
@@ -62,6 +63,7 @@
static unsigned long smp_secondary_alive;
unsigned long cpu_present_mask; /* Which cpus ids came online. */
+static unsigned long __cpu_present_mask __initdata = 0; /* cpu reported in the hwrpb */
static int max_cpus = -1; /* Command-line limitation. */
int smp_boot_cpuid; /* Which processor we booted from. */
@@ -506,7 +508,7 @@
if ((cpu->flags & 0x1cc) == 0x1cc) {
smp_num_probed++;
/* Assume here that "whami" == index */
- cpu_present_mask |= (1L << i);
+ __cpu_present_mask |= (1L << i);
cpu->pal_revision = boot_cpu_palrev;
}
@@ -517,11 +519,12 @@
}
} else {
smp_num_probed = 1;
- cpu_present_mask = (1L << smp_boot_cpuid);
+ __cpu_present_mask = (1L << smp_boot_cpuid);
}
+ cpu_present_mask = 1L << smp_boot_cpuid;
printk(KERN_INFO "SMP: %d CPUs probed -- cpu_present_mask = %lx\n",
- smp_num_probed, cpu_present_mask);
+ smp_num_probed, __cpu_present_mask);
}
/*
@@ -565,12 +568,13 @@
if (i == smp_boot_cpuid)
continue;
- if (((cpu_present_mask >> i) & 1) == 0)
+ if (((__cpu_present_mask >> i) & 1) == 0)
continue;
if (smp_boot_one_cpu(i, cpu_count))
continue;
+ cpu_present_mask |= 1L << i;
cpu_count++;
}
@@ -623,7 +627,7 @@
/* We need to make like a normal interrupt -- otherwise
timer interrupts ignore the global interrupt lock,
which would be a Bad Thing. */
- irq_enter(cpu, TIMER_IRQ);
+ irq_enter(cpu, RTC_IRQ);
update_one_process(current, 1, user, !user, cpu);
if (current->pid) {
@@ -647,7 +651,7 @@
}
data->prof_counter = data->prof_multiplier;
- irq_exit(cpu, TIMER_IRQ);
+ irq_exit(cpu, RTC_IRQ);
}
}
@@ -865,6 +869,22 @@
}
return 0;
+}
+
+static void
+ipi_imb(void *ignored)
+{
+ imb();
+}
+
+void
+smp_imb(void)
+{
+ /* Must wait other processors to flush their icache before continue. */
+ if (smp_call_function(ipi_imb, NULL, 1, 1))
+ printk(KERN_CRIT "smp_imb: timed out\n");
+
+ imb();
}
static void
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)