patch-2.2.11 linux/arch/alpha/kernel/smp.c
Next file: linux/arch/alpha/kernel/sys_dp264.c
Previous file: linux/arch/alpha/kernel/signal.c
Back to the patch index
Back to the overall index
- Lines: 101
- Date:
Mon Aug 9 12:04:38 1999
- Orig file:
v2.2.10/linux/arch/alpha/kernel/smp.c
- Orig date:
Sat Jun 12 11:52:52 1999
diff -u --recursive --new-file v2.2.10/linux/arch/alpha/kernel/smp.c linux/arch/alpha/kernel/smp.c
@@ -95,6 +95,8 @@
smp_store_cpu_info(int cpuid)
{
cpu_data[cpuid].loops_per_sec = loops_per_sec;
+ cpu_data[cpuid].last_asn
+ = (cpuid << WIDTH_HARDWARE_ASN) + ASN_FIRST_VERSION;
}
/*
@@ -105,12 +107,6 @@
{
cpu_data[cpuid].prof_counter = 1;
cpu_data[cpuid].prof_multiplier = 1;
-
-#ifdef NOT_YET_PROFILING
- load_profile_irq(mid_xlate[cpu], lvl14_resolution);
- if (cpu == smp_boot_cpuid)
- enable_pil_irq(14);
-#endif
}
/*
@@ -587,11 +583,9 @@
int user = user_mode(regs);
struct cpuinfo_alpha *data = &cpu_data[cpu];
-#ifdef NOT_YET_PROFILING
- clear_profile_irq(mid_xlate[cpu]);
+ /* Record kernel PC */
if (!user)
alpha_do_profile(regs->pc);
-#endif
if (!--data->prof_counter) {
/* We need to make like a normal interrupt -- otherwise
@@ -628,28 +622,7 @@
int __init
setup_profiling_timer(unsigned int multiplier)
{
-#ifdef NOT_YET_PROFILING
- int i;
- unsigned long flags;
-
- /* Prevent level14 ticker IRQ flooding. */
- if((!multiplier) || (lvl14_resolution / multiplier) < 500)
- return -EINVAL;
-
- save_and_cli(flags);
- for (i = 0; i < NR_CPUS; i++) {
- if (cpu_present_mask & (1L << i)) {
- load_profile_irq(mid_xlate[i],
- lvl14_resolution / multiplier);
- prof_multiplier[i] = multiplier;
- }
- }
- restore_flags(flags);
-
- return 0;
-#else
return -EINVAL;
-#endif
}
@@ -891,9 +864,11 @@
void
flush_tlb_mm(struct mm_struct *mm)
{
- if (mm == current->mm)
+ if (mm == current->mm) {
flush_tlb_current(mm);
- else
+ if (atomic_read(&mm->count) == 1)
+ return;
+ } else
flush_tlb_other(mm);
if (smp_call_function(ipi_flush_tlb_mm, mm, 1, 1)) {
@@ -921,15 +896,17 @@
struct flush_tlb_page_struct data;
struct mm_struct *mm = vma->vm_mm;
+ if (mm == current->mm) {
+ flush_tlb_current_page(mm, vma, addr);
+ if (atomic_read(¤t->mm->count) == 1)
+ return;
+ } else
+ flush_tlb_other(mm);
+
data.vma = vma;
data.mm = mm;
data.addr = addr;
- if (mm == current->mm)
- flush_tlb_current_page(mm, vma, addr);
- else
- flush_tlb_other(mm);
-
if (smp_call_function(ipi_flush_tlb_page, &data, 1, 1)) {
printk(KERN_CRIT "flush_tlb_page: timed out\n");
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)