提交 d1127e40 编写于 作者: 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] ioremap() should prefer WB over UC
  [IA64] Add __mca_table to the DISCARD list in gate.lds
  [IA64] Move __mca_table out of the __init section
  [IA64] simplify some condition checks in iosapic_check_gsi_range
  [IA64] correct some messages and fixes some minor things
  [IA64-SGI] fix for-loop in sn_hwperf_geoid_to_cnode()
  [IA64-SGI] sn_hwperf use of num_online_cpus()
  [IA64] optimize flush_tlb_range on large numa box
  [IA64] lazy_mmu_prot_update needs to be aware of huge pages
...@@ -59,6 +59,7 @@ SECTIONS ...@@ -59,6 +59,7 @@ SECTIONS
*(.dynbss) *(.dynbss)
*(.bss .bss.* .gnu.linkonce.b.*) *(.bss .bss.* .gnu.linkonce.b.*)
*(__ex_table) *(__ex_table)
*(__mca_table)
} }
} }
......
此差异已折叠。
...@@ -70,6 +70,15 @@ SECTIONS ...@@ -70,6 +70,15 @@ SECTIONS
__stop___ex_table = .; __stop___ex_table = .;
} }
/* MCA table */
. = ALIGN(16);
__mca_table : AT(ADDR(__mca_table) - LOAD_OFFSET)
{
__start___mca_table = .;
*(__mca_table)
__stop___mca_table = .;
}
/* Global data */ /* Global data */
_data = .; _data = .;
...@@ -130,15 +139,6 @@ SECTIONS ...@@ -130,15 +139,6 @@ SECTIONS
__initcall_end = .; __initcall_end = .;
} }
/* MCA table */
. = ALIGN(16);
__mca_table : AT(ADDR(__mca_table) - LOAD_OFFSET)
{
__start___mca_table = .;
*(__mca_table)
__stop___mca_table = .;
}
.data.patch.vtop : AT(ADDR(.data.patch.vtop) - LOAD_OFFSET) .data.patch.vtop : AT(ADDR(.data.patch.vtop) - LOAD_OFFSET)
{ {
__start___vtop_patchlist = .; __start___vtop_patchlist = .;
......
...@@ -109,6 +109,7 @@ lazy_mmu_prot_update (pte_t pte) ...@@ -109,6 +109,7 @@ lazy_mmu_prot_update (pte_t pte)
{ {
unsigned long addr; unsigned long addr;
struct page *page; struct page *page;
unsigned long order;
if (!pte_exec(pte)) if (!pte_exec(pte))
return; /* not an executable page... */ return; /* not an executable page... */
...@@ -119,7 +120,12 @@ lazy_mmu_prot_update (pte_t pte) ...@@ -119,7 +120,12 @@ lazy_mmu_prot_update (pte_t pte)
if (test_bit(PG_arch_1, &page->flags)) if (test_bit(PG_arch_1, &page->flags))
return; /* i-cache is already coherent with d-cache */ return; /* i-cache is already coherent with d-cache */
flush_icache_range(addr, addr + PAGE_SIZE); if (PageCompound(page)) {
order = (unsigned long) (page[1].lru.prev);
flush_icache_range(addr, addr + (1UL << order << PAGE_SHIFT));
}
else
flush_icache_range(addr, addr + PAGE_SIZE);
set_bit(PG_arch_1, &page->flags); /* mark page as clean */ set_bit(PG_arch_1, &page->flags); /* mark page as clean */
} }
......
...@@ -21,12 +21,12 @@ __ioremap (unsigned long offset, unsigned long size) ...@@ -21,12 +21,12 @@ __ioremap (unsigned long offset, unsigned long size)
void __iomem * void __iomem *
ioremap (unsigned long offset, unsigned long size) ioremap (unsigned long offset, unsigned long size)
{ {
if (efi_mem_attribute_range(offset, size, EFI_MEMORY_UC))
return __ioremap(offset, size);
if (efi_mem_attribute_range(offset, size, EFI_MEMORY_WB)) if (efi_mem_attribute_range(offset, size, EFI_MEMORY_WB))
return phys_to_virt(offset); return phys_to_virt(offset);
if (efi_mem_attribute_range(offset, size, EFI_MEMORY_UC))
return __ioremap(offset, size);
/* /*
* Someday this should check ACPI resources so we * Someday this should check ACPI resources so we
* can do the right thing for hot-plugged regions. * can do the right thing for hot-plugged regions.
......
...@@ -156,17 +156,19 @@ flush_tlb_range (struct vm_area_struct *vma, unsigned long start, ...@@ -156,17 +156,19 @@ flush_tlb_range (struct vm_area_struct *vma, unsigned long start,
nbits = purge.max_bits; nbits = purge.max_bits;
start &= ~((1UL << nbits) - 1); start &= ~((1UL << nbits) - 1);
# ifdef CONFIG_SMP
platform_global_tlb_purge(mm, start, end, nbits);
# else
preempt_disable(); preempt_disable();
#ifdef CONFIG_SMP
if (mm != current->active_mm || cpus_weight(mm->cpu_vm_mask) != 1) {
platform_global_tlb_purge(mm, start, end, nbits);
preempt_enable();
return;
}
#endif
do { do {
ia64_ptcl(start, (nbits<<2)); ia64_ptcl(start, (nbits<<2));
start += (1UL << nbits); start += (1UL << nbits);
} while (start < end); } while (start < end);
preempt_enable(); preempt_enable();
# endif
ia64_srlz_i(); /* srlz.i implies srlz.d */ ia64_srlz_i(); /* srlz.i implies srlz.d */
} }
EXPORT_SYMBOL(flush_tlb_range); EXPORT_SYMBOL(flush_tlb_range);
......
...@@ -110,7 +110,11 @@ static int sn_hwperf_geoid_to_cnode(char *location) ...@@ -110,7 +110,11 @@ static int sn_hwperf_geoid_to_cnode(char *location)
if (sn_hwperf_location_to_bpos(location, &rack, &bay, &slot, &slab)) if (sn_hwperf_location_to_bpos(location, &rack, &bay, &slot, &slab))
return -1; return -1;
for_each_node(cnode) { /*
* FIXME: replace with cleaner for_each_XXX macro which addresses
* both compute and IO nodes once ACPI3.0 is available.
*/
for (cnode = 0; cnode < num_cnodes; cnode++) {
geoid = cnodeid_get_geoid(cnode); geoid = cnodeid_get_geoid(cnode);
module_id = geo_module(geoid); module_id = geo_module(geoid);
this_rack = MODULE_GET_RACK(module_id); this_rack = MODULE_GET_RACK(module_id);
...@@ -605,7 +609,7 @@ static int sn_hwperf_op_cpu(struct sn_hwperf_op_info *op_info) ...@@ -605,7 +609,7 @@ static int sn_hwperf_op_cpu(struct sn_hwperf_op_info *op_info)
op_info->a->arg &= SN_HWPERF_ARG_OBJID_MASK; op_info->a->arg &= SN_HWPERF_ARG_OBJID_MASK;
if (cpu != SN_HWPERF_ARG_ANY_CPU) { if (cpu != SN_HWPERF_ARG_ANY_CPU) {
if (cpu >= num_online_cpus() || !cpu_online(cpu)) { if (cpu >= NR_CPUS || !cpu_online(cpu)) {
r = -EINVAL; r = -EINVAL;
goto out; goto out;
} }
......
...@@ -38,6 +38,10 @@ ...@@ -38,6 +38,10 @@
/* /*
* Helper macros for accessing user memory. * Helper macros for accessing user memory.
*
* When adding any new .section/.previous entries here, make sure to
* also add it to the DISCARD section in arch/ia64/kernel/gate.lds.S or
* unpleasant things will happen.
*/ */
.section "__ex_table", "a" // declare section & section attributes .section "__ex_table", "a" // declare section & section attributes
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册