summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Braun <rbraun@sceen.net>2013-06-28 20:44:33 +0200
committerRichard Braun <rbraun@sceen.net>2013-06-28 20:44:33 +0200
commit75d1643bc6478538b0c8e13447fddd1f3b5b7f13 (patch)
tree937c84145723a028b9634aec4bdefe862c847ae5
parent3788dee2d2bab33aef04b4377392371b93dee1f7 (diff)
x86/pmap: simplify pmap_kgrow
Reduce the amount of pmap updates by performing one global update once page tables have been changed.
-rw-r--r--arch/x86/machine/pmap.c15
1 files changed, 5 insertions, 10 deletions
diff --git a/arch/x86/machine/pmap.c b/arch/x86/machine/pmap.c
index 43ca984c..77544594 100644
--- a/arch/x86/machine/pmap.c
+++ b/arch/x86/machine/pmap.c
@@ -518,11 +518,11 @@ pmap_kgrow_update_pmaps(unsigned int index)
void
pmap_kgrow(unsigned long end)
{
- const struct pmap_pt_level *pt_level, *pt_lower_level;
+ const struct pmap_pt_level *pt_level;
struct vm_page *page;
- unsigned long start, va, lower_pt_va;
- unsigned int level, index, lower_index;
- pmap_pte_t *pte, *lower_pt;
+ unsigned long start, va;
+ unsigned int level, index;
+ pmap_pte_t *pte;
phys_addr_t pa;
start = pmap_kernel_limit;
@@ -531,7 +531,6 @@ pmap_kgrow(unsigned long end)
for (level = PMAP_NR_LEVELS; level > 1; level--) {
pt_level = &pmap_pt_levels[level - 1];
- pt_lower_level = &pmap_pt_levels[level - 2];
for (va = start; (va != 0) && (va <= end);
va = P2END(va, 1UL << pt_level->shift)) {
@@ -556,15 +555,11 @@ pmap_kgrow(unsigned long end)
if (level == PMAP_NR_LEVELS)
pmap_kgrow_update_pmaps(index);
-
- lower_index = PMAP_PTEMAP_INDEX(va, pt_lower_level->shift);
- lower_pt = &pt_lower_level->ptes[lower_index];
- lower_pt_va = (unsigned long)lower_pt;
- pmap_update(kernel_pmap, lower_pt_va, lower_pt_va + PAGE_SIZE);
}
}
}
+ pmap_update(kernel_pmap, 0, (unsigned long)-1);
pmap_kernel_limit = end + 1;
}