diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2009-11-23 14:31:14 -0500 |
---|---|---|
committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2009-11-26 22:24:29 -0500 |
commit | c045256d146800ea1d741a8e9e377dada6b7e195 (patch) | |
tree | 4369d1f7c0859a373321c9b3b2d2a101a63282fc /arch/powerpc/mm/mmu_context_hash64.c | |
parent | 1e43bee9c70654b4d52472c19e5f0a0cc18b6b36 (diff) |
powerpc/mm: Fix bug in pagetable cache cleanup with CONFIG_PPC_SUBPAGE_PROT
Commit a0668cdc154e54bf0c85182e0535eea237d53146 cleans up the handling
of kmem_caches for allocating various levels of pagetables.
Unfortunately, it conflicts badly with CONFIG_PPC_SUBPAGE_PROT, due to
the latter's cleverly hidden technique of adding some extra allocation
space to the top level page directory to store the extra information
it needs.
Since that extra allocation really doesn't fit into the cleaned up
page directory allocating scheme, this patch alters
CONFIG_PPC_SUBPAGE_PROT to instead allocate its struct
subpage_prot_table as part of the mm_context_t.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Diffstat (limited to 'arch/powerpc/mm/mmu_context_hash64.c')
-rw-r--r-- | arch/powerpc/mm/mmu_context_hash64.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/arch/powerpc/mm/mmu_context_hash64.c b/arch/powerpc/mm/mmu_context_hash64.c index b9e4cc2c2057..b910d37aea1a 100644 --- a/arch/powerpc/mm/mmu_context_hash64.c +++ b/arch/powerpc/mm/mmu_context_hash64.c | |||
@@ -76,6 +76,7 @@ int init_new_context(struct task_struct *tsk, struct mm_struct *mm) | |||
76 | */ | 76 | */ |
77 | if (slice_mm_new_context(mm)) | 77 | if (slice_mm_new_context(mm)) |
78 | slice_set_user_psize(mm, mmu_virtual_psize); | 78 | slice_set_user_psize(mm, mmu_virtual_psize); |
79 | subpage_prot_init_new_context(mm); | ||
79 | mm->context.id = index; | 80 | mm->context.id = index; |
80 | 81 | ||
81 | return 0; | 82 | return 0; |
@@ -92,5 +93,6 @@ EXPORT_SYMBOL_GPL(__destroy_context); | |||
92 | void destroy_context(struct mm_struct *mm) | 93 | void destroy_context(struct mm_struct *mm) |
93 | { | 94 | { |
94 | __destroy_context(mm->context.id); | 95 | __destroy_context(mm->context.id); |
96 | subpage_prot_free(mm); | ||
95 | mm->context.id = NO_CONTEXT; | 97 | mm->context.id = NO_CONTEXT; |
96 | } | 98 | } |