diff options
author | Huang Shijie <shijie.huang@arm.com> | 2016-11-08 00:44:39 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-01-19 14:18:08 -0500 |
commit | 736aec92c4e95a993a6e936ba3a90498975f5d62 (patch) | |
tree | 98bfbca71e54003c3509fe400ce7cbcaed1ba2c7 /arch/arm64/mm | |
parent | 3083593700ddf653f765031189805fef56959281 (diff) |
arm64: hugetlb: fix the wrong address for several functions
commit 0c2f0afe3582c58efeef93bc57bc07d502132618 upstream.
The libhugetlbfs meets several failures since the following functions
do not use the correct address:
huge_ptep_get_and_clear()
huge_ptep_set_access_flags()
huge_ptep_set_wrprotect()
huge_ptep_clear_flush()
This patch fixes the wrong address for them.
Signed-off-by: Huang Shijie <shijie.huang@arm.com>
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'arch/arm64/mm')
-rw-r--r-- | arch/arm64/mm/hugetlbpage.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/arch/arm64/mm/hugetlbpage.c b/arch/arm64/mm/hugetlbpage.c index 2e49bd252fe7..52f2c8fd1228 100644 --- a/arch/arm64/mm/hugetlbpage.c +++ b/arch/arm64/mm/hugetlbpage.c | |||
@@ -212,7 +212,7 @@ pte_t huge_ptep_get_and_clear(struct mm_struct *mm, | |||
212 | ncontig = find_num_contig(mm, addr, cpte, *cpte, &pgsize); | 212 | ncontig = find_num_contig(mm, addr, cpte, *cpte, &pgsize); |
213 | /* save the 1st pte to return */ | 213 | /* save the 1st pte to return */ |
214 | pte = ptep_get_and_clear(mm, addr, cpte); | 214 | pte = ptep_get_and_clear(mm, addr, cpte); |
215 | for (i = 1; i < ncontig; ++i) { | 215 | for (i = 1, addr += pgsize; i < ncontig; ++i, addr += pgsize) { |
216 | /* | 216 | /* |
217 | * If HW_AFDBM is enabled, then the HW could | 217 | * If HW_AFDBM is enabled, then the HW could |
218 | * turn on the dirty bit for any of the page | 218 | * turn on the dirty bit for any of the page |
@@ -250,7 +250,7 @@ int huge_ptep_set_access_flags(struct vm_area_struct *vma, | |||
250 | pfn = pte_pfn(*cpte); | 250 | pfn = pte_pfn(*cpte); |
251 | ncontig = find_num_contig(vma->vm_mm, addr, cpte, | 251 | ncontig = find_num_contig(vma->vm_mm, addr, cpte, |
252 | *cpte, &pgsize); | 252 | *cpte, &pgsize); |
253 | for (i = 0; i < ncontig; ++i, ++cpte) { | 253 | for (i = 0; i < ncontig; ++i, ++cpte, addr += pgsize) { |
254 | changed = ptep_set_access_flags(vma, addr, cpte, | 254 | changed = ptep_set_access_flags(vma, addr, cpte, |
255 | pfn_pte(pfn, | 255 | pfn_pte(pfn, |
256 | hugeprot), | 256 | hugeprot), |
@@ -273,7 +273,7 @@ void huge_ptep_set_wrprotect(struct mm_struct *mm, | |||
273 | 273 | ||
274 | cpte = huge_pte_offset(mm, addr); | 274 | cpte = huge_pte_offset(mm, addr); |
275 | ncontig = find_num_contig(mm, addr, cpte, *cpte, &pgsize); | 275 | ncontig = find_num_contig(mm, addr, cpte, *cpte, &pgsize); |
276 | for (i = 0; i < ncontig; ++i, ++cpte) | 276 | for (i = 0; i < ncontig; ++i, ++cpte, addr += pgsize) |
277 | ptep_set_wrprotect(mm, addr, cpte); | 277 | ptep_set_wrprotect(mm, addr, cpte); |
278 | } else { | 278 | } else { |
279 | ptep_set_wrprotect(mm, addr, ptep); | 279 | ptep_set_wrprotect(mm, addr, ptep); |
@@ -291,7 +291,7 @@ void huge_ptep_clear_flush(struct vm_area_struct *vma, | |||
291 | cpte = huge_pte_offset(vma->vm_mm, addr); | 291 | cpte = huge_pte_offset(vma->vm_mm, addr); |
292 | ncontig = find_num_contig(vma->vm_mm, addr, cpte, | 292 | ncontig = find_num_contig(vma->vm_mm, addr, cpte, |
293 | *cpte, &pgsize); | 293 | *cpte, &pgsize); |
294 | for (i = 0; i < ncontig; ++i, ++cpte) | 294 | for (i = 0; i < ncontig; ++i, ++cpte, addr += pgsize) |
295 | ptep_clear_flush(vma, addr, cpte); | 295 | ptep_clear_flush(vma, addr, cpte); |
296 | } else { | 296 | } else { |
297 | ptep_clear_flush(vma, addr, ptep); | 297 | ptep_clear_flush(vma, addr, ptep); |