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
This commit is contained in:
@@ -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)
|
|||||||
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 @@
|
|||||||
|
|
||||||
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)
|
||||||
|
|||||||
+13
-10
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* 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 @@ failed:
|
|||||||
* 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)
|
|||||||
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);
|
|||||||
/*
|
/*
|
||||||
* 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)
|
|||||||
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,6 +168,9 @@ setup_ptcg_sem(int max_purges, int nptcg_from)
|
|||||||
static int firstcpu = 1;
|
static int firstcpu = 1;
|
||||||
|
|
||||||
if (toolatetochangeptcgsem) {
|
if (toolatetochangeptcgsem) {
|
||||||
|
if (nptcg_from == NPTCG_FROM_PAL && max_purges == 0)
|
||||||
|
BUG_ON(1 < nptcg);
|
||||||
|
else
|
||||||
BUG_ON(max_purges < nptcg);
|
BUG_ON(max_purges < nptcg);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
*/
|
*/
|
||||||
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)
|
|||||||
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);
|
|||||||
#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)) \
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* 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 @@
|
|||||||
* 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);
|
|||||||
#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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user