diff options
Diffstat (limited to 'arch/powerpc/mm')
-rw-r--r-- | arch/powerpc/mm/hash_utils_64.c | 6 | ||||
-rw-r--r-- | arch/powerpc/mm/mmu_context_hash64.c | 2 | ||||
-rw-r--r-- | arch/powerpc/mm/subpage-prot.c | 15 |
3 files changed, 7 insertions, 16 deletions
diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils_64.c index 50f867d657df..6810128aba30 100644 --- a/arch/powerpc/mm/hash_utils_64.c +++ b/arch/powerpc/mm/hash_utils_64.c | |||
@@ -835,9 +835,9 @@ void demote_segment_4k(struct mm_struct *mm, unsigned long addr) | |||
835 | * Result is 0: full permissions, _PAGE_RW: read-only, | 835 | * Result is 0: full permissions, _PAGE_RW: read-only, |
836 | * _PAGE_USER or _PAGE_USER|_PAGE_RW: no access. | 836 | * _PAGE_USER or _PAGE_USER|_PAGE_RW: no access. |
837 | */ | 837 | */ |
838 | static int subpage_protection(struct mm_struct *mm, unsigned long ea) | 838 | static int subpage_protection(pgd_t *pgdir, unsigned long ea) |
839 | { | 839 | { |
840 | struct subpage_prot_table *spt = &mm->context.spt; | 840 | struct subpage_prot_table *spt = pgd_subpage_prot(pgdir); |
841 | u32 spp = 0; | 841 | u32 spp = 0; |
842 | u32 **sbpm, *sbpp; | 842 | u32 **sbpm, *sbpp; |
843 | 843 | ||
@@ -865,7 +865,7 @@ static int subpage_protection(struct mm_struct *mm, unsigned long ea) | |||
865 | } | 865 | } |
866 | 866 | ||
867 | #else /* CONFIG_PPC_SUBPAGE_PROT */ | 867 | #else /* CONFIG_PPC_SUBPAGE_PROT */ |
868 | static inline int subpage_protection(struct mm_struct *mm, unsigned long ea) | 868 | static inline int subpage_protection(pgd_t *pgdir, unsigned long ea) |
869 | { | 869 | { |
870 | return 0; | 870 | return 0; |
871 | } | 871 | } |
diff --git a/arch/powerpc/mm/mmu_context_hash64.c b/arch/powerpc/mm/mmu_context_hash64.c index b910d37aea1a..b9e4cc2c2057 100644 --- a/arch/powerpc/mm/mmu_context_hash64.c +++ b/arch/powerpc/mm/mmu_context_hash64.c | |||
@@ -76,7 +76,6 @@ 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); | ||
80 | mm->context.id = index; | 79 | mm->context.id = index; |
81 | 80 | ||
82 | return 0; | 81 | return 0; |
@@ -93,6 +92,5 @@ EXPORT_SYMBOL_GPL(__destroy_context); | |||
93 | void destroy_context(struct mm_struct *mm) | 92 | void destroy_context(struct mm_struct *mm) |
94 | { | 93 | { |
95 | __destroy_context(mm->context.id); | 94 | __destroy_context(mm->context.id); |
96 | subpage_prot_free(mm); | ||
97 | mm->context.id = NO_CONTEXT; | 95 | mm->context.id = NO_CONTEXT; |
98 | } | 96 | } |
diff --git a/arch/powerpc/mm/subpage-prot.c b/arch/powerpc/mm/subpage-prot.c index a040b81e93bd..4cafc0c33d0a 100644 --- a/arch/powerpc/mm/subpage-prot.c +++ b/arch/powerpc/mm/subpage-prot.c | |||
@@ -24,9 +24,9 @@ | |||
24 | * Also makes sure that the subpage_prot_table structure is | 24 | * Also makes sure that the subpage_prot_table structure is |
25 | * reinitialized for the next user. | 25 | * reinitialized for the next user. |
26 | */ | 26 | */ |
27 | void subpage_prot_free(struct mm_struct *mm) | 27 | void subpage_prot_free(pgd_t *pgd) |
28 | { | 28 | { |
29 | struct subpage_prot_table *spt = &mm->context.spt; | 29 | struct subpage_prot_table *spt = pgd_subpage_prot(pgd); |
30 | unsigned long i, j, addr; | 30 | unsigned long i, j, addr; |
31 | u32 **p; | 31 | u32 **p; |
32 | 32 | ||
@@ -51,13 +51,6 @@ void subpage_prot_free(struct mm_struct *mm) | |||
51 | spt->maxaddr = 0; | 51 | spt->maxaddr = 0; |
52 | } | 52 | } |
53 | 53 | ||
54 | void subpage_prot_init_new_context(struct mm_struct *mm) | ||
55 | { | ||
56 | struct subpage_prot_table *spt = &mm->context.spt; | ||
57 | |||
58 | memset(spt, 0, sizeof(*spt)); | ||
59 | } | ||
60 | |||
61 | static void hpte_flush_range(struct mm_struct *mm, unsigned long addr, | 54 | static void hpte_flush_range(struct mm_struct *mm, unsigned long addr, |
62 | int npages) | 55 | int npages) |
63 | { | 56 | { |
@@ -94,7 +87,7 @@ static void hpte_flush_range(struct mm_struct *mm, unsigned long addr, | |||
94 | static void subpage_prot_clear(unsigned long addr, unsigned long len) | 87 | static void subpage_prot_clear(unsigned long addr, unsigned long len) |
95 | { | 88 | { |
96 | struct mm_struct *mm = current->mm; | 89 | struct mm_struct *mm = current->mm; |
97 | struct subpage_prot_table *spt = &mm->context.spt; | 90 | struct subpage_prot_table *spt = pgd_subpage_prot(mm->pgd); |
98 | u32 **spm, *spp; | 91 | u32 **spm, *spp; |
99 | int i, nw; | 92 | int i, nw; |
100 | unsigned long next, limit; | 93 | unsigned long next, limit; |
@@ -143,7 +136,7 @@ static void subpage_prot_clear(unsigned long addr, unsigned long len) | |||
143 | long sys_subpage_prot(unsigned long addr, unsigned long len, u32 __user *map) | 136 | long sys_subpage_prot(unsigned long addr, unsigned long len, u32 __user *map) |
144 | { | 137 | { |
145 | struct mm_struct *mm = current->mm; | 138 | struct mm_struct *mm = current->mm; |
146 | struct subpage_prot_table *spt = &mm->context.spt; | 139 | struct subpage_prot_table *spt = pgd_subpage_prot(mm->pgd); |
147 | u32 **spm, *spp; | 140 | u32 **spm, *spp; |
148 | int i, nw; | 141 | int i, nw; |
149 | unsigned long next, limit; | 142 | unsigned long next, limit; |