lkml.org 
[lkml]   [2008]   [Jun]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH] x86: make generic arch support NUMAQ v5
On Mon, Jun 9, 2008 at 7:41 AM, Andy Whitcroft <apw@shadowen.org> wrote:
> On Sun, Jun 08, 2008 at 06:31:54PM -0700, Yinghai Lu wrote:
>>
>> so it could fallback to normal numa.
>> NUMAQ depends on GENERICARCH
>> also decouple genericarch numa with acpi.
>> also make it fallback to bigsmp if apicid > 8.
>>
>> v3: return early if not found_numaq in pci_numa_init
>> remove xquad_portio in misc.c
>> v4: make summit, bigsmp and es7000 depend on GENERICARCH too
>> v5: seperate apicid check for bigsmp to another patch
>> [PATCH] x86: introduce max_physical_apicid for bigsmp switching
>
> Do you have a NUMA-Q to test this on? Also, what is the baseline here
> as I would like to test it?
>
>>
>> Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com>
>>
>> Index: linux-2.6/arch/x86/Kconfig
>> ===================================================================
>> --- linux-2.6.orig/arch/x86/Kconfig
>> +++ linux-2.6/arch/x86/Kconfig
>> @@ -264,36 +264,6 @@ config X86_VOYAGER
>> If you do not specifically know you have a Voyager based machine,
>> say N here, otherwise the kernel you build will not be bootable.
>>
>> -config X86_NUMAQ
>> - bool "NUMAQ (IBM/Sequent)"
>> - depends on SMP && X86_32 && PCI
>> - select NUMA
>> - help
>> - This option is used for getting Linux to run on a (IBM/Sequent) NUMA
>> - multiquad box. This changes the way that processors are bootstrapped,
>> - and uses Clustered Logical APIC addressing mode instead of Flat Logical.
>> - You will need a new lynxer.elf file to flash your firmware with - send
>> - email to <Martin.Bligh@us.ibm.com>.
>> -
>> -config X86_SUMMIT
>> - bool "Summit/EXA (IBM x440)"
>> - depends on X86_32 && SMP
>> - help
>> - This option is needed for IBM systems that use the Summit/EXA chipset.
>> - In particular, it is needed for the x440.
>> -
>> - If you don't have one of these computers, you should say N here.
>> - If you want to build a NUMA kernel, you must select ACPI.
>> -
>> -config X86_BIGSMP
>> - bool "Support for other sub-arch SMP systems with more than 8 CPUs"
>> - depends on X86_32 && SMP
>> - help
>> - This option is needed for the systems that have more than 8 CPUs
>> - and if the system is not of any sub-arch type above.
>> -
>> - If you don't have such a system, you should say N here.
>> -
>> config X86_VISWS
>> bool "SGI 320/540 (Visual Workstation)"
>> depends on X86_32 && !PCI
>> @@ -307,12 +277,33 @@ config X86_VISWS
>> and vice versa. See <file:Documentation/sgi-visws.txt> for details.
>>
>> config X86_GENERICARCH
>> - bool "Generic architecture (Summit, bigsmp, ES7000, default)"
>> + bool "Generic architecture"
>> depends on X86_32
>> help
>> - This option compiles in the Summit, bigsmp, ES7000, default subarchitectures.
>> - It is intended for a generic binary kernel.
>> - If you want a NUMA kernel, select ACPI. We need SRAT for NUMA.
>> + This option compiles in the NUMAQ, Summit, bigsmp, ES7000, default
>> + subarchitectures. It is intended for a generic binary kernel.
>> + if you select them all, kernel will probe it one by one. and will
>> + fallback to default.
>> +
>> +if X86_GENERICARCH
>> +
>> +config X86_NUMAQ
>> + bool "NUMAQ (IBM/Sequent)"
>> + depends on SMP && X86_32 && PCI
>
> Can we not just add && X86_GENERICARCH here instead of putting them in
> that if ?
>
>> + select NUMA
>> + help
>> + This option is used for getting Linux to run on a NUMAQ (IBM/Sequent)
>> + NUMA multiquad box. This changes the way that processors are
>> + bootstrapped, and uses Clustered Logical APIC addressing mode instead
>> + of Flat Logical. You will need a new lynxer.elf file to flash your
>> + firmware with - send email to <Martin.Bligh@us.ibm.com>.
>> +
>> +config X86_SUMMIT
>> + bool "Summit/EXA (IBM x440)"
>> + depends on X86_32 && SMP
>> + help
>> + This option is needed for IBM systems that use the Summit/EXA chipset.
>> + In particular, it is needed for the x440.
>>
>> config X86_ES7000
>> bool "Support for Unisys ES7000 IA32 series"
>> @@ -320,8 +311,15 @@ config X86_ES7000
>> help
>> Support for Unisys ES7000 systems. Say 'Y' here if this kernel is
>> supposed to run on an IA32-based Unisys ES7000 system.
>> - Only choose this option if you have such a system, otherwise you
>> - should say N here.
>> +
>> +config X86_BIGSMP
>> + bool "Support for big SMP systems with more than 8 CPUs"
>> + depends on X86_32 && SMP
>> + help
>> + This option is needed for the systems that have more than 8 CPUs
>> + and if the system is not of any sub-arch type above.
>> +
>> +endif
>>
>> config X86_RDC321X
>> bool "RDC R-321x SoC"
>> @@ -908,9 +906,9 @@ config X86_PAE
>> config NUMA
>> bool "Numa Memory Allocation and Scheduler Support (EXPERIMENTAL)"
>> depends on SMP
>> - depends on X86_64 || (X86_32 && HIGHMEM64G && (X86_NUMAQ || (X86_SUMMIT || X86_GENERICARCH) && ACPI) && EXPERIMENTAL)
>> + depends on X86_64 || (X86_32 && HIGHMEM64G && (X86_NUMAQ || X86_GENERICARCH || X86_SUMMIT && ACPI) && EXPERIMENTAL)
>> default n if X86_PC
>> - default y if (X86_NUMAQ || X86_SUMMIT)
>> + default y if (X86_NUMAQ || X86_SUMMIT || X86_GENERICARCH)
>
> If I am reading this right we are making all genericarch kernels NUMA,
> which before they were not. Hmmm is that going to cause problems
> elsewhere? Mind you can you get non-numa boxes any more?

