diff options
Diffstat (limited to 'mm/memory.c')
| -rw-r--r-- | mm/memory.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/mm/memory.c b/mm/memory.c index 65216194eb8d..aede2ce3aba4 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
| @@ -135,11 +135,12 @@ void pmd_clear_bad(pmd_t *pmd) | |||
| 135 | * Note: this doesn't free the actual pages themselves. That | 135 | * Note: this doesn't free the actual pages themselves. That |
| 136 | * has been handled earlier when unmapping all the memory regions. | 136 | * has been handled earlier when unmapping all the memory regions. |
| 137 | */ | 137 | */ |
| 138 | static void free_pte_range(struct mmu_gather *tlb, pmd_t *pmd) | 138 | static void free_pte_range(struct mmu_gather *tlb, pmd_t *pmd, |
| 139 | unsigned long addr) | ||
| 139 | { | 140 | { |
| 140 | pgtable_t token = pmd_pgtable(*pmd); | 141 | pgtable_t token = pmd_pgtable(*pmd); |
| 141 | pmd_clear(pmd); | 142 | pmd_clear(pmd); |
| 142 | pte_free_tlb(tlb, token); | 143 | pte_free_tlb(tlb, token, addr); |
| 143 | tlb->mm->nr_ptes--; | 144 | tlb->mm->nr_ptes--; |
| 144 | } | 145 | } |
| 145 | 146 | ||
| @@ -157,7 +158,7 @@ static inline void free_pmd_range(struct mmu_gather *tlb, pud_t *pud, | |||
| 157 | next = pmd_addr_end(addr, end); | 158 | next = pmd_addr_end(addr, end); |
| 158 | if (pmd_none_or_clear_bad(pmd)) | 159 | if (pmd_none_or_clear_bad(pmd)) |
| 159 | continue; | 160 | continue; |
| 160 | free_pte_range(tlb, pmd); | 161 | free_pte_range(tlb, pmd, addr); |
| 161 | } while (pmd++, addr = next, addr != end); | 162 | } while (pmd++, addr = next, addr != end); |
| 162 | 163 | ||
| 163 | start &= PUD_MASK; | 164 | start &= PUD_MASK; |
| @@ -173,7 +174,7 @@ static inline void free_pmd_range(struct mmu_gather *tlb, pud_t *pud, | |||
| 173 | 174 | ||
| 174 | pmd = pmd_offset(pud, start); | 175 | pmd = pmd_offset(pud, start); |
| 175 | pud_clear(pud); | 176 | pud_clear(pud); |
| 176 | pmd_free_tlb(tlb, pmd); | 177 | pmd_free_tlb(tlb, pmd, start); |
| 177 | } | 178 | } |
| 178 | 179 | ||
| 179 | static inline void free_pud_range(struct mmu_gather *tlb, pgd_t *pgd, | 180 | static inline void free_pud_range(struct mmu_gather *tlb, pgd_t *pgd, |
| @@ -206,7 +207,7 @@ static inline void free_pud_range(struct mmu_gather *tlb, pgd_t *pgd, | |||
| 206 | 207 | ||
| 207 | pud = pud_offset(pgd, start); | 208 | pud = pud_offset(pgd, start); |
| 208 | pgd_clear(pgd); | 209 | pgd_clear(pgd); |
| 209 | pud_free_tlb(tlb, pud); | 210 | pud_free_tlb(tlb, pud, start); |
| 210 | } | 211 | } |
| 211 | 212 | ||
| 212 | /* | 213 | /* |
