Merge tag 'perf-tools-for-v5.12-2020-02-19' of git://git.kernel.org/pub/scm/linux...
[linux-2.6-microblaze.git] / mm / kasan / init.c
index bc0ad20..c4605ac 100644 (file)
@@ -64,7 +64,8 @@ static inline bool kasan_pmd_table(pud_t pud)
        return false;
 }
 #endif
-pte_t kasan_early_shadow_pte[PTRS_PER_PTE] __page_aligned_bss;
+pte_t kasan_early_shadow_pte[PTRS_PER_PTE + PTE_HWTABLE_PTRS]
+       __page_aligned_bss;
 
 static inline bool kasan_pte_table(pmd_t pmd)
 {
@@ -372,9 +373,10 @@ static void kasan_remove_pmd_table(pmd_t *pmd, unsigned long addr,
 
                if (kasan_pte_table(*pmd)) {
                        if (IS_ALIGNED(addr, PMD_SIZE) &&
-                           IS_ALIGNED(next, PMD_SIZE))
+                           IS_ALIGNED(next, PMD_SIZE)) {
                                pmd_clear(pmd);
-                       continue;
+                               continue;
+                       }
                }
                pte = pte_offset_kernel(pmd, addr);
                kasan_remove_pte_table(pte, addr, next);
@@ -397,9 +399,10 @@ static void kasan_remove_pud_table(pud_t *pud, unsigned long addr,
 
                if (kasan_pmd_table(*pud)) {
                        if (IS_ALIGNED(addr, PUD_SIZE) &&
-                           IS_ALIGNED(next, PUD_SIZE))
+                           IS_ALIGNED(next, PUD_SIZE)) {
                                pud_clear(pud);
-                       continue;
+                               continue;
+                       }
                }
                pmd = pmd_offset(pud, addr);
                pmd_base = pmd_offset(pud, 0);
@@ -423,9 +426,10 @@ static void kasan_remove_p4d_table(p4d_t *p4d, unsigned long addr,
 
                if (kasan_pud_table(*p4d)) {
                        if (IS_ALIGNED(addr, P4D_SIZE) &&
-                           IS_ALIGNED(next, P4D_SIZE))
+                           IS_ALIGNED(next, P4D_SIZE)) {
                                p4d_clear(p4d);
-                       continue;
+                               continue;
+                       }
                }
                pud = pud_offset(p4d, addr);
                kasan_remove_pud_table(pud, addr, next);
@@ -456,9 +460,10 @@ void kasan_remove_zero_shadow(void *start, unsigned long size)
 
                if (kasan_p4d_table(*pgd)) {
                        if (IS_ALIGNED(addr, PGDIR_SIZE) &&
-                           IS_ALIGNED(next, PGDIR_SIZE))
+                           IS_ALIGNED(next, PGDIR_SIZE)) {
                                pgd_clear(pgd);
-                       continue;
+                               continue;
+                       }
                }
 
                p4d = p4d_offset(pgd, addr);
@@ -481,7 +486,6 @@ int kasan_add_zero_shadow(void *start, unsigned long size)
 
        ret = kasan_populate_early_shadow(shadow_start, shadow_end);
        if (ret)
-               kasan_remove_zero_shadow(shadow_start,
-                                       size >> KASAN_SHADOW_SCALE_SHIFT);
+               kasan_remove_zero_shadow(start, size);
        return ret;
 }