Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 89067
b: refs/heads/master
c: cc61503
h: refs/heads/master
i:
  89065: 42d1c3b
  89063: 4fa9885
v: v3
  • Loading branch information
Andi Kleen authored and Ingo Molnar committed Apr 17, 2008
1 parent 563a979 commit 4eb6d02
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 15 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 67794292c8615b05f46419ba8d4fd99e7c9a5db9
refs/heads/master: cc6150321903ca4c3bc9d53b0cdafb05d77d64d0
2 changes: 1 addition & 1 deletion trunk/arch/x86/kernel/setup_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -347,7 +347,7 @@ void __init setup_arch(char **cmdline_p)

check_efer();

init_memory_mapping(0, (max_pfn_mapped << PAGE_SHIFT));
max_pfn_mapped = init_memory_mapping(0, (max_pfn_mapped << PAGE_SHIFT));
if (efi_enabled)
efi_init();

Expand Down
34 changes: 23 additions & 11 deletions trunk/arch/x86/mm/init_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -313,7 +313,7 @@ __meminit void early_iounmap(void *addr, unsigned long size)
__flush_tlb_all();
}

static void __meminit
static unsigned long __meminit
phys_pmd_init(pmd_t *pmd_page, unsigned long address, unsigned long end)
{
int i = pmd_index(address);
Expand All @@ -335,21 +335,26 @@ phys_pmd_init(pmd_t *pmd_page, unsigned long address, unsigned long end)
set_pte((pte_t *)pmd,
pfn_pte(address >> PAGE_SHIFT, PAGE_KERNEL_LARGE));
}
return address;
}

static void __meminit
static unsigned long __meminit
phys_pmd_update(pud_t *pud, unsigned long address, unsigned long end)
{
pmd_t *pmd = pmd_offset(pud, 0);
unsigned long last_map_addr;

spin_lock(&init_mm.page_table_lock);
phys_pmd_init(pmd, address, end);
last_map_addr = phys_pmd_init(pmd, address, end);
spin_unlock(&init_mm.page_table_lock);
__flush_tlb_all();
return last_map_addr;
}

static void __meminit
static unsigned long __meminit
phys_pud_init(pud_t *pud_page, unsigned long addr, unsigned long end)
{
unsigned long last_map_addr = end;
int i = pud_index(addr);

for (; i < PTRS_PER_PUD; i++, addr = (addr & PUD_MASK) + PUD_SIZE) {
Expand All @@ -368,26 +373,29 @@ phys_pud_init(pud_t *pud_page, unsigned long addr, unsigned long end)

if (pud_val(*pud)) {
if (!pud_large(*pud))
phys_pmd_update(pud, addr, end);
last_map_addr = phys_pmd_update(pud, addr, end);
continue;
}

if (direct_gbpages) {
set_pte((pte_t *)pud,
pfn_pte(addr >> PAGE_SHIFT, PAGE_KERNEL_LARGE));
last_map_addr = (addr & PUD_MASK) + PUD_SIZE;
continue;
}

pmd = alloc_low_page(&pmd_phys);

spin_lock(&init_mm.page_table_lock);
set_pud(pud, __pud(pmd_phys | _KERNPG_TABLE));
phys_pmd_init(pmd, addr, end);
last_map_addr = phys_pmd_init(pmd, addr, end);
spin_unlock(&init_mm.page_table_lock);

unmap_low_page(pmd);
}
__flush_tlb_all();

return last_map_addr >> PAGE_SHIFT;
}

static void __init find_early_table_space(unsigned long end)
Expand Down Expand Up @@ -542,9 +550,9 @@ static void __init early_memtest(unsigned long start, unsigned long end)
* This runs before bootmem is initialized and gets pages directly from
* the physical memory. To access them they are temporarily mapped.
*/
void __init_refok init_memory_mapping(unsigned long start, unsigned long end)
unsigned long __init_refok init_memory_mapping(unsigned long start, unsigned long end)
{
unsigned long next;
unsigned long next, last_map_addr = end;
unsigned long start_phys = start, end_phys = end;

printk(KERN_INFO "init_memory_mapping\n");
Expand Down Expand Up @@ -577,7 +585,7 @@ void __init_refok init_memory_mapping(unsigned long start, unsigned long end)
next = start + PGDIR_SIZE;
if (next > end)
next = end;
phys_pud_init(pud, __pa(start), __pa(next));
last_map_addr = phys_pud_init(pud, __pa(start), __pa(next));
if (!after_bootmem)
set_pgd(pgd_offset_k(start), mk_kernel_pgd(pud_phys));
unmap_low_page(pud);
Expand All @@ -593,6 +601,8 @@ void __init_refok init_memory_mapping(unsigned long start, unsigned long end)

if (!after_bootmem)
early_memtest(start_phys, end_phys);

return last_map_addr;
}

#ifndef CONFIG_NUMA
Expand Down Expand Up @@ -632,11 +642,13 @@ int arch_add_memory(int nid, u64 start, u64 size)
{
struct pglist_data *pgdat = NODE_DATA(nid);
struct zone *zone = pgdat->node_zones + ZONE_NORMAL;
unsigned long start_pfn = start >> PAGE_SHIFT;
unsigned long last_mapped_pfn, start_pfn = start >> PAGE_SHIFT;
unsigned long nr_pages = size >> PAGE_SHIFT;
int ret;

init_memory_mapping(start, start + size-1);
last_mapped_pfn = init_memory_mapping(start, start + size-1);
if (last_mapped_pfn > max_pfn_mapped)
max_pfn_mapped = last_mapped_pfn;

ret = __add_pages(zone, start_pfn, nr_pages);
WARN_ON(1);
Expand Down
3 changes: 3 additions & 0 deletions trunk/include/asm-x86/page_64.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,9 @@ typedef struct { pteval_t pte; } pte_t;

#define vmemmap ((struct page *)VMEMMAP_START)

extern unsigned long init_memory_mapping(unsigned long start,
unsigned long end);

#endif /* !__ASSEMBLY__ */

#ifdef CONFIG_FLATMEM
Expand Down
2 changes: 0 additions & 2 deletions trunk/include/asm-x86/proto.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@

extern void early_idt_handler(void);

extern void init_memory_mapping(unsigned long start, unsigned long end);

extern void system_call(void);
extern void syscall_init(void);

Expand Down

0 comments on commit 4eb6d02

Please sign in to comment.