yes, you still can select genericarch without numa

>
> If its only NUMAQ which makes that requireemnt it seems wrong to add
> GENERICARCH here. ie. its NUMAQ or SUMMIT that brings the requirement.
>
>> help
>> Enable NUMA (Non Uniform Memory Access) support.
>> The kernel will try to allocate memory used by a CPU on the
>> Index: linux-2.6/arch/x86/kernel/io_apic_32.c
>> ===================================================================
>> --- linux-2.6.orig/arch/x86/kernel/io_apic_32.c
>> +++ linux-2.6/arch/x86/kernel/io_apic_32.c
>> @@ -1715,7 +1715,6 @@ void disable_IO_APIC(void)
>> * by Matt Domsch <Matt_Domsch@dell.com> Tue Dec 21 12:25:05 CST 1999
>> */
>>
>> -#ifndef CONFIG_X86_NUMAQ
>> static void __init setup_ioapic_ids_from_mpc(void)
>> {
>> union IO_APIC_reg_00 reg_00;
>> @@ -1725,6 +1724,11 @@ static void __init setup_ioapic_ids_from
>> unsigned char old_id;
>> unsigned long flags;
>>
>> +#ifdef CONFIG_X86_NUMAQ
>> + if (found_numaq)
>> + return;
>> +#endif
>> +
>
> Could this not be always compiled in? As long as found_numaq is never 1
> we should be ok.

wonder if someone don't want to have extra code for numaq check compiled in?

>
>> /*
>> * Don't check I/O APIC IDs for xAPIC systems. They have
>> * no meaning without the serial APIC bus.
>> @@ -1821,9 +1825,6 @@ static void __init setup_ioapic_ids_from
>> apic_printk(APIC_VERBOSE, " ok.\n");
>> }
>> }
>> -#else
>> -static void __init setup_ioapic_ids_from_mpc(void) { }
>> -#endif
>>
>> int no_timer_check __initdata;
>>
>> Index: linux-2.6/arch/x86/kernel/mpparse.c
>> ===================================================================
>> --- linux-2.6.orig/arch/x86/kernel/mpparse.c
>> +++ linux-2.6/arch/x86/kernel/mpparse.c
>> @@ -49,15 +49,73 @@ static int __init mpf_checksum(unsigned
>> }
>>
>> #ifdef CONFIG_X86_NUMAQ
>> +int found_numaq;
>> /*
>> * Have to match translation table entries to main table entries by counter
>> * hence the mpc_record variable .... can't see a less disgusting way of
>> * doing this ....
>> */
>> +struct mpc_config_translation {
>> + unsigned char mpc_type;
>> + unsigned char trans_len;
>> + unsigned char trans_type;
>> + unsigned char trans_quad;
>> + unsigned char trans_global;
>> + unsigned char trans_local;
>> + unsigned short trans_reserved;
>> +};
>> +
>>
>> static int mpc_record;
>> static struct mpc_config_translation *translation_table[MAX_MPC_ENTRY]
>> __cpuinitdata;
>> +
>> +static inline int generate_logical_apicid(int quad, int phys_apicid)
>> +{
>> + return (quad << 4) + (phys_apicid ? phys_apicid << 1 : 1);
>> +}
>> +
>> +
>> +static inline int mpc_apic_id(struct mpc_config_processor *m,
>> + struct mpc_config_translation *translation_record)
>> +{
>> + int quad = translation_record->trans_quad;
>> + int logical_apicid = generate_logical_apicid(quad, m->mpc_apicid);
>> +
>> + printk(KERN_DEBUG "Processor #%d %u:%u APIC version %d (quad %d, apic %d)\n",
>> + m->mpc_apicid,
>> + (m->mpc_cpufeature & CPU_FAMILY_MASK) >> 8,
>> + (m->mpc_cpufeature & CPU_MODEL_MASK) >> 4,
>> + m->mpc_apicver, quad, logical_apicid);
>> + return logical_apicid;
>> +}
>> +
>> +int mp_bus_id_to_node[MAX_MP_BUSSES];
>> +
>> +int mp_bus_id_to_local[MAX_MP_BUSSES];
>> +
>> +static void mpc_oem_bus_info(struct mpc_config_bus *m, char *name,
>> + struct mpc_config_translation *translation)
>> +{
>> + int quad = translation->trans_quad;
>> + int local = translation->trans_local;
>> +
>> + mp_bus_id_to_node[m->mpc_busid] = quad;
>> + mp_bus_id_to_local[m->mpc_busid] = local;
>> + printk(KERN_INFO "Bus #%d is %s (node %d)\n",
>> + m->mpc_busid, name, quad);
>> +}
>> +
>> +int quad_local_to_mp_bus_id [NR_CPUS/4][4];
>> +static void mpc_oem_pci_bus(struct mpc_config_bus *m,
>> + struct mpc_config_translation *translation)
>> +{
>> + int quad = translation->trans_quad;
>> + int local = translation->trans_local;
>> +
>> + quad_local_to_mp_bus_id[quad][local] = m->mpc_busid;
>> +}
>> +
>> #endif
>>
>> static void __cpuinit MP_processor_info(struct mpc_config_processor *m)
>> @@ -321,11 +382,11 @@ static void __init smp_read_mpc_oem(stru
>> }
>> }
>>
>> -static inline void mps_oem_check(struct mp_config_table *mpc, char *oem,
>> +void numaq_mps_oem_check(struct mp_config_table *mpc, char *oem,
>> char *productid)
>> {
>> if (strncmp(oem, "IBM NUMA", 8))
>> - printk("Warning! May not be a NUMA-Q system!\n");
>> + printk("Warning! Not a NUMA-Q system!\n");
>> else
>> found_numaq = 1;
>>
>> @@ -388,7 +449,16 @@ static int __init smp_read_mpc(struct mp
>> return 0;
>>
>> #ifdef CONFIG_X86_32
>> - mps_oem_check(mpc, oem, str);
>> + /*
>> + * need to make sure summit and es7000's mps_oem_check is safe to be
>> + * called early via genericarch 's mps_oem_check
>> + */
>> + if (early) {
>> +#ifdef CONFIG_X86_NUMAQ
>> + numaq_mps_oem_check(mpc, oem, str);
>> +#endif
>
> Is there any reason we cannot use:
>
> if (found_numaq)
> numaq_mps_oem_check(mpc, oem, str);
>
> Also why is this dependant on 'early'. There doesn't seem to be such
> a check in the original path?

because I wonder if extra early calling for mps_oem_check is safe for
summit, es7000.

>
>
>> + } else
>> + mps_oem_check(mpc, oem, str);
>> #endif
>>
>> /* save the local APIC address, it might be non-default */
>> Index: linux-2.6/arch/x86/kernel/numaq_32.c
>> ===================================================================
>> --- linux-2.6.orig/arch/x86/kernel/numaq_32.c
>> +++ linux-2.6/arch/x86/kernel/numaq_32.c
>> @@ -36,8 +36,6 @@
>>
>> #define MB_TO_PAGES(addr) ((addr) << (20 - PAGE_SHIFT))
>>
>> -int found_numaq;
>> -
>> /*
>> * Function: smp_dump_qct()
>> *
>> @@ -105,13 +103,3 @@ static int __init numaq_tsc_disable(void
>> }
>> arch_initcall(numaq_tsc_disable);
>>
>> -#ifdef CONFIG_ACPI
>> -/*
>> - * Dummy implementation:
>> - */
>> -struct pci_bus * __devinit
>> -pci_acpi_scan_root(struct acpi_device *device, int domain, int busnum)
>> -{
>> - return NULL;
>> -}
>> -#endif
>> Index: linux-2.6/arch/x86/mach-generic/Makefile
>> ===================================================================
>> --- linux-2.6.orig/arch/x86/mach-generic/Makefile
>> +++ linux-2.6/arch/x86/mach-generic/Makefile
>> @@ -2,7 +2,11 @@
>> # Makefile for the generic architecture
>> #
>>
>> -EXTRA_CFLAGS := -Iarch/x86/kernel
>> +EXTRA_CFLAGS := -Iarch/x86/kernel
>>
>> -obj-y := probe.o summit.o bigsmp.o es7000.o default.o
>> -obj-y += ../../x86/mach-es7000/
>> +obj-y := probe.o default.o
>> +obj-$(CONFIG_X86_NUMAQ) += numaq.o
>> +obj-$(CONFIG_X86_SUMMIT) += summit.o
>> +obj-$(CONFIG_X86_BIGSMP) += bigsmp.o
>> +obj-$(CONFIG_X86_ES7000) += es7000.o
>> +obj-$(CONFIG_X86_ES7000) += ../../x86/mach-es7000/
>> Index: linux-2.6/arch/x86/mach-generic/probe.c
>> ===================================================================
>> --- linux-2.6.orig/arch/x86/mach-generic/probe.c
>> +++ linux-2.6/arch/x86/mach-generic/probe.c
>> @@ -16,6 +16,7 @@
>> #include <asm/apicdef.h>
>> #include <asm/genapic.h>
>>
>> +extern struct genapic apic_numaq;
>> extern struct genapic apic_summit;
>> extern struct genapic apic_bigsmp;
>> extern struct genapic apic_es7000;
>> @@ -24,9 +25,18 @@ extern struct genapic apic_default;
>> struct genapic *genapic = &apic_default;
>>
>> static struct genapic *apic_probe[] __initdata = {
>> +#ifdef CONFIG_X86_NUMAQ
>> + &apic_numaq,
>> +#endif
>> +#ifdef CONFIG_X86_SUMMIT
>> &apic_summit,
>> +#endif
>> +#ifdef CONFIG_X86_BIGSMP
>> &apic_bigsmp,
>> +#endif
>> +#ifdef CONFIG_X86_ES7000
>> &apic_es7000,
>> +#endif
>> &apic_default, /* must be last */
>> NULL,
>> };
>> @@ -54,6 +64,7 @@ early_param("apic", parse_apic);
>>
>> void __init generic_bigsmp_probe(void)
>> {
>> +#if CONFIG_X86_BIGSMP
>> /*
>> * This routine is used to switch to bigsmp mode when
>> * - There is no apic= option specified by the user
>> @@ -67,6 +78,7 @@ void __init generic_bigsmp_probe(void)
>> printk(KERN_INFO "Overriding APIC driver with %s\n",
>> genapic->name);
>> }
>> +#endif
>> }
>>
>> void __init generic_apic_probe(void)
>> @@ -88,7 +100,8 @@ void __init generic_apic_probe(void)
>>
>> /* These functions can switch the APIC even after the initial ->probe() */
>>
>> -int __init mps_oem_check(struct mp_config_table *mpc, char *oem, char *productid)
>> +int __init mps_oem_check(struct mp_config_table *mpc, char *oem,
>> + char *productid)
>> {
>> int i;
>> for (i = 0; apic_probe[i]; ++i) {
>
> That looks like an unrelated cleanup?

yeah.

>
>> Index: linux-2.6/arch/x86/pci/Makefile_32
>> ===================================================================
>> --- linux-2.6.orig/arch/x86/pci/Makefile_32
>> +++ linux-2.6/arch/x86/pci/Makefile_32
>> @@ -13,10 +13,11 @@ pci-y := fixup.o
>> pci-$(CONFIG_ACPI) += acpi.o
>> pci-y += legacy.o irq.o
>>
>> -# Careful: VISWS and NUMAQ overrule the pci-y above. The colons are
>> +# Careful: VISWS overrule the pci-y above. The colons are
>> # therefor correct. This needs a proper fix by distangling the code.
>> pci-$(CONFIG_X86_VISWS) := visws.o fixup.o
>> -pci-$(CONFIG_X86_NUMAQ) := numa.o irq.o
>> +
>> +pci-$(CONFIG_X86_NUMAQ) += numa.o
>>
>> # Necessary for NUMAQ as well
>> pci-$(CONFIG_NUMA) += mp_bus_to_node.o
>> Index: linux-2.6/arch/x86/pci/numa.c
>> ===================================================================
>> --- linux-2.6.orig/arch/x86/pci/numa.c
>> +++ linux-2.6/arch/x86/pci/numa.c
>> @@ -6,45 +6,21 @@
>> #include <linux/init.h>
>> #include <linux/nodemask.h>
>> #include <mach_apic.h>
>> +#include <asm/mpspec.h>
>> #include "pci.h"
>>
>> #define XQUAD_PORTIO_BASE 0xfe400000
>> #define XQUAD_PORTIO_QUAD 0x40000 /* 256k per quad. */
>>
>> -int mp_bus_id_to_node[MAX_MP_BUSSES];
>> #define BUS2QUAD(global) (mp_bus_id_to_node[global])
>>
>> -int mp_bus_id_to_local[MAX_MP_BUSSES];
>> #define BUS2LOCAL(global) (mp_bus_id_to_local[global])
>>
>> -void mpc_oem_bus_info(struct mpc_config_bus *m, char *name,
>> - struct mpc_config_translation *translation)
>> -{
>> - int quad = translation->trans_quad;
>> - int local = translation->trans_local;
>> -
>> - mp_bus_id_to_node[m->mpc_busid] = quad;
>> - mp_bus_id_to_local[m->mpc_busid] = local;
>> - printk(KERN_INFO "Bus #%d is %s (node %d)\n",
>> - m->mpc_busid, name, quad);
>> -}
>> -
>> -int quad_local_to_mp_bus_id [NR_CPUS/4][4];
>> #define QUADLOCAL2BUS(quad,local) (quad_local_to_mp_bus_id[quad][local])
>> -void mpc_oem_pci_bus(struct mpc_config_bus *m,
>> - struct mpc_config_translation *translation)
>> -{
>> - int quad = translation->trans_quad;
>> - int local = translation->trans_local;
>> -
>> - quad_local_to_mp_bus_id[quad][local] = m->mpc_busid;
>> -}
>>
>> /* Where the IO area was mapped on multiquad, always 0 otherwise */
>> void *xquad_portio;
>> -#ifdef CONFIG_X86_NUMAQ
>> EXPORT_SYMBOL(xquad_portio);
>> -#endif
>>
>> #define XQUAD_PORT_ADDR(port, quad) (xquad_portio + (XQUAD_PORTIO_QUAD*quad) + port)
>>
>> @@ -179,6 +155,9 @@ static int __init pci_numa_init(void)
>> {
>> int quad;
>>
>> + if (!found_numaq)
>> + return 0;
>> +
>> raw_pci_ops = &pci_direct_conf1_mq;
>>
>> if (pcibios_scanned++)
>> Index: linux-2.6/include/asm-x86/mach-generic/mach_mpparse.h
>> ===================================================================
>> --- linux-2.6.orig/include/asm-x86/mach-generic/mach_mpparse.h
>> +++ linux-2.6/include/asm-x86/mach-generic/mach_mpparse.h
>> @@ -1,7 +1,10 @@
>> #ifndef _MACH_MPPARSE_H
>> #define _MACH_MPPARSE_H 1
>>
>> -int mps_oem_check(struct mp_config_table *mpc, char *oem, char *productid);
>> -int acpi_madt_oem_check(char *oem_id, char *oem_table_id);
>> +
>> +extern int mps_oem_check(struct mp_config_table *mpc, char *oem,
>> + char *productid);
>> +
>> +extern int acpi_madt_oem_check(char *oem_id, char *oem_table_id);
>>
>> #endif
>> Index: linux-2.6/include/asm-x86/mach-numaq/mach_apic.h
>> ===================================================================
>> --- linux-2.6.orig/include/asm-x86/mach-numaq/mach_apic.h
>> +++ linux-2.6/include/asm-x86/mach-numaq/mach_apic.h
>> @@ -20,8 +20,14 @@ static inline cpumask_t target_cpus(void
>> #define INT_DELIVERY_MODE dest_LowestPrio
>> #define INT_DEST_MODE 0 /* physical delivery on LOCAL quad */
>>
>> -#define check_apicid_used(bitmap, apicid) physid_isset(apicid, bitmap)
>> -#define check_apicid_present(bit) physid_isset(bit, phys_cpu_present_map)
>> +static inline unsigned long check_apicid_used(physid_mask_t bitmap, int apicid)
>> +{
>> + return physid_isset(apicid, bitmap);
>> +}
>> +static inline unsigned long check_apicid_present(int bit)
>> +{
>> + return physid_isset(bit, phys_cpu_present_map);
>> +}
>> #define apicid_cluster(apicid) (apicid & 0xF0)
>>
>> static inline int apic_id_registered(void)
>> @@ -77,11 +83,6 @@ static inline int cpu_present_to_apicid(
>> return BAD_APICID;
>> }
>>
>> -static inline int generate_logical_apicid(int quad, int phys_apicid)
>> -{
>> - return (quad << 4) + (phys_apicid ? phys_apicid << 1 : 1);
>> -}
>> -
>> static inline int apicid_to_node(int logical_apicid)
>> {
>> return logical_apicid >> 4;
>> @@ -95,30 +96,6 @@ static inline physid_mask_t apicid_to_cp
>> return physid_mask_of_physid(cpu + 4*node);
>> }
>>
>> -struct mpc_config_translation {
>> - unsigned char mpc_type;
>> - unsigned char trans_len;
>> - unsigned char trans_type;
>> - unsigned char trans_quad;
>> - unsigned char trans_global;
>> - unsigned char trans_local;
>> - unsigned short trans_reserved;
>> -};
>> -
>> -static inline int mpc_apic_id(struct mpc_config_processor *m,
>> - struct mpc_config_translation *translation_record)
>> -{
>> - int quad = translation_record->trans_quad;
>> - int logical_apicid = generate_logical_apicid(quad, m->mpc_apicid);
>> -
>> - printk("Processor #%d %u:%u APIC version %d (quad %d, apic %d)\n",
>> - m->mpc_apicid,
>> - (m->mpc_cpufeature & CPU_FAMILY_MASK) >> 8,
>> - (m->mpc_cpufeature & CPU_MODEL_MASK) >> 4,
>> - m->mpc_apicver, quad, logical_apicid);
>> - return logical_apicid;
>> -}
>> -
>> extern void *xquad_portio;
>>
>> static inline void setup_portio_remap(void)
>> Index: linux-2.6/include/asm-x86/mach-numaq/mach_mpparse.h
>> ===================================================================
>> --- linux-2.6.orig/include/asm-x86/mach-numaq/mach_mpparse.h
>> +++ linux-2.6/include/asm-x86/mach-numaq/mach_mpparse.h
>> @@ -1,14 +1,7 @@
>> #ifndef __ASM_MACH_MPPARSE_H
>> #define __ASM_MACH_MPPARSE_H
>>
>> -extern void mpc_oem_bus_info(struct mpc_config_bus *m, char *name,
>> - struct mpc_config_translation *translation);
>> -extern void mpc_oem_pci_bus(struct mpc_config_bus *m,
>> - struct mpc_config_translation *translation);
>> -
>> -/* Hook from generic ACPI tables.c */
>> -static inline void acpi_madt_oem_check(char *oem_id, char *oem_table_id)
>> -{
>> -}
>> +extern void numaq_mps_oem_check(struct mp_config_table *mpc, char *oem,
>> + char *productid);
>>
>> #endif /* __ASM_MACH_MPPARSE_H */
>> Index: linux-2.6/include/asm-x86/mmzone_32.h
>> ===================================================================
>> --- linux-2.6.orig/include/asm-x86/mmzone_32.h
>> +++ linux-2.6/include/asm-x86/mmzone_32.h
>> @@ -12,11 +12,9 @@
>> extern struct pglist_data *node_data[];
>> #define NODE_DATA(nid) (node_data[nid])
>>
>> -#ifdef CONFIG_X86_NUMAQ
>> - #include <asm/numaq.h>
>> -#elif defined(CONFIG_ACPI_SRAT)/* summit or generic arch */
>> - #include <asm/srat.h>
>> -#endif
>> +#include <asm/numaq.h>
>> +/* summit or generic arch */
>> +#include <asm/srat.h>
>>
>> extern int get_memcfg_numa_flat(void);
>> /*
>> @@ -26,14 +24,11 @@ extern int get_memcfg_numa_flat(void);
>> */
>> static inline void get_memcfg_numa(void)
>> {
>> -#ifdef CONFIG_X86_NUMAQ
>> +
>> if (get_memcfg_numaq())
>> return;
>> -#elif defined(CONFIG_ACPI_SRAT)
>> if (get_memcfg_from_srat())
>> return;
>> -#endif
>> -
>> get_memcfg_numa_flat();
>> }
>>
>> @@ -42,7 +37,6 @@ extern int early_pfn_to_nid(unsigned lon
>> #else /* !CONFIG_NUMA */
>>
>> #define get_memcfg_numa get_memcfg_numa_flat
>> -#define get_zholes_size(n) (0)
>>
>> #endif /* CONFIG_NUMA */
>>
>> @@ -83,9 +77,6 @@ static inline int pfn_to_nid(unsigned lo
>> __pgdat->node_start_pfn + __pgdat->node_spanned_pages; \
>> })
>>
>> -#ifdef CONFIG_X86_NUMAQ /* we have contiguous memory on NUMA-Q */
>> -#define pfn_valid(pfn) ((pfn) < num_physpages)
>> -#else
>> static inline int pfn_valid(int pfn)
>> {
>> int nid = pfn_to_nid(pfn);
>> @@ -94,7 +85,6 @@ static inline int pfn_valid(int pfn)
>> return (pfn < node_end_pfn(nid));
>> return 0;
>> }
>> -#endif /* CONFIG_X86_NUMAQ */
>
> Ok, that is a small change in pfn_valid for numaq, but essentially its a
> little less efficient. We can probabally live with that.
>
>> #endif /* CONFIG_DISCONTIGMEM */
>>
>> Index: linux-2.6/include/asm-x86/numaq.h
>> ===================================================================
>> --- linux-2.6.orig/include/asm-x86/numaq.h
>> +++ linux-2.6/include/asm-x86/numaq.h
>> @@ -157,9 +157,10 @@ struct sys_cfg_data {
>> struct eachquadmem eq[MAX_NUMNODES]; /* indexed by quad id */
>> };
>>
>> -static inline unsigned long *get_zholes_size(int nid)
>> +#else
>> +static inline int get_memcfg_numaq(void)
>> {
>> - return NULL;
>> + return 0;
>> }
>> #endif /* CONFIG_X86_NUMAQ */
>> #endif /* NUMAQ_H */
>> Index: linux-2.6/include/asm-x86/srat.h
>> ===================================================================
>> --- linux-2.6.orig/include/asm-x86/srat.h
>> +++ linux-2.6/include/asm-x86/srat.h
>> @@ -27,11 +27,13 @@
>> #ifndef _ASM_SRAT_H_
>> #define _ASM_SRAT_H_
>>
>> -#ifndef CONFIG_ACPI_SRAT
>> -#error CONFIG_ACPI_SRAT not defined, and srat.h header has been included
>> -#endif
>> -
>> +#ifdef CONFIG_ACPI_SRAT
>> extern int get_memcfg_from_srat(void);
>> -extern unsigned long *get_zholes_size(int);
>> +#else
>> +static inline int get_memcfg_from_srat(void)
>> +{
>> + return 0;
>> +}
>> +#endif
>>
>> #endif /* _ASM_SRAT_H_ */
>> Index: linux-2.6/arch/x86/mach-generic/numaq.c
>> ===================================================================
>> --- /dev/null
>> +++ linux-2.6/arch/x86/mach-generic/numaq.c
>> @@ -0,0 +1,41 @@
>> +/*
>> + * APIC driver for the IBM NUMAQ chipset.
>> + */
>> +#define APIC_DEFINITION 1
>> +#include <linux/threads.h>
>> +#include <linux/cpumask.h>
>> +#include <linux/smp.h>
>> +#include <asm/mpspec.h>
>> +#include <asm/genapic.h>
>> +#include <asm/fixmap.h>
>> +#include <asm/apicdef.h>
>> +#include <linux/kernel.h>
>> +#include <linux/string.h>
>> +#include <linux/init.h>
>> +#include <asm/mach-numaq/mach_apic.h>
>> +#include <asm/mach-numaq/mach_apicdef.h>
>> +#include <asm/mach-numaq/mach_ipi.h>
>> +#include <asm/mach-numaq/mach_mpparse.h>
>> +#include <asm/mach-numaq/mach_wakecpu.h>
>> +#include <asm/numaq.h>
>> +
>> +static int mps_oem_check(struct mp_config_table *mpc, char *oem,
>> + char *productid)
>> +{
>> + numaq_mps_oem_check(mpc, oem, productid);
>> + return found_numaq;
>> +}
>> +
>> +static int probe_numaq(void)
>> +{
>> + /* already know from get_memcfg_numaq() */
>> + return found_numaq;
>> +}
>> +
>> +/* Hook from generic ACPI tables.c */
>> +static int acpi_madt_oem_check(char *oem_id, char *oem_table_id)
>> +{
>> + return 0;
>> +}
>> +
>> +struct genapic apic_numaq = APIC_INIT("NUMAQ", probe_numaq);
>> Index: linux-2.6/arch/x86/mach-generic/bigsmp.c
>> ===================================================================
>> --- linux-2.6.orig/arch/x86/mach-generic/bigsmp.c
>> +++ linux-2.6/arch/x86/mach-generic/bigsmp.c
>> @@ -23,10 +23,8 @@ static int dmi_bigsmp; /* can be set by
>>
>> static int hp_ht_bigsmp(const struct dmi_system_id *d)
>> {
>> -#ifdef CONFIG_X86_GENERICARCH
>> printk(KERN_NOTICE "%s detected: force use of apic=bigsmp\n", d->ident);
>> dmi_bigsmp = 1;
>> -#endif
>> return 0;
>> }
>>
>> Index: linux-2.6/drivers/acpi/Kconfig
>> ===================================================================
>> --- linux-2.6.orig/drivers/acpi/Kconfig
>> +++ linux-2.6/drivers/acpi/Kconfig
>> @@ -4,7 +4,6 @@
>>
>> menuconfig ACPI
>> bool "ACPI (Advanced Configuration and Power Interface) Support"
>> - depends on !X86_NUMAQ
>> depends on !X86_VISWS
>> depends on !IA64_HP_SIM
>> depends on IA64 || X86
>> Index: linux-2.6/include/asm-x86/mpspec.h
>> ===================================================================
>> --- linux-2.6.orig/include/asm-x86/mpspec.h
>> +++ linux-2.6/include/asm-x86/mpspec.h
>> @@ -13,6 +13,12 @@ extern int apic_version[MAX_APICS];
>> extern u8 apicid_2_node[];
>> extern int pic_mode;
>>
>> +#ifdef CONFIG_X86_NUMAQ
>> +extern int mp_bus_id_to_node[MAX_MP_BUSSES];
>> +extern int mp_bus_id_to_local[MAX_MP_BUSSES];
>> +extern int quad_local_to_mp_bus_id [NR_CPUS/4][4];
>> +#endif
>> +
>> #define MAX_APICID 256
>>
>> #else
>> Index: linux-2.6/arch/x86/kernel/summit_32.c
>> ===================================================================
>> --- linux-2.6.orig/arch/x86/kernel/summit_32.c
>> +++ linux-2.6/arch/x86/kernel/summit_32.c
>> @@ -36,7 +36,9 @@ static struct rio_table_hdr *rio_table_h
>> static struct scal_detail *scal_devs[MAX_NUMNODES] __initdata;
>> static struct rio_detail *rio_devs[MAX_NUMNODES*4] __initdata;
>>
>> +#ifndef CONFIG_X86_NUMAQ
>> static int mp_bus_id_to_node[MAX_MP_BUSSES] __initdata;
>> +#endif
>>
>> static int __init setup_pci_node_map_for_wpeg(int wpeg_num, int last_bus)
>> {
>> Index: linux-2.6/arch/x86/boot/compressed/misc.c
>> ===================================================================
>> --- linux-2.6.orig/arch/x86/boot/compressed/misc.c
>> +++ linux-2.6/arch/x86/boot/compressed/misc.c
>> @@ -217,10 +217,6 @@ static char *vidmem;
>> static int vidport;
>> static int lines, cols;
>>
>> -#ifdef CONFIG_X86_NUMAQ
>> -void *xquad_portio;
>> -#endif
>> -
>> #include "../../../../lib/inflate.c"
>>
>> static void *malloc(int size)
>> Index: linux-2.6/arch/x86/Makefile
>> ===================================================================
>> --- linux-2.6.orig/arch/x86/Makefile
>> +++ linux-2.6/arch/x86/Makefile
>> @@ -117,29 +117,11 @@ mcore-$(CONFIG_X86_VOYAGER) := arch/x86/
>> mflags-$(CONFIG_X86_VISWS) := -Iinclude/asm-x86/mach-visws
>> mcore-$(CONFIG_X86_VISWS) := arch/x86/mach-visws/
>>
>> -# NUMAQ subarch support
>> -mflags-$(CONFIG_X86_NUMAQ) := -Iinclude/asm-x86/mach-numaq
>> -mcore-$(CONFIG_X86_NUMAQ) := arch/x86/mach-default/
>> -
>> -# BIGSMP subarch support
>> -mflags-$(CONFIG_X86_BIGSMP) := -Iinclude/asm-x86/mach-bigsmp
>> -mcore-$(CONFIG_X86_BIGSMP) := arch/x86/mach-default/
>> -
>> -#Summit subarch support
>> -mflags-$(CONFIG_X86_SUMMIT) := -Iinclude/asm-x86/mach-summit
>> -mcore-$(CONFIG_X86_SUMMIT) := arch/x86/mach-default/
>> -
>> # generic subarchitecture
>> mflags-$(CONFIG_X86_GENERICARCH):= -Iinclude/asm-x86/mach-generic
>> fcore-$(CONFIG_X86_GENERICARCH) += arch/x86/mach-generic/
>> mcore-$(CONFIG_X86_GENERICARCH) := arch/x86/mach-default/
>>
>> -
>> -# ES7000 subarch support
>> -mflags-$(CONFIG_X86_ES7000) := -Iinclude/asm-x86/mach-es7000
>> -fcore-$(CONFIG_X86_ES7000) := arch/x86/mach-es7000/
>> -mcore-$(CONFIG_X86_ES7000) := arch/x86/mach-default/
>> -
>> # RDC R-321x subarch support
>> mflags-$(CONFIG_X86_RDC321X) := -Iinclude/asm-x86/mach-rdc321x
>> mcore-$(CONFIG_X86_RDC321X) := arch/x86/mach-default/
>> Index: linux-2.6/arch/x86/kernel/acpi/boot.c
>> ===================================================================
>> --- linux-2.6.orig/arch/x86/kernel/acpi/boot.c
>> +++ linux-2.6/arch/x86/kernel/acpi/boot.c
>> @@ -858,7 +858,7 @@ static int __init acpi_parse_madt_lapic_
>> #ifdef CONFIG_X86_IO_APIC
>> #define MP_ISA_BUS 0
>>
>> -#if defined(CONFIG_X86_ES7000) || defined(CONFIG_X86_GENERICARCH)
>> +#ifdef CONFIG_X86_ES7000
>> extern int es7000_plat;
>> #endif
>>
>> @@ -1007,7 +1007,7 @@ void __init mp_config_acpi_legacy_irqs(v
>> set_bit(MP_ISA_BUS, mp_bus_not_pci);
>> Dprintk("Bus #%d is ISA\n", MP_ISA_BUS);
>>
>> -#if defined(CONFIG_X86_ES7000) || defined(CONFIG_X86_GENERICARCH)
>> +#ifdef CONFIG_X86_ES7000
>> /*
>> * Older generations of ES7000 have no legacy identity mappings
>> */
>> Index: linux-2.6/arch/x86/mach-es7000/Makefile
>> ===================================================================
>> --- linux-2.6.orig/arch/x86/mach-es7000/Makefile
>> +++ linux-2.6/arch/x86/mach-es7000/Makefile
>> @@ -3,4 +3,3 @@
>> #
>>
>> obj-$(CONFIG_X86_ES7000) := es7000plat.o
>> -obj-$(CONFIG_X86_GENERICARCH) := es7000plat.o
>> Index: linux-2.6/arch/x86/mach-es7000/es7000plat.c
>> ===================================================================
>> --- linux-2.6.orig/arch/x86/mach-es7000/es7000plat.c
>> +++ linux-2.6/arch/x86/mach-es7000/es7000plat.c
>> @@ -177,53 +177,6 @@ find_unisys_acpi_oem_table(unsigned long
>> }
>> #endif
>>
>> -/*
>> - * This file also gets compiled if CONFIG_X86_GENERICARCH is set. Generic
>> - * arch already has got following function definitions (asm-generic/es7000.c)
>> - * hence no need to define these for that case.
>> - */
>> -#ifndef CONFIG_X86_GENERICARCH
>> -void es7000_sw_apic(void);
>> -void __init enable_apic_mode(void)
>> -{
>> - es7000_sw_apic();
>> - return;
>> -}
>> -
>> -__init int mps_oem_check(struct mp_config_table *mpc, char *oem,
>> - char *productid)
>> -{
>> - if (mpc->mpc_oemptr) {
>> - struct mp_config_oemtable *oem_table =
>> - (struct mp_config_oemtable *)mpc->mpc_oemptr;
>> - if (!strncmp(oem, "UNISYS", 6))
>> - return parse_unisys_oem((char *)oem_table);
>> - }
>> - return 0;
>> -}
>> -#ifdef CONFIG_ACPI
>> -/* Hook from generic ACPI tables.c */
>> -int __init acpi_madt_oem_check(char *oem_id, char *oem_table_id)
>> -{
>> - unsigned long oem_addr;
>> - if (!find_unisys_acpi_oem_table(&oem_addr)) {
>> - if (es7000_check_dsdt())
>> - return parse_unisys_oem((char *)oem_addr);
>> - else {
>> - setup_unisys();
>> - return 1;
>> - }
>> - }
>> - return 0;
>> -}
>> -#else
>> -int __init acpi_madt_oem_check(char *oem_id, char *oem_table_id)
>> -{
>> - return 0;
>> -}
>> -#endif
>> -#endif /* COFIG_X86_GENERICARCH */
>> -
>> static void
>> es7000_spin(int n)
>> {
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>> Please read the FAQ at http://www.tux.org/lkml/
>
> On the face of it the idea seems sound. The NUMAQ changes look ok on a
> quick scan. I will need to see this applied and tested to be sure its
> really sane.

thanks.

YH


\
 
 \ /
  Last update: 2008-06-09 20:03    [W:0.202 / U:0.088 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site