Merge branch 'x86/for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'x86/for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: (821 commits) x86: make 64bit hpet_set_mapping to use ioremap too, v2 x86: get x86_phys_bits early x86: max_low_pfn_mapped fix #4 x86: change _node_to_cpumask_ptr to return const ptr x86: I/O APIC: remove an IRQ2-mask hack x86: fix numaq_tsc_disable calling x86, e820: remove end_user_pfn x86: max_low_pfn_mapped fix, #3 x86: max_low_pfn_mapped fix, #2 x86: max_low_pfn_mapped fix, #1 x86_64: fix delayed signals x86: remove conflicting nx6325 and nx6125 quirks x86: Recover timer_ack lost in the merge of the NMI watchdog x86: I/O APIC: Never configure IRQ2 x86: L-APIC: Always fully configure IRQ0 x86: L-APIC: Set IRQ0 as edge-triggered x86: merge dwarf2 headers x86: use AS_CFI instead of UNWIND_INFO x86: use ignore macro instead of hash comment x86: use matching CFI_ENDPROC ...
This commit is contained in:
@ -47,19 +47,17 @@ static void change_pte_range(struct mm_struct *mm, pmd_t *pmd,
|
||||
if (pte_present(oldpte)) {
|
||||
pte_t ptent;
|
||||
|
||||
/* Avoid an SMP race with hardware updated dirty/clean
|
||||
* bits by wiping the pte and then setting the new pte
|
||||
* into place.
|
||||
*/
|
||||
ptent = ptep_get_and_clear(mm, addr, pte);
|
||||
ptent = ptep_modify_prot_start(mm, addr, pte);
|
||||
ptent = pte_modify(ptent, newprot);
|
||||
|
||||
/*
|
||||
* Avoid taking write faults for pages we know to be
|
||||
* dirty.
|
||||
*/
|
||||
if (dirty_accountable && pte_dirty(ptent))
|
||||
ptent = pte_mkwrite(ptent);
|
||||
set_pte_at(mm, addr, pte, ptent);
|
||||
|
||||
ptep_modify_prot_commit(mm, addr, pte, ptent);
|
||||
#ifdef CONFIG_MIGRATION
|
||||
} else if (!pte_file(oldpte)) {
|
||||
swp_entry_t entry = pte_to_swp_entry(oldpte);
|
||||
|
@ -2929,6 +2929,18 @@ void __init free_bootmem_with_active_regions(int nid,
|
||||
}
|
||||
}
|
||||
|
||||
void __init work_with_active_regions(int nid, work_fn_t work_fn, void *data)
|
||||
{
|
||||
int i;
|
||||
int ret;
|
||||
|
||||
for_each_active_range_index_in_nid(i, nid) {
|
||||
ret = work_fn(early_node_map[i].start_pfn,
|
||||
early_node_map[i].end_pfn, data);
|
||||
if (ret)
|
||||
break;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* sparse_memory_present_with_active_regions - Call memory_present for each active range
|
||||
* @nid: The node to call memory_present for. If MAX_NUMNODES, all nodes will be used.
|
||||
@ -3461,6 +3473,11 @@ void __paginginit free_area_init_node(int nid, struct pglist_data *pgdat,
|
||||
calculate_node_totalpages(pgdat, zones_size, zholes_size);
|
||||
|
||||
alloc_node_mem_map(pgdat);
|
||||
#ifdef CONFIG_FLAT_NODE_MEM_MAP
|
||||
printk(KERN_DEBUG "free_area_init_node: node %d, pgdat %08lx, node_mem_map %08lx\n",
|
||||
nid, (unsigned long)pgdat,
|
||||
(unsigned long)pgdat->node_mem_map);
|
||||
#endif
|
||||
|
||||
free_area_init_core(pgdat, zones_size, zholes_size);
|
||||
}
|
||||
@ -3503,7 +3520,7 @@ void __init add_active_range(unsigned int nid, unsigned long start_pfn,
|
||||
{
|
||||
int i;
|
||||
|
||||
printk(KERN_DEBUG "Entering add_active_range(%d, %lu, %lu) "
|
||||
printk(KERN_DEBUG "Entering add_active_range(%d, %#lx, %#lx) "
|
||||
"%d entries of %d used\n",
|
||||
nid, start_pfn, end_pfn,
|
||||
nr_nodemap_entries, MAX_ACTIVE_REGIONS);
|
||||
@ -3547,27 +3564,68 @@ void __init add_active_range(unsigned int nid, unsigned long start_pfn,
|
||||
}
|
||||
|
||||
/**
|
||||
* shrink_active_range - Shrink an existing registered range of PFNs
|
||||
* remove_active_range - Shrink an existing registered range of PFNs
|
||||
* @nid: The node id the range is on that should be shrunk
|
||||
* @old_end_pfn: The old end PFN of the range
|
||||
* @new_end_pfn: The new PFN of the range
|
||||
* @start_pfn: The new PFN of the range
|
||||
* @end_pfn: The new PFN of the range
|
||||
*
|
||||
* i386 with NUMA use alloc_remap() to store a node_mem_map on a local node.
|
||||
* The map is kept at the end physical page range that has already been
|
||||
* registered with add_active_range(). This function allows an arch to shrink
|
||||
* an existing registered range.
|
||||
* The map is kept near the end physical page range that has already been
|
||||
* registered. This function allows an arch to shrink an existing registered
|
||||
* range.
|
||||
*/
|
||||
void __init shrink_active_range(unsigned int nid, unsigned long old_end_pfn,
|
||||
unsigned long new_end_pfn)
|
||||
void __init remove_active_range(unsigned int nid, unsigned long start_pfn,
|
||||
unsigned long end_pfn)
|
||||
{
|
||||
int i;
|
||||
int i, j;
|
||||
int removed = 0;
|
||||
|
||||
printk(KERN_DEBUG "remove_active_range (%d, %lu, %lu)\n",
|
||||
nid, start_pfn, end_pfn);
|
||||
|
||||
/* Find the old active region end and shrink */
|
||||
for_each_active_range_index_in_nid(i, nid)
|
||||
if (early_node_map[i].end_pfn == old_end_pfn) {
|
||||
early_node_map[i].end_pfn = new_end_pfn;
|
||||
break;
|
||||
for_each_active_range_index_in_nid(i, nid) {
|
||||
if (early_node_map[i].start_pfn >= start_pfn &&
|
||||
early_node_map[i].end_pfn <= end_pfn) {
|
||||
/* clear it */
|
||||
early_node_map[i].start_pfn = 0;
|
||||
early_node_map[i].end_pfn = 0;
|
||||
removed = 1;
|
||||
continue;
|
||||
}
|
||||
if (early_node_map[i].start_pfn < start_pfn &&
|
||||
early_node_map[i].end_pfn > start_pfn) {
|
||||
unsigned long temp_end_pfn = early_node_map[i].end_pfn;
|
||||
early_node_map[i].end_pfn = start_pfn;
|
||||
if (temp_end_pfn > end_pfn)
|
||||
add_active_range(nid, end_pfn, temp_end_pfn);
|
||||
continue;
|
||||
}
|
||||
if (early_node_map[i].start_pfn >= start_pfn &&
|
||||
early_node_map[i].end_pfn > end_pfn &&
|
||||
early_node_map[i].start_pfn < end_pfn) {
|
||||
early_node_map[i].start_pfn = end_pfn;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (!removed)
|
||||
return;
|
||||
|
||||
/* remove the blank ones */
|
||||
for (i = nr_nodemap_entries - 1; i > 0; i--) {
|
||||
if (early_node_map[i].nid != nid)
|
||||
continue;
|
||||
if (early_node_map[i].end_pfn)
|
||||
continue;
|
||||
/* we found it, get rid of it */
|
||||
for (j = i; j < nr_nodemap_entries - 1; j++)
|
||||
memcpy(&early_node_map[j], &early_node_map[j+1],
|
||||
sizeof(early_node_map[j]));
|
||||
j = nr_nodemap_entries - 1;
|
||||
memset(&early_node_map[j], 0, sizeof(early_node_map[j]));
|
||||
nr_nodemap_entries--;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -3611,7 +3669,7 @@ static void __init sort_node_map(void)
|
||||
}
|
||||
|
||||
/* Find the lowest pfn for a node */
|
||||
unsigned long __init find_min_pfn_for_node(unsigned long nid)
|
||||
unsigned long __init find_min_pfn_for_node(int nid)
|
||||
{
|
||||
int i;
|
||||
unsigned long min_pfn = ULONG_MAX;
|
||||
@ -3622,7 +3680,7 @@ unsigned long __init find_min_pfn_for_node(unsigned long nid)
|
||||
|
||||
if (min_pfn == ULONG_MAX) {
|
||||
printk(KERN_WARNING
|
||||
"Could not find start_pfn for node %lu\n", nid);
|
||||
"Could not find start_pfn for node %d\n", nid);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -3878,7 +3936,7 @@ void __init free_area_init_nodes(unsigned long *max_zone_pfn)
|
||||
for (i = 0; i < MAX_NR_ZONES; i++) {
|
||||
if (i == ZONE_MOVABLE)
|
||||
continue;
|
||||
printk(" %-8s %8lu -> %8lu\n",
|
||||
printk(" %-8s %0#10lx -> %0#10lx\n",
|
||||
zone_names[i],
|
||||
arch_zone_lowest_possible_pfn[i],
|
||||
arch_zone_highest_possible_pfn[i]);
|
||||
@ -3894,7 +3952,7 @@ void __init free_area_init_nodes(unsigned long *max_zone_pfn)
|
||||
/* Print out the early_node_map[] */
|
||||
printk("early_node_map[%d] active PFN ranges\n", nr_nodemap_entries);
|
||||
for (i = 0; i < nr_nodemap_entries; i++)
|
||||
printk(" %3d: %8lu -> %8lu\n", early_node_map[i].nid,
|
||||
printk(" %3d: %0#10lx -> %0#10lx\n", early_node_map[i].nid,
|
||||
early_node_map[i].start_pfn,
|
||||
early_node_map[i].end_pfn);
|
||||
|
||||
|
Reference in New Issue
Block a user