@@ -51,20 +51,8 @@ static int find_num_contig(struct mm_struct *mm, unsigned long addr,
5151 * pgsize = PAGE_SIZE ;
5252 if (!pte_cont (pte ))
5353 return 1 ;
54- if (!pgd_present (* pgd )) {
55- VM_BUG_ON (!pgd_present (* pgd ));
56- return 1 ;
57- }
5854 pud = pud_offset (pgd , addr );
59- if (!pud_present (* pud )) {
60- VM_BUG_ON (!pud_present (* pud ));
61- return 1 ;
62- }
6355 pmd = pmd_offset (pud , addr );
64- if (!pmd_present (* pmd )) {
65- VM_BUG_ON (!pmd_present (* pmd ));
66- return 1 ;
67- }
6856 if ((pte_t * )pmd == ptep ) {
6957 * pgsize = PMD_SIZE ;
7058 return CONT_PMDS ;
@@ -212,7 +200,7 @@ pte_t huge_ptep_get_and_clear(struct mm_struct *mm,
212200 ncontig = find_num_contig (mm , addr , cpte , * cpte , & pgsize );
213201 /* save the 1st pte to return */
214202 pte = ptep_get_and_clear (mm , addr , cpte );
215- for (i = 1 ; i < ncontig ; ++ i ) {
203+ for (i = 1 , addr += pgsize ; i < ncontig ; ++ i , addr += pgsize ) {
216204 /*
217205 * If HW_AFDBM is enabled, then the HW could
218206 * turn on the dirty bit for any of the page
@@ -250,8 +238,8 @@ int huge_ptep_set_access_flags(struct vm_area_struct *vma,
250238 pfn = pte_pfn (* cpte );
251239 ncontig = find_num_contig (vma -> vm_mm , addr , cpte ,
252240 * cpte , & pgsize );
253- for (i = 0 ; i < ncontig ; ++ i , ++ cpte ) {
254- changed = ptep_set_access_flags (vma , addr , cpte ,
241+ for (i = 0 ; i < ncontig ; ++ i , ++ cpte , addr += pgsize ) {
242+ changed | = ptep_set_access_flags (vma , addr , cpte ,
255243 pfn_pte (pfn ,
256244 hugeprot ),
257245 dirty );
@@ -273,7 +261,7 @@ void huge_ptep_set_wrprotect(struct mm_struct *mm,
273261
274262 cpte = huge_pte_offset (mm , addr );
275263 ncontig = find_num_contig (mm , addr , cpte , * cpte , & pgsize );
276- for (i = 0 ; i < ncontig ; ++ i , ++ cpte )
264+ for (i = 0 ; i < ncontig ; ++ i , ++ cpte , addr += pgsize )
277265 ptep_set_wrprotect (mm , addr , cpte );
278266 } else {
279267 ptep_set_wrprotect (mm , addr , ptep );
@@ -291,7 +279,7 @@ void huge_ptep_clear_flush(struct vm_area_struct *vma,
291279 cpte = huge_pte_offset (vma -> vm_mm , addr );
292280 ncontig = find_num_contig (vma -> vm_mm , addr , cpte ,
293281 * cpte , & pgsize );
294- for (i = 0 ; i < ncontig ; ++ i , ++ cpte )
282+ for (i = 0 ; i < ncontig ; ++ i , ++ cpte , addr += pgsize )
295283 ptep_clear_flush (vma , addr , cpte );
296284 } else {
297285 ptep_clear_flush (vma , addr , ptep );
0 commit comments