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 /include | |
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 'include')
-rw-r--r-- | include/asm-ia64/sal.h | 17 | ||||
-rw-r--r-- | include/asm-ia64/tlbflush.h | 1 |
2 files changed, 18 insertions, 0 deletions
diff --git a/include/asm-ia64/sal.h b/include/asm-ia64/sal.h index f4904db3b057..3cd637a2c051 100644 --- a/include/asm-ia64/sal.h +++ b/include/asm-ia64/sal.h | |||
@@ -296,6 +296,9 @@ enum { | |||
296 | EFI_GUID(0xe429faf8, 0x3cb7, 0x11d4, 0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81) | 296 | EFI_GUID(0xe429faf8, 0x3cb7, 0x11d4, 0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81) |
297 | #define SAL_PLAT_BUS_ERR_SECT_GUID \ | 297 | #define SAL_PLAT_BUS_ERR_SECT_GUID \ |
298 | EFI_GUID(0xe429faf9, 0x3cb7, 0x11d4, 0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81) | 298 | EFI_GUID(0xe429faf9, 0x3cb7, 0x11d4, 0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81) |
299 | #define PROCESSOR_ABSTRACTION_LAYER_OVERWRITE_GUID \ | ||
300 | EFI_GUID(0x6cb0a200, 0x893a, 0x11da, 0x96, 0xd2, 0x0, 0x10, 0x83, 0xff, \ | ||
301 | 0xca, 0x4d) | ||
299 | 302 | ||
300 | #define MAX_CACHE_ERRORS 6 | 303 | #define MAX_CACHE_ERRORS 6 |
301 | #define MAX_TLB_ERRORS 6 | 304 | #define MAX_TLB_ERRORS 6 |
@@ -879,6 +882,20 @@ extern void ia64_jump_to_sal(struct sal_to_os_boot *); | |||
879 | 882 | ||
880 | extern void ia64_sal_handler_init(void *entry_point, void *gpval); | 883 | extern void ia64_sal_handler_init(void *entry_point, void *gpval); |
881 | 884 | ||
885 | #define PALO_MAX_TLB_PURGES 0xFFFF | ||
886 | #define PALO_SIG "PALO" | ||
887 | |||
888 | struct palo_table { | ||
889 | u8 signature[4]; /* Should be "PALO" */ | ||
890 | u32 length; | ||
891 | u8 minor_revision; | ||
892 | u8 major_revision; | ||
893 | u8 checksum; | ||
894 | u8 reserved1[5]; | ||
895 | u16 max_tlb_purges; | ||
896 | u8 reserved2[6]; | ||
897 | }; | ||
898 | |||
882 | #endif /* __ASSEMBLY__ */ | 899 | #endif /* __ASSEMBLY__ */ |
883 | 900 | ||
884 | #endif /* _ASM_IA64_SAL_H */ | 901 | #endif /* _ASM_IA64_SAL_H */ |
diff --git a/include/asm-ia64/tlbflush.h b/include/asm-ia64/tlbflush.h index 7774a1cac0cc..3be25dfed164 100644 --- a/include/asm-ia64/tlbflush.h +++ b/include/asm-ia64/tlbflush.h | |||
@@ -17,6 +17,7 @@ | |||
17 | * Now for some TLB flushing routines. This is the kind of stuff that | 17 | * Now for some TLB flushing routines. This is the kind of stuff that |
18 | * can be very expensive, so try to avoid them whenever possible. | 18 | * can be very expensive, so try to avoid them whenever possible. |
19 | */ | 19 | */ |
20 | extern void setup_ptcg_sem(int max_purges, int from_palo); | ||
20 | 21 | ||
21 | /* | 22 | /* |
22 | * Flush everything (kernel mapping may also have changed due to | 23 | * Flush everything (kernel mapping may also have changed due to |