| From 7f6fd1088c327f9dab5d2bfd302205039d773373 Mon Sep 17 00:00:00 2001 |
| From: Huang Shijie <shijie.huang@arm.com> |
| Date: Tue, 8 Nov 2016 13:44:39 +0800 |
| Subject: [PATCH] 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: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| 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, |
| ncontig = find_num_contig(mm, addr, cpte, *cpte, &pgsize); |
| /* save the 1st pte to return */ |
| pte = ptep_get_and_clear(mm, addr, cpte); |
| - for (i = 1; i < ncontig; ++i) { |
| + for (i = 1, addr += pgsize; i < ncontig; ++i, addr += pgsize) { |
| /* |
| * If HW_AFDBM is enabled, then the HW could |
| * 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, |
| pfn = pte_pfn(*cpte); |
| ncontig = find_num_contig(vma->vm_mm, addr, cpte, |
| *cpte, &pgsize); |
| - for (i = 0; i < ncontig; ++i, ++cpte) { |
| + for (i = 0; i < ncontig; ++i, ++cpte, addr += pgsize) { |
| changed = ptep_set_access_flags(vma, addr, cpte, |
| pfn_pte(pfn, |
| hugeprot), |
| @@ -273,7 +273,7 @@ void huge_ptep_set_wrprotect(struct mm_struct *mm, |
| |
| cpte = huge_pte_offset(mm, addr); |
| ncontig = find_num_contig(mm, addr, cpte, *cpte, &pgsize); |
| - for (i = 0; i < ncontig; ++i, ++cpte) |
| + for (i = 0; i < ncontig; ++i, ++cpte, addr += pgsize) |
| ptep_set_wrprotect(mm, addr, cpte); |
| } else { |
| ptep_set_wrprotect(mm, addr, ptep); |
| @@ -291,7 +291,7 @@ void huge_ptep_clear_flush(struct vm_area_struct *vma, |
| cpte = huge_pte_offset(vma->vm_mm, addr); |
| ncontig = find_num_contig(vma->vm_mm, addr, cpte, |
| *cpte, &pgsize); |
| - for (i = 0; i < ncontig; ++i, ++cpte) |
| + for (i = 0; i < ncontig; ++i, ++cpte, addr += pgsize) |
| ptep_clear_flush(vma, addr, cpte); |
| } else { |
| ptep_clear_flush(vma, addr, ptep); |
| -- |
| 2.10.1 |
| |