From b1fbc12473dc1097605b2837e85645a347513a4c Mon Sep 17 00:00:00 2001 From: dann frazier Date: Sun, 19 Jun 2005 06:25:57 +0000 Subject: [PATCH] copy ia64-generic-nosmp.patch into the unified source tree svn path=/branches/linux-kernel-2.6.12/; revision=3362 --- .../patches-debian/ia64-generic-nosmp.patch | 326 ++++++++++++++++++ 1 file changed, 326 insertions(+) create mode 100644 debian/patches-debian/ia64-generic-nosmp.patch diff --git a/debian/patches-debian/ia64-generic-nosmp.patch b/debian/patches-debian/ia64-generic-nosmp.patch new file mode 100644 index 000000000..de2135bdd --- /dev/null +++ b/debian/patches-debian/ia64-generic-nosmp.patch @@ -0,0 +1,326 @@ +#! /bin/sh -e +## DP: Description: Fix ia64 generic UP builds +## DP: Patch author: Jesse Barnes , dann frazier +## DP: Upstream status: Submitted + +. $(dirname $0)/DPATCH + +@DPATCH@ + +diff -urN linux-2.6.12.orig/arch/ia64/kernel/Makefile linux-2.6.12/arch/ia64/kernel/Makefile +--- linux-2.6.12.orig/arch/ia64/kernel/Makefile 2005-06-17 13:48:29.000000000 -0600 ++++ linux-2.6.12/arch/ia64/kernel/Makefile 2005-06-18 22:14:35.000000000 -0600 +@@ -17,6 +17,7 @@ + obj-$(CONFIG_IOSAPIC) += iosapic.o + obj-$(CONFIG_MODULES) += module.o + obj-$(CONFIG_SMP) += smp.o smpboot.o domain.o ++obj-$(CONFIG_NUMA) += numa.o + obj-$(CONFIG_PERFMON) += perfmon_default_smpl.o + obj-$(CONFIG_IA64_CYCLONE) += cyclone.o + obj-$(CONFIG_IA64_MCA_RECOVERY) += mca_recovery.o +diff -urN linux-2.6.12.orig/arch/ia64/kernel/acpi.c linux-2.6.12/arch/ia64/kernel/acpi.c +--- linux-2.6.12.orig/arch/ia64/kernel/acpi.c 2005-06-17 13:48:29.000000000 -0600 ++++ linux-2.6.12/arch/ia64/kernel/acpi.c 2005-06-18 22:14:35.000000000 -0600 +@@ -642,9 +642,11 @@ + if (smp_boot_data.cpu_phys_id[cpu] != hard_smp_processor_id()) + node_cpuid[i++].phys_id = smp_boot_data.cpu_phys_id[cpu]; + } +- build_cpu_to_node_map(); + # endif + #endif ++#ifdef CONFIG_ACPI_NUMA ++ build_cpu_to_node_map(); ++#endif + /* Make boot-up look pretty */ + printk(KERN_INFO "%d CPUs available, %d CPUs total\n", available_cpus, total_cpus); + return 0; +diff -urN linux-2.6.12.orig/arch/ia64/kernel/numa.c linux-2.6.12/arch/ia64/kernel/numa.c +--- linux-2.6.12.orig/arch/ia64/kernel/numa.c 1969-12-31 17:00:00.000000000 -0700 ++++ linux-2.6.12/arch/ia64/kernel/numa.c 2005-06-18 22:14:35.000000000 -0600 +@@ -0,0 +1,57 @@ ++/* ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ * ++ * ia64 kernel NUMA specific stuff ++ * ++ * Copyright (C) 2002 Erich Focht ++ * Copyright (C) 2004 Silicon Graphics, Inc. ++ * Jesse Barnes ++ */ ++#include ++#include ++#include ++#include ++#include ++ ++u8 cpu_to_node_map[NR_CPUS] __cacheline_aligned; ++EXPORT_SYMBOL(cpu_to_node_map); ++ ++cpumask_t node_to_cpu_mask[MAX_NUMNODES] __cacheline_aligned; ++ ++/** ++ * build_cpu_to_node_map - setup cpu to node and node to cpumask arrays ++ * ++ * Build cpu to node mapping and initialize the per node cpu masks using ++ * info from the node_cpuid array handed to us by ACPI. ++ */ ++void __init build_cpu_to_node_map(void) ++{ ++ int cpu, i, node; ++ ++ for(node=0; node < MAX_NUMNODES; node++) ++ cpus_clear(node_to_cpu_mask[node]); ++ ++ for(cpu = 0; cpu < NR_CPUS; ++cpu) { ++ node = -1; ++ for (i = 0; i < NR_CPUS; ++i) ++ if (cpu_physical_id(cpu) == node_cpuid[i].phys_id) { ++ node = node_cpuid[i].nid; ++ break; ++ } ++ cpu_to_node_map[cpu] = (node >= 0) ? node : 0; ++ if (node >= 0) ++ cpu_set(cpu, node_to_cpu_mask[node]); ++ } ++} +diff -urN linux-2.6.12.orig/arch/ia64/kernel/smpboot.c linux-2.6.12/arch/ia64/kernel/smpboot.c +--- linux-2.6.12.orig/arch/ia64/kernel/smpboot.c 2005-06-17 13:48:29.000000000 -0600 ++++ linux-2.6.12/arch/ia64/kernel/smpboot.c 2005-06-18 22:14:35.000000000 -0600 +@@ -524,47 +524,6 @@ + } + } + +-#ifdef CONFIG_NUMA +- +-/* on which node is each logical CPU (one cacheline even for 64 CPUs) */ +-u8 cpu_to_node_map[NR_CPUS] __cacheline_aligned; +-EXPORT_SYMBOL(cpu_to_node_map); +-/* which logical CPUs are on which nodes */ +-cpumask_t node_to_cpu_mask[MAX_NUMNODES] __cacheline_aligned; +- +-/* +- * Build cpu to node mapping and initialize the per node cpu masks. +- */ +-void __init +-build_cpu_to_node_map (void) +-{ +- int cpu, i, node; +- +- for(node=0; node= 0) ? node : 0; +- if (node >= 0) +- cpu_set(cpu, node_to_cpu_mask[node]); +- } +-} +- +-#endif /* CONFIG_NUMA */ +- + /* + * Cycle through the APs sending Wakeup IPIs to boot each. + */ +diff -urN linux-2.6.12.orig/arch/ia64/mm/discontig.c linux-2.6.12/arch/ia64/mm/discontig.c +--- linux-2.6.12.orig/arch/ia64/mm/discontig.c 2005-06-17 13:48:29.000000000 -0600 ++++ linux-2.6.12/arch/ia64/mm/discontig.c 2005-06-18 22:14:35.000000000 -0600 +@@ -274,6 +274,33 @@ + } + + /** ++ * per_cpu_node_setup - setup per-cpu areas on each node ++ * @cpu_data: per-cpu area on this node ++ * @node: node to setup ++ * ++ * Copy the static per-cpu data into the region we just set aside and then ++ * setup __per_cpu_offset for each CPU on this node. Return a pointer to ++ * the end of the area. ++ */ ++static void *per_cpu_node_setup(void *cpu_data, int node) ++{ ++#ifdef CONFIG_SMP ++ int cpu; ++ ++ for (cpu = 0; cpu < NR_CPUS; cpu++) { ++ if (node == node_cpuid[cpu].nid) { ++ memcpy(__va(cpu_data), __phys_per_cpu_start, ++ __per_cpu_end - __per_cpu_start); ++ __per_cpu_offset[cpu] = (char*)__va(cpu_data) - ++ __per_cpu_start; ++ cpu_data += PERCPU_PAGE_SIZE; ++ } ++ } ++#endif ++ return cpu_data; ++} ++ ++/** + * find_pernode_space - allocate memory for memory map and per-node structures + * @start: physical start of range + * @len: length of range +@@ -304,7 +331,7 @@ + static int __init find_pernode_space(unsigned long start, unsigned long len, + int node) + { +- unsigned long epfn, cpu, cpus, phys_cpus; ++ unsigned long epfn, cpus, phys_cpus; + unsigned long pernodesize = 0, pernode, pages, mapsize; + void *cpu_data; + struct bootmem_data *bdp = &mem_data[node].bootmem_data; +@@ -357,20 +384,7 @@ + mem_data[node].pgdat->bdata = bdp; + pernode += L1_CACHE_ALIGN(sizeof(pg_data_t)); + +- /* +- * Copy the static per-cpu data into the region we +- * just set aside and then setup __per_cpu_offset +- * for each CPU on this node. +- */ +- for (cpu = 0; cpu < NR_CPUS; cpu++) { +- if (node == node_cpuid[cpu].nid) { +- memcpy(__va(cpu_data), __phys_per_cpu_start, +- __per_cpu_end - __per_cpu_start); +- __per_cpu_offset[cpu] = (char*)__va(cpu_data) - +- __per_cpu_start; +- cpu_data += PERCPU_PAGE_SIZE; +- } +- } ++ cpu_data = per_cpu_node_setup(cpu_data, node); + } + + return 0; +@@ -436,8 +450,8 @@ + */ + static void __init initialize_pernode_data(void) + { +- int cpu, node; + pg_data_t *pgdat_list[MAX_NUMNODES]; ++ int cpu, node; + + for_each_online_node(node) + pgdat_list[node] = mem_data[node].pgdat; +@@ -447,12 +461,22 @@ + memcpy(mem_data[node].node_data->pg_data_ptrs, pgdat_list, + sizeof(pgdat_list)); + } +- ++#ifdef CONFIG_SMP + /* Set the node_data pointer for each per-cpu struct */ + for (cpu = 0; cpu < NR_CPUS; cpu++) { + node = node_cpuid[cpu].nid; + per_cpu(cpu_info, cpu).node_data = mem_data[node].node_data; + } ++#else ++ { ++ struct cpuinfo_ia64 *cpu0_cpu_info; ++ cpu = 0; ++ node = node_cpuid[cpu].nid; ++ cpu0_cpu_info = (struct cpuinfo_ia64 *)(__phys_per_cpu_start + ++ ((char *)&per_cpu__cpu_info - __per_cpu_start)); ++ cpu0_cpu_info->node_data = mem_data[node].node_data; ++ } ++#endif /* CONFIG_SMP */ + } + + /** +@@ -519,6 +543,7 @@ + find_initrd(); + } + ++#ifdef CONFIG_SMP + /** + * per_cpu_init - setup per-cpu variables + * +@@ -529,15 +554,15 @@ + { + int cpu; + +- if (smp_processor_id() == 0) { +- for (cpu = 0; cpu < NR_CPUS; cpu++) { +- per_cpu(local_per_cpu_offset, cpu) = +- __per_cpu_offset[cpu]; +- } +- } ++ if (smp_processor_id() != 0) ++ return __per_cpu_start + __per_cpu_offset[smp_processor_id()]; ++ ++ for (cpu = 0; cpu < NR_CPUS; cpu++) ++ per_cpu(local_per_cpu_offset, cpu) = __per_cpu_offset[cpu]; + + return __per_cpu_start + __per_cpu_offset[smp_processor_id()]; + } ++#endif /* CONFIG_SMP */ + + /** + * show_mem - give short summary of memory stats +diff -urN linux-2.6.12.orig/include/asm-ia64/smp.h.rej linux-2.6.12/include/asm-ia64/smp.h.rej +--- linux-2.6.12.orig/include/asm-ia64/smp.h.rej 1969-12-31 17:00:00.000000000 -0700 ++++ linux-2.6.12/include/asm-ia64/smp.h.rej 2005-06-18 22:14:35.000000000 -0600 +@@ -0,0 +1,16 @@ ++*************** ++*** 126,131 **** ++ #else ++ ++ #define cpu_logical_id(cpuid) 0 ++ ++ #endif /* CONFIG_SMP */ ++ #endif /* _ASM_IA64_SMP_H */ ++--- 126,132 ---- ++ #else ++ ++ #define cpu_logical_id(cpuid) 0 +++ #define cpu_physical_id(i) ((ia64_getreg(_IA64_REG_CR_LID) >> 16) & 0xffff) ++ ++ #endif /* CONFIG_SMP */ ++ #endif /* _ASM_IA64_SMP_H */ +diff -urN linux-2.6.12.orig/include/asm-ia64/sn/arch.h linux-2.6.12/include/asm-ia64/sn/arch.h +--- linux-2.6.12.orig/include/asm-ia64/sn/arch.h 2005-06-17 13:48:29.000000000 -0600 ++++ linux-2.6.12/include/asm-ia64/sn/arch.h 2005-06-18 22:15:39.000000000 -0600 +@@ -11,6 +11,7 @@ + #ifndef _ASM_IA64_SN_ARCH_H + #define _ASM_IA64_SN_ARCH_H + ++#include + #include + #include + #include +diff -urN linux-2.6.12.orig/include/asm-ia64/sn/sn_cpuid.h linux-2.6.12/include/asm-ia64/sn/sn_cpuid.h +--- linux-2.6.12.orig/include/asm-ia64/sn/sn_cpuid.h 2005-06-17 13:48:29.000000000 -0600 ++++ linux-2.6.12/include/asm-ia64/sn/sn_cpuid.h 2005-06-18 22:14:35.000000000 -0600 +@@ -81,11 +81,6 @@ + * + */ + +-#ifndef CONFIG_SMP +-#define cpu_physical_id(cpuid) ((ia64_getreg(_IA64_REG_CR_LID) >> 16) & 0xffff) +-#endif +- +- + #define get_node_number(addr) NASID_GET(addr) + + /*