diff options
author | Fenghua Yu <fenghua.yu@intel.com> | 2008-04-04 14:05:59 -0400 |
---|---|---|
committer | Tony Luck <tony.luck@intel.com> | 2008-04-04 14:05:59 -0400 |
commit | 2046b94e7c4fce92eb8165c2c36c6478f4927178 (patch) | |
tree | 0dbbdf17d64b521f2debcc8677368ceec8805d8c /arch/ia64/kernel/setup.c | |
parent | e315c121a858499d84dc88c499046b9f10bb61ec (diff) |
[IA64] Multiple outstanding ptc.g instruction support
According to SDM2.2, Itanium supports multiple outstanding ptc.g instructions.
But current kernel function ia64_global_tlb_purge() uses a spinlock to serialize
ptc.g instructions issued by multiple processors. This serialization might have
scalability issue on a big SMP machine where many processors could purge TLB
in parallel.
The patch fixes this problem by issuing multiple ptc.g instructions in
ia64_global_tlb_purge(). It also adds support for the "PALO" table to get
a platform view of the max number of outstanding ptc.g instructions (which
may be different from the processor view found from PAL_VM_SUMMARY).
PALO specification can be found at: http://www.dig64.org/home/DIG64_PALO_R1_0.pdf
spinaphore implementation by Matthew Wilcox.
Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
Diffstat (limited to 'arch/ia64/kernel/setup.c')
-rw-r--r-- | arch/ia64/kernel/setup.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c index 4aa9eaea76c3..1cbd26340d87 100644 --- a/arch/ia64/kernel/setup.c +++ b/arch/ia64/kernel/setup.c | |||
@@ -59,6 +59,7 @@ | |||
59 | #include <asm/setup.h> | 59 | #include <asm/setup.h> |
60 | #include <asm/smp.h> | 60 | #include <asm/smp.h> |
61 | #include <asm/system.h> | 61 | #include <asm/system.h> |
62 | #include <asm/tlbflush.h> | ||
62 | #include <asm/unistd.h> | 63 | #include <asm/unistd.h> |
63 | #include <asm/hpsim.h> | 64 | #include <asm/hpsim.h> |
64 | 65 | ||
@@ -946,9 +947,10 @@ cpu_init (void) | |||
946 | #endif | 947 | #endif |
947 | 948 | ||
948 | /* set ia64_ctx.max_rid to the maximum RID that is supported by all CPUs: */ | 949 | /* set ia64_ctx.max_rid to the maximum RID that is supported by all CPUs: */ |
949 | if (ia64_pal_vm_summary(NULL, &vmi) == 0) | 950 | if (ia64_pal_vm_summary(NULL, &vmi) == 0) { |
950 | max_ctx = (1U << (vmi.pal_vm_info_2_s.rid_size - 3)) - 1; | 951 | max_ctx = (1U << (vmi.pal_vm_info_2_s.rid_size - 3)) - 1; |
951 | else { | 952 | setup_ptcg_sem(vmi.pal_vm_info_2_s.max_purges, 0); |
953 | } else { | ||
952 | printk(KERN_WARNING "cpu_init: PAL VM summary failed, assuming 18 RID bits\n"); | 954 | printk(KERN_WARNING "cpu_init: PAL VM summary failed, assuming 18 RID bits\n"); |
953 | max_ctx = (1U << 15) - 1; /* use architected minimum */ | 955 | max_ctx = (1U << 15) - 1; /* use architected minimum */ |
954 | } | 956 | } |