Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 365415
b: refs/heads/master
c: 0aad818
h: refs/heads/master
i:
  365413: 727d5f2
  365411: 23d80e2
  365407: a7bd890
v: v3
  • Loading branch information
Johannes Weiner authored and Linus Torvalds committed Apr 29, 2013
1 parent f1e5ffa commit 1df9ffb
Show file tree
Hide file tree
Showing 10 changed files with 50 additions and 57 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: 055e4fd96e95b0eee0d92fd54a26be7f0d3bcad0
refs/heads/master: 0aad818b2de455f1bfd7ef87c28cdbbaaed9a699
13 changes: 5 additions & 8 deletions trunk/arch/arm64/mm/mmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -391,17 +391,14 @@ int kern_addr_valid(unsigned long addr)
}
#ifdef CONFIG_SPARSEMEM_VMEMMAP
#ifdef CONFIG_ARM64_64K_PAGES
int __meminit vmemmap_populate(struct page *start_page,
unsigned long size, int node)
int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node)
{
return vmemmap_populate_basepages(start_page, size, node);
return vmemmap_populate_basepages(start, end, node);
}
#else /* !CONFIG_ARM64_64K_PAGES */
int __meminit vmemmap_populate(struct page *start_page,
unsigned long size, int node)
int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node)
{
unsigned long addr = (unsigned long)start_page;
unsigned long end = (unsigned long)(start_page + size);
unsigned long addr = start;
unsigned long next;
pgd_t *pgd;
pud_t *pud;
Expand Down Expand Up @@ -434,7 +431,7 @@ int __meminit vmemmap_populate(struct page *start_page,
return 0;
}
#endif /* CONFIG_ARM64_64K_PAGES */
void vmemmap_free(struct page *memmap, unsigned long nr_pages)
void vmemmap_free(unsigned long start, unsigned long end)
{
}
#endif /* CONFIG_SPARSEMEM_VMEMMAP */
7 changes: 3 additions & 4 deletions trunk/arch/ia64/mm/discontig.c
Original file line number Diff line number Diff line change
Expand Up @@ -819,13 +819,12 @@ void arch_refresh_nodedata(int update_node, pg_data_t *update_pgdat)
#endif

#ifdef CONFIG_SPARSEMEM_VMEMMAP
int __meminit vmemmap_populate(struct page *start_page,
unsigned long size, int node)
int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node)
{
return vmemmap_populate_basepages(start_page, size, node);
return vmemmap_populate_basepages(start, end, node);
}

void vmemmap_free(struct page *memmap, unsigned long nr_pages)
void vmemmap_free(unsigned long start, unsigned long end)
{
}
#endif
11 changes: 3 additions & 8 deletions trunk/arch/powerpc/mm/init_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -263,19 +263,14 @@ static __meminit void vmemmap_list_populate(unsigned long phys,
vmemmap_list = vmem_back;
}

int __meminit vmemmap_populate(struct page *start_page,
unsigned long nr_pages, int node)
int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node)
{
unsigned long start = (unsigned long)start_page;
unsigned long end = (unsigned long)(start_page + nr_pages);
unsigned long page_size = 1 << mmu_psize_defs[mmu_vmemmap_psize].shift;

/* Align to the page size of the linear mapping. */
start = _ALIGN_DOWN(start, page_size);

pr_debug("vmemmap_populate page %p, %ld pages, node %d\n",
start_page, nr_pages, node);
pr_debug(" -> map %lx..%lx\n", start, end);
pr_debug("vmemmap_populate %lx..%lx, node %d\n", start, end, node);

for (; start < end; start += page_size) {
void *p;
Expand All @@ -298,7 +293,7 @@ int __meminit vmemmap_populate(struct page *start_page,
return 0;
}

void vmemmap_free(struct page *memmap, unsigned long nr_pages)
void vmemmap_free(unsigned long start, unsigned long end)
{
}

Expand Down
15 changes: 6 additions & 9 deletions trunk/arch/s390/mm/vmem.c
Original file line number Diff line number Diff line change
Expand Up @@ -191,19 +191,16 @@ static void vmem_remove_range(unsigned long start, unsigned long size)
/*
* Add a backed mem_map array to the virtual mem_map array.
*/
int __meminit vmemmap_populate(struct page *start, unsigned long nr, int node)
int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node)
{
unsigned long address, start_addr, end_addr;
unsigned long address = start;
pgd_t *pg_dir;
pud_t *pu_dir;
pmd_t *pm_dir;
pte_t *pt_dir;
int ret = -ENOMEM;

start_addr = (unsigned long) start;
end_addr = (unsigned long) (start + nr);

for (address = start_addr; address < end_addr;) {
for (address = start; address < end;) {
pg_dir = pgd_offset_k(address);
if (pgd_none(*pg_dir)) {
pu_dir = vmem_pud_alloc();
Expand Down Expand Up @@ -262,14 +259,14 @@ int __meminit vmemmap_populate(struct page *start, unsigned long nr, int node)
}
address += PAGE_SIZE;
}
memset(start, 0, nr * sizeof(struct page));
memset((void *)start, 0, end - start);
ret = 0;
out:
flush_tlb_kernel_range(start_addr, end_addr);
flush_tlb_kernel_range(start, end);
return ret;
}

void vmemmap_free(struct page *memmap, unsigned long nr_pages)
void vmemmap_free(unsigned long start, unsigned long end)
{
}

Expand Down
7 changes: 3 additions & 4 deletions trunk/arch/sparc/mm/init_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -2181,10 +2181,9 @@ unsigned long vmemmap_table[VMEMMAP_SIZE];
static long __meminitdata addr_start, addr_end;
static int __meminitdata node_start;

int __meminit vmemmap_populate(struct page *start, unsigned long nr, int node)
int __meminit vmemmap_populate(unsigned long vstart, unsigned long vend,
int node)
{
unsigned long vstart = (unsigned long) start;
unsigned long vend = (unsigned long) (start + nr);
unsigned long phys_start = (vstart - VMEMMAP_BASE);
unsigned long phys_end = (vend - VMEMMAP_BASE);
unsigned long addr = phys_start & VMEMMAP_CHUNK_MASK;
Expand Down Expand Up @@ -2236,7 +2235,7 @@ void __meminit vmemmap_populate_print_last(void)
}
}

void vmemmap_free(struct page *memmap, unsigned long nr_pages)
void vmemmap_free(unsigned long start, unsigned long end)
{
}

Expand Down
15 changes: 5 additions & 10 deletions trunk/arch/x86/mm/init_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -1011,11 +1011,8 @@ remove_pagetable(unsigned long start, unsigned long end, bool direct)
flush_tlb_all();
}

