提交 33ae0cdd 编写于 作者: L Linus Torvalds

Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6

* 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6:
  [IA64] Provide ACPI fixup for /proc/cpuinfo/physical_id
  [IA64] Remove printk noise on unimplemented SAL_PHYSICAL_ID_INFO
  [IA64] allocate multiple contiguous pages via uncached allocator
  [IA64] bugfix: nptcg breaks cpu-hotadd
...@@ -873,7 +873,8 @@ identify_siblings(struct cpuinfo_ia64 *c) ...@@ -873,7 +873,8 @@ identify_siblings(struct cpuinfo_ia64 *c)
u16 pltid; u16 pltid;
pal_logical_to_physical_t info; pal_logical_to_physical_t info;
if ((status = ia64_pal_logical_to_phys(-1, &info)) != PAL_STATUS_SUCCESS) { status = ia64_pal_logical_to_phys(-1, &info);
if (status != PAL_STATUS_SUCCESS) {
if (status != PAL_STATUS_UNIMPLEMENTED) { if (status != PAL_STATUS_UNIMPLEMENTED) {
printk(KERN_ERR printk(KERN_ERR
"ia64_pal_logical_to_phys failed with %ld\n", "ia64_pal_logical_to_phys failed with %ld\n",
...@@ -885,8 +886,13 @@ identify_siblings(struct cpuinfo_ia64 *c) ...@@ -885,8 +886,13 @@ identify_siblings(struct cpuinfo_ia64 *c)
info.overview_cpp = 1; info.overview_cpp = 1;
info.overview_tpc = 1; info.overview_tpc = 1;
} }
if ((status = ia64_sal_physical_id_info(&pltid)) != PAL_STATUS_SUCCESS) {
printk(KERN_ERR "ia64_sal_pltid failed with %ld\n", status); status = ia64_sal_physical_id_info(&pltid);
if (status != PAL_STATUS_SUCCESS) {
if (status != PAL_STATUS_UNIMPLEMENTED)
printk(KERN_ERR
"ia64_sal_pltid failed with %ld\n",
status);
return; return;
} }
......
...@@ -27,6 +27,15 @@ ...@@ -27,6 +27,15 @@
static struct ia64_cpu *sysfs_cpus; static struct ia64_cpu *sysfs_cpus;
void arch_fix_phys_package_id(int num, u32 slot)
{
#ifdef CONFIG_SMP
if (cpu_data(num)->socket_id == -1)
cpu_data(num)->socket_id = slot;
#endif
}
EXPORT_SYMBOL_GPL(arch_fix_phys_package_id);
int arch_register_cpu(int num) int arch_register_cpu(int num)
{ {
#if defined (CONFIG_ACPI) && defined (CONFIG_HOTPLUG_CPU) #if defined (CONFIG_ACPI) && defined (CONFIG_HOTPLUG_CPU)
......
/* /*
* Copyright (C) 2001-2006 Silicon Graphics, Inc. All rights reserved. * Copyright (C) 2001-2008 Silicon Graphics, Inc. All rights reserved.
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms of version 2 of the GNU General Public License * under the terms of version 2 of the GNU General Public License
...@@ -177,12 +177,13 @@ static int uncached_add_chunk(struct uncached_pool *uc_pool, int nid) ...@@ -177,12 +177,13 @@ static int uncached_add_chunk(struct uncached_pool *uc_pool, int nid)
* uncached_alloc_page * uncached_alloc_page
* *
* @starting_nid: node id of node to start with, or -1 * @starting_nid: node id of node to start with, or -1
* @n_pages: number of contiguous pages to allocate
* *
* Allocate 1 uncached page. Allocates on the requested node. If no * Allocate the specified number of contiguous uncached pages on the
* uncached pages are available on the requested node, roundrobin starting * the requested node. If not enough contiguous uncached pages are available
* with the next higher node. * on the requested node, roundrobin starting with the next higher node.
*/ */
unsigned long uncached_alloc_page(int starting_nid) unsigned long uncached_alloc_page(int starting_nid, int n_pages)
{ {
unsigned long uc_addr; unsigned long uc_addr;
struct uncached_pool *uc_pool; struct uncached_pool *uc_pool;
...@@ -202,7 +203,8 @@ unsigned long uncached_alloc_page(int starting_nid) ...@@ -202,7 +203,8 @@ unsigned long uncached_alloc_page(int starting_nid)
if (uc_pool->pool == NULL) if (uc_pool->pool == NULL)
continue; continue;
do { do {
uc_addr = gen_pool_alloc(uc_pool->pool, PAGE_SIZE); uc_addr = gen_pool_alloc(uc_pool->pool,
n_pages * PAGE_SIZE);
if (uc_addr != 0) if (uc_addr != 0)
return uc_addr; return uc_addr;
} while (uncached_add_chunk(uc_pool, nid) == 0); } while (uncached_add_chunk(uc_pool, nid) == 0);
...@@ -217,11 +219,12 @@ EXPORT_SYMBOL(uncached_alloc_page); ...@@ -217,11 +219,12 @@ EXPORT_SYMBOL(uncached_alloc_page);
/* /*
* uncached_free_page * uncached_free_page
* *
* @uc_addr: uncached address of page to free * @uc_addr: uncached address of first page to free
* @n_pages: number of contiguous pages to free
* *
* Free a single uncached page. * Free the specified number of uncached pages.
*/ */
void uncached_free_page(unsigned long uc_addr) void uncached_free_page(unsigned long uc_addr, int n_pages)
{ {
int nid = paddr_to_nid(uc_addr - __IA64_UNCACHED_OFFSET); int nid = paddr_to_nid(uc_addr - __IA64_UNCACHED_OFFSET);
struct gen_pool *pool = uncached_pools[nid].pool; struct gen_pool *pool = uncached_pools[nid].pool;
...@@ -232,7 +235,7 @@ void uncached_free_page(unsigned long uc_addr) ...@@ -232,7 +235,7 @@ void uncached_free_page(unsigned long uc_addr)
if ((uc_addr & (0XFUL << 60)) != __IA64_UNCACHED_OFFSET) if ((uc_addr & (0XFUL << 60)) != __IA64_UNCACHED_OFFSET)
panic("uncached_free_page invalid address %lx\n", uc_addr); panic("uncached_free_page invalid address %lx\n", uc_addr);
gen_pool_free(pool, uc_addr, PAGE_SIZE); gen_pool_free(pool, uc_addr, n_pages * PAGE_SIZE);
} }
EXPORT_SYMBOL(uncached_free_page); EXPORT_SYMBOL(uncached_free_page);
......
...@@ -168,7 +168,10 @@ setup_ptcg_sem(int max_purges, int nptcg_from) ...@@ -168,7 +168,10 @@ setup_ptcg_sem(int max_purges, int nptcg_from)
static int firstcpu = 1; static int firstcpu = 1;
if (toolatetochangeptcgsem) { if (toolatetochangeptcgsem) {
BUG_ON(max_purges < nptcg); if (nptcg_from == NPTCG_FROM_PAL && max_purges == 0)
BUG_ON(1 < nptcg);
else
BUG_ON(max_purges < nptcg);
return; return;
} }
......
...@@ -603,6 +603,15 @@ static int acpi_processor_get_info(struct acpi_processor *pr, unsigned has_uid) ...@@ -603,6 +603,15 @@ static int acpi_processor_get_info(struct acpi_processor *pr, unsigned has_uid)
request_region(pr->throttling.address, 6, "ACPI CPU throttle"); request_region(pr->throttling.address, 6, "ACPI CPU throttle");
} }
/*
* If ACPI describes a slot number for this CPU, we can use it
* ensure we get the right value in the "physical id" field
* of /proc/cpuinfo
*/
status = acpi_evaluate_object(pr->handle, "_SUN", NULL, &buffer);
if (ACPI_SUCCESS(status))
arch_fix_phys_package_id(pr->id, object.integer.value);
return 0; return 0;
} }
......
...@@ -180,7 +180,7 @@ mspec_close(struct vm_area_struct *vma) ...@@ -180,7 +180,7 @@ mspec_close(struct vm_area_struct *vma)
my_page = vdata->maddr[index]; my_page = vdata->maddr[index];
vdata->maddr[index] = 0; vdata->maddr[index] = 0;
if (!mspec_zero_block(my_page, PAGE_SIZE)) if (!mspec_zero_block(my_page, PAGE_SIZE))
uncached_free_page(my_page); uncached_free_page(my_page, 1);
else else
printk(KERN_WARNING "mspec_close(): " printk(KERN_WARNING "mspec_close(): "
"failed to zero page %ld\n", my_page); "failed to zero page %ld\n", my_page);
...@@ -209,7 +209,7 @@ mspec_nopfn(struct vm_area_struct *vma, unsigned long address) ...@@ -209,7 +209,7 @@ mspec_nopfn(struct vm_area_struct *vma, unsigned long address)
index = (address - vdata->vm_start) >> PAGE_SHIFT; index = (address - vdata->vm_start) >> PAGE_SHIFT;
maddr = (volatile unsigned long) vdata->maddr[index]; maddr = (volatile unsigned long) vdata->maddr[index];
if (maddr == 0) { if (maddr == 0) {
maddr = uncached_alloc_page(numa_node_id()); maddr = uncached_alloc_page(numa_node_id(), 1);
if (maddr == 0) if (maddr == 0)
return NOPFN_OOM; return NOPFN_OOM;
...@@ -218,7 +218,7 @@ mspec_nopfn(struct vm_area_struct *vma, unsigned long address) ...@@ -218,7 +218,7 @@ mspec_nopfn(struct vm_area_struct *vma, unsigned long address)
vdata->count++; vdata->count++;
vdata->maddr[index] = maddr; vdata->maddr[index] = maddr;
} else { } else {
uncached_free_page(maddr); uncached_free_page(maddr, 1);
maddr = vdata->maddr[index]; maddr = vdata->maddr[index];
} }
spin_unlock(&vdata->lock); spin_unlock(&vdata->lock);
...@@ -367,7 +367,7 @@ mspec_init(void) ...@@ -367,7 +367,7 @@ mspec_init(void)
int nasid; int nasid;
unsigned long phys; unsigned long phys;
scratch_page[nid] = uncached_alloc_page(nid); scratch_page[nid] = uncached_alloc_page(nid, 1);
if (scratch_page[nid] == 0) if (scratch_page[nid] == 0)
goto free_scratch_pages; goto free_scratch_pages;
phys = __pa(scratch_page[nid]); phys = __pa(scratch_page[nid]);
...@@ -414,7 +414,7 @@ mspec_init(void) ...@@ -414,7 +414,7 @@ mspec_init(void)
free_scratch_pages: free_scratch_pages:
for_each_node(nid) { for_each_node(nid) {
if (scratch_page[nid] != 0) if (scratch_page[nid] != 0)
uncached_free_page(scratch_page[nid]); uncached_free_page(scratch_page[nid], 1);
} }
return ret; return ret;
} }
...@@ -431,7 +431,7 @@ mspec_exit(void) ...@@ -431,7 +431,7 @@ mspec_exit(void)
for_each_node(nid) { for_each_node(nid) {
if (scratch_page[nid] != 0) if (scratch_page[nid] != 0)
uncached_free_page(scratch_page[nid]); uncached_free_page(scratch_page[nid], 1);
} }
} }
} }
......
...@@ -211,7 +211,7 @@ xpc_rsvd_page_init(void) ...@@ -211,7 +211,7 @@ xpc_rsvd_page_init(void)
*/ */
amos_page = xpc_vars->amos_page; amos_page = xpc_vars->amos_page;
if (amos_page == NULL) { if (amos_page == NULL) {
amos_page = (AMO_t *)TO_AMO(uncached_alloc_page(0)); amos_page = (AMO_t *)TO_AMO(uncached_alloc_page(0, 1));
if (amos_page == NULL) { if (amos_page == NULL) {
dev_err(xpc_part, "can't allocate page of AMOs\n"); dev_err(xpc_part, "can't allocate page of AMOs\n");
return NULL; return NULL;
...@@ -230,7 +230,7 @@ xpc_rsvd_page_init(void) ...@@ -230,7 +230,7 @@ xpc_rsvd_page_init(void)
dev_err(xpc_part, "can't change memory " dev_err(xpc_part, "can't change memory "
"protections\n"); "protections\n");
uncached_free_page(__IA64_UNCACHED_OFFSET | uncached_free_page(__IA64_UNCACHED_OFFSET |
TO_PHYS((u64)amos_page)); TO_PHYS((u64)amos_page), 1);
return NULL; return NULL;
} }
} }
......
...@@ -116,6 +116,8 @@ void build_cpu_to_node_map(void); ...@@ -116,6 +116,8 @@ void build_cpu_to_node_map(void);
#define smt_capable() (smp_num_siblings > 1) #define smt_capable() (smp_num_siblings > 1)
#endif #endif
extern void arch_fix_phys_package_id(int num, u32 slot);
#define pcibus_to_cpumask(bus) (pcibus_to_node(bus) == -1 ? \ #define pcibus_to_cpumask(bus) (pcibus_to_node(bus) == -1 ? \
CPU_MASK_ALL : \ CPU_MASK_ALL : \
node_to_cpumask(pcibus_to_node(bus)) \ node_to_cpumask(pcibus_to_node(bus)) \
......
/* /*
* Copyright (C) 2001-2005 Silicon Graphics, Inc. All rights reserved. * Copyright (C) 2001-2008 Silicon Graphics, Inc. All rights reserved.
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms of version 2 of the GNU General Public License * under the terms of version 2 of the GNU General Public License
...@@ -8,5 +8,5 @@ ...@@ -8,5 +8,5 @@
* Prototypes for the uncached page allocator * Prototypes for the uncached page allocator
*/ */
extern unsigned long uncached_alloc_page(int nid); extern unsigned long uncached_alloc_page(int starting_nid, int n_pages);
extern void uncached_free_page(unsigned long); extern void uncached_free_page(unsigned long uc_addr, int n_pages);
...@@ -193,6 +193,10 @@ extern cpumask_t cpu_coregroup_map(int cpu); ...@@ -193,6 +193,10 @@ extern cpumask_t cpu_coregroup_map(int cpu);
#define topology_thread_siblings(cpu) (per_cpu(cpu_sibling_map, cpu)) #define topology_thread_siblings(cpu) (per_cpu(cpu_sibling_map, cpu))
#endif #endif
static inline void arch_fix_phys_package_id(int num, u32 slot)
{
}
struct pci_bus; struct pci_bus;
void set_pci_bus_resources_arch_default(struct pci_bus *b); void set_pci_bus_resources_arch_default(struct pci_bus *b);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册