Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

[PATCH] x86_64: Only do the clustered systems have unsynchronized TSC assumption on IBM systems

Big Unisys systems have multiple clusters too, but they have an
synchronized TSC.

I'm using the SMBIOS to check for vendor == IBM.

Cc: Chris McDermott <lcm@us.ibm.com>
Cc: "Protasevich, Natalie" <Natalie.Protasevich@unisys.com>

Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by

Andi Kleen and committed by
Linus Torvalds
13a229ab 5342fba5

+22 -4
-3
arch/i386/kernel/acpi/boot.c
··· 44 44 extern int gsi_irq_sharing(int gsi); 45 45 #include <asm/proto.h> 46 46 47 - static inline int acpi_madt_oem_check(char *oem_id, char *oem_table_id) { return 0; } 48 - 49 - 50 47 #else /* X86 */ 51 48 52 49 #ifdef CONFIG_X86_LOCAL_APIC
+8 -1
arch/x86_64/kernel/apic.c
··· 962 962 irq_exit(); 963 963 } 964 964 965 + int __initdata unsync_tsc_on_multicluster; 966 + 965 967 /* 966 968 * oem_force_hpet_timer -- force HPET mode for some boxes. 967 969 * 968 970 * Thus far, the major user of this is IBM's Summit2 series: 969 971 * 970 - * Clustered boxes may have unsynced TSC problems if they are 972 + * Some clustered boxes may have unsynced TSC problems if they are 971 973 * multi-chassis. Use available data to take a good guess. 972 974 * If in doubt, go HPET. 973 975 */ ··· 978 976 int i, clusters, zeros; 979 977 unsigned id; 980 978 DECLARE_BITMAP(clustermap, NUM_APIC_CLUSTERS); 979 + 980 + /* Only do this check on IBM machines - big Unisys systems 981 + use multiple clusters too, but have synchronized TSC */ 982 + if (!unsync_tsc_on_multicluster) 983 + return 0; 981 984 982 985 bitmap_zero(clustermap, NUM_APIC_CLUSTERS); 983 986
+14
include/asm-x86_64/acpi.h
··· 164 164 165 165 extern int acpi_skip_timer_override; 166 166 167 + extern int unsync_tsc_on_multicluster; 168 + 169 + static inline int acpi_madt_oem_check(char *oem, char *productid) 170 + { 171 + /* Copied from i386. Probably has too many entries. */ 172 + if (!strncmp(oem, "IBM ENSW", 8) && 173 + (!strncmp(productid, "VIGIL SMP", 9) 174 + || !strncmp(productid, "EXA", 3) 175 + || !strncmp(productid, "RUTHLESS SMP", 12))) { 176 + unsync_tsc_on_multicluster = 1; 177 + } 178 + return 0; 179 + } 180 + 167 181 #endif /*__KERNEL__*/ 168 182 169 183 #endif /*_ASM_ACPI_H*/