Messages in this thread Patch in this message | | | Date | Sun, 12 Jul 2009 01:29:29 +0400 | From | Cyrill Gorcunov <> | Subject | [RFC -tip] x86,apic - set cpu_has_apic for discrete apic |
| |
In case of discrete apic (due to hardware or firmware reason) cpuid may not retrieve cpu_has_apic bit. So for SMP compiled kernels instead of long check we may set "fake" cpu_has_apic bit and check only the bit in further code flow.
Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org> ---
Please review carefully.
arch/x86/kernel/apic/apic.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+)
Index: linux-2.6.git/arch/x86/kernel/apic/apic.c ===================================================================== --- linux-2.6.git.orig/arch/x86/kernel/apic/apic.c +++ linux-2.6.git/arch/x86/kernel/apic/apic.c @@ -1003,6 +1003,20 @@ int __init verify_local_APIC(void) unsigned int reg0, reg1; /* + * For discrete APIC case cpu_has_apic bit could not + * be retrieved via cpuid instruction. Same time + * we rely on this bit (mostly for SMP compiled + * kernel) and instead of checking the long condition + * below all the time we do check for plain cpu_has_apic. + * + * At this moment all the checks are passed and we've + * already complained if there was a BIOS bug. This place + * should be safe for such a trick. --cvg + */ + if (smp_found_config && !cpu_has_apic && !disable_apic) + set_cpu_cap(&boot_cpu_data, X86_FEATURE_APIC); + + /* * The version register is read-only in a real APIC. */ reg0 = apic_read(APIC_LVR);
| |