void __ref vmemmap_free(struct page *memmap, unsigned long nr_pages)
void __ref vmemmap_free(unsigned long start, unsigned long end)
{
unsigned long start = (unsigned long)memmap;
unsigned long end = (unsigned long)(memmap + nr_pages);

remove_pagetable(start, end, false);
}

Expand Down Expand Up @@ -1284,17 +1281,15 @@ static long __meminitdata addr_start, addr_end;
static void __meminitdata *p_start, *p_end;
static int __meminitdata node_start;

int __meminit
vmemmap_populate(struct page *start_page, unsigned long size, int node)
int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node)
{
unsigned long addr = (unsigned long)start_page;
unsigned long end = (unsigned long)(start_page + size);
unsigned long addr;
unsigned long next;
pgd_t *pgd;
pud_t *pud;
pmd_t *pmd;

for (; addr < end; addr = next) {
for (addr = start; addr < end; addr = next) {
void *p = NULL;

pgd = vmemmap_pgd_populate(addr, node);
Expand Down Expand Up @@ -1351,7 +1346,7 @@ vmemmap_populate(struct page *start_page, unsigned long size, int node)
}

}
sync_global_pgds((unsigned long)start_page, end - 1);
sync_global_pgds(start, end - 1);
return 0;
}

Expand Down
8 changes: 4 additions & 4 deletions trunk/include/linux/mm.h
Original file line number Diff line number Diff line change
Expand Up @@ -1764,12 +1764,12 @@ pte_t *vmemmap_pte_populate(pmd_t *pmd, unsigned long addr, int node);
void *vmemmap_alloc_block(unsigned long size, int node);
void *vmemmap_alloc_block_buf(unsigned long size, int node);
void vmemmap_verify(pte_t *, int, unsigned long, unsigned long);
int vmemmap_populate_basepages(struct page *start_page,
unsigned long pages, int node);
int vmemmap_populate(struct page *start_page, unsigned long pages, int node);
int vmemmap_populate_basepages(unsigned long start, unsigned long end,
int node);
int vmemmap_populate(unsigned long start, unsigned long end, int node);
void vmemmap_populate_print_last(void);
#ifdef CONFIG_MEMORY_HOTPLUG
void vmemmap_free(struct page *memmap, unsigned long nr_pages);
void vmemmap_free(unsigned long start, unsigned long end);
#endif
void register_page_bootmem_memmap(unsigned long section_nr, struct page *map,
unsigned long size);
Expand Down
19 changes: 12 additions & 7 deletions trunk/mm/sparse-vmemmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -147,11 +147,10 @@ pgd_t * __meminit vmemmap_pgd_populate(unsigned long addr, int node)
return pgd;
}

int __meminit vmemmap_populate_basepages(struct page *start_page,
unsigned long size, int node)
int __meminit vmemmap_populate_basepages(unsigned long start,
unsigned long end, int node)
{
unsigned long addr = (unsigned long)start_page;
unsigned long end = (unsigned long)(start_page + size);
unsigned long addr = start;
pgd_t *pgd;
pud_t *pud;
pmd_t *pmd;
Expand All @@ -178,9 +177,15 @@ int __meminit vmemmap_populate_basepages(struct page *start_page,

struct page * __meminit sparse_mem_map_populate(unsigned long pnum, int nid)
{
struct page *map = pfn_to_page(pnum * PAGES_PER_SECTION);
int error = vmemmap_populate(map, PAGES_PER_SECTION, nid);
if (error)
unsigned long start;
unsigned long end;
struct page *map;

map = pfn_to_page(pnum * PAGES_PER_SECTION);
start = (unsigned long)map;
end = (unsigned long)(map + PAGES_PER_SECTION);

if (vmemmap_populate(start, end, nid))
return NULL;

return map;
Expand Down
10 changes: 8 additions & 2 deletions trunk/mm/sparse.c
Original file line number Diff line number Diff line change
Expand Up @@ -615,11 +615,17 @@ static inline struct page *kmalloc_section_memmap(unsigned long pnum, int nid,
}
static void __kfree_section_memmap(struct page *memmap, unsigned long nr_pages)
{
vmemmap_free(memmap, nr_pages);
unsigned long start = (unsigned long)memmap;
unsigned long end = (unsigned long)(memmap + nr_pages);

vmemmap_free(start, end);
}
static void free_map_bootmem(struct page *memmap, unsigned long nr_pages)
{
vmemmap_free(memmap, nr_pages);
unsigned long start = (unsigned long)memmap;
unsigned long end = (unsigned long)(memmap + nr_pages);

vmemmap_free(start, end);
}
#else
static struct page *__kmalloc_section_memmap(unsigned long nr_pages)
Expand Down

0 comments on commit 1df9ffb

Please sign in to comment.