Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 356207
b: refs/heads/master
c: 22c8ca2
h: refs/heads/master
i:
  356205: f02e379
  356203: eb758bf
  356199: f5c7269
  356191: 697963c
v: v3
  • Loading branch information
Yinghai Lu authored and H. Peter Anvin committed Nov 17, 2012
1 parent 2644525 commit 4509840
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 14 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: 6f80b68e9e515547edbacb0c37491730bf766db5
refs/heads/master: 22c8ca2ac256bb681be791858b35502b5d37e73b
33 changes: 21 additions & 12 deletions trunk/arch/x86/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,36 +25,45 @@ unsigned long __meminitdata pgt_buf_top;

static unsigned long min_pfn_mapped;

__ref void *alloc_low_page(void)
__ref void *alloc_low_pages(unsigned int num)
{
unsigned long pfn;
void *adr;
int i;

#ifdef CONFIG_X86_64
if (after_bootmem) {
adr = (void *)get_zeroed_page(GFP_ATOMIC | __GFP_NOTRACK);
unsigned int order;

return adr;
order = get_order((unsigned long)num << PAGE_SHIFT);
return (void *)__get_free_pages(GFP_ATOMIC | __GFP_NOTRACK |
__GFP_ZERO, order);
}
#endif

if ((pgt_buf_end + 1) >= pgt_buf_top) {
if ((pgt_buf_end + num) >= pgt_buf_top) {
unsigned long ret;
if (min_pfn_mapped >= max_pfn_mapped)
panic("alloc_low_page: ran out of memory");
ret = memblock_find_in_range(min_pfn_mapped << PAGE_SHIFT,
max_pfn_mapped << PAGE_SHIFT,
PAGE_SIZE, PAGE_SIZE);
PAGE_SIZE * num , PAGE_SIZE);
if (!ret)
panic("alloc_low_page: can not alloc memory");
memblock_reserve(ret, PAGE_SIZE);
memblock_reserve(ret, PAGE_SIZE * num);
pfn = ret >> PAGE_SHIFT;
} else
pfn = pgt_buf_end++;
} else {
pfn = pgt_buf_end;
pgt_buf_end += num;
}

for (i = 0; i < num; i++) {
void *adr;

adr = __va((pfn + i) << PAGE_SHIFT);
clear_page(adr);
}

adr = __va(pfn * PAGE_SIZE);
clear_page(adr);
return adr;
return __va(pfn << PAGE_SHIFT);
}

/* need 4 4k for initial PMD_SIZE, 4k for 0-ISA_END_ADDRESS */
Expand Down
6 changes: 5 additions & 1 deletion trunk/arch/x86/mm/mm_internal.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
#ifndef __X86_MM_INTERNAL_H
#define __X86_MM_INTERNAL_H

void *alloc_low_page(void);
void *alloc_low_pages(unsigned int num);
static inline void *alloc_low_page(void)
{
return alloc_low_pages(1);
}

#endif /* __X86_MM_INTERNAL_H */

0 comments on commit 4509840

Please sign in to comment.