Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 138665
b: refs/heads/master
c: 4bbd4fa
h: refs/heads/master
i:
  138663: 0240465
v: v3
  • Loading branch information
Pekka Enberg authored and Ingo Molnar committed Mar 5, 2009
1 parent 69b3eae commit f077f06
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 6 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: c3f5d2d8b5fa6eb0cc1c47fd162bf6432f206f42
refs/heads/master: 4bbd4fa03832208f0e6e0b9e73a0ffa2620a626a
23 changes: 18 additions & 5 deletions trunk/arch/x86/mm/init_32.c
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@ static unsigned long __meminitdata table_top;

static int __initdata after_init_bootmem;

int direct_gbpages;

static __init void *alloc_low_page(void)
{
unsigned long pfn = table_end++;
Expand Down Expand Up @@ -831,14 +833,22 @@ void __init setup_bootmem_allocator(void)
after_init_bootmem = 1;
}

static void __init find_early_table_space(unsigned long end, int use_pse)
static void __init find_early_table_space(unsigned long end, int use_pse,
int use_gbpages)
{
unsigned long puds, pmds, ptes, tables, start;

puds = (end + PUD_SIZE - 1) >> PUD_SHIFT;
tables = roundup(puds * sizeof(pud_t), PAGE_SIZE);

pmds = (end + PMD_SIZE - 1) >> PMD_SHIFT;
if (use_gbpages) {
unsigned long extra;

extra = end - ((end>>PUD_SHIFT) << PUD_SHIFT);
pmds = (extra + PMD_SIZE - 1) >> PMD_SHIFT;
} else
pmds = (end + PMD_SIZE - 1) >> PMD_SHIFT;

tables += roundup(pmds * sizeof(pmd_t), PAGE_SIZE);

if (use_pse) {
Expand Down Expand Up @@ -913,7 +923,7 @@ unsigned long __init_refok init_memory_mapping(unsigned long start,

struct map_range mr[NR_RANGE_MR];
int nr_range, i;
int use_pse;
int use_pse, use_gbpages;

printk(KERN_INFO "init_memory_mapping: %016lx-%016lx\n", start, end);

Expand All @@ -923,9 +933,10 @@ unsigned long __init_refok init_memory_mapping(unsigned long start,
* This will simplify cpa(), which otherwise needs to support splitting
* large pages into small in interrupt context, etc.
*/
use_pse = 0;
use_pse = use_gbpages = 0;
#else
use_pse = cpu_has_pse;
use_gbpages = direct_gbpages;
#endif

#ifdef CONFIG_X86_PAE
Expand All @@ -944,6 +955,8 @@ unsigned long __init_refok init_memory_mapping(unsigned long start,
__supported_pte_mask |= _PAGE_GLOBAL;
}

if (use_gbpages)
page_size_mask |= 1 << PG_LEVEL_1G;
if (use_pse)
page_size_mask |= 1 << PG_LEVEL_2M;

Expand Down Expand Up @@ -1015,7 +1028,7 @@ unsigned long __init_refok init_memory_mapping(unsigned long start,
* nodes are discovered.
*/
if (!after_init_bootmem)
find_early_table_space(end, use_pse);
find_early_table_space(end, use_pse, use_gbpages);

for (i = 0; i < nr_range; i++)
kernel_physical_mapping_init(pgd_base,
Expand Down

0 comments on commit f077f06

Please sign in to comment.