Merge tag 'drm-next-2022-08-12-1' of git://anongit.freedesktop.org/drm/drm
[linux-2.6-microblaze.git] / mm / kasan / shadow.c
index a4f07de..0e3648b 100644 (file)
@@ -295,9 +295,22 @@ int kasan_populate_vmalloc(unsigned long addr, unsigned long size)
                return 0;
 
        shadow_start = (unsigned long)kasan_mem_to_shadow((void *)addr);
-       shadow_start = ALIGN_DOWN(shadow_start, PAGE_SIZE);
        shadow_end = (unsigned long)kasan_mem_to_shadow((void *)addr + size);
-       shadow_end = ALIGN(shadow_end, PAGE_SIZE);
+
+       /*
+        * User Mode Linux maps enough shadow memory for all of virtual memory
+        * at boot, so doesn't need to allocate more on vmalloc, just clear it.
+        *
+        * The remaining CONFIG_UML checks in this file exist for the same
+        * reason.
+        */
+       if (IS_ENABLED(CONFIG_UML)) {
+               __memset((void *)shadow_start, KASAN_VMALLOC_INVALID, shadow_end - shadow_start);
+               return 0;
+       }
+
+       shadow_start = PAGE_ALIGN_DOWN(shadow_start);
+       shadow_end = PAGE_ALIGN(shadow_end);
 
        ret = apply_to_page_range(&init_mm, shadow_start,
                                  shadow_end - shadow_start,
@@ -466,6 +479,10 @@ void kasan_release_vmalloc(unsigned long start, unsigned long end,
 
        if (shadow_end > shadow_start) {
                size = shadow_end - shadow_start;
+               if (IS_ENABLED(CONFIG_UML)) {
+                       __memset(shadow_start, KASAN_SHADOW_INIT, shadow_end - shadow_start);
+                       return;
+               }
                apply_to_existing_page_range(&init_mm,
                                             (unsigned long)shadow_start,
                                             size, kasan_depopulate_vmalloc_pte,
@@ -531,6 +548,11 @@ int kasan_alloc_module_shadow(void *addr, size_t size, gfp_t gfp_mask)
        if (WARN_ON(!PAGE_ALIGNED(shadow_start)))
                return -EINVAL;
 
+       if (IS_ENABLED(CONFIG_UML)) {
+               __memset((void *)shadow_start, KASAN_SHADOW_INIT, shadow_size);
+               return 0;
+       }
+
        ret = __vmalloc_node_range(shadow_size, 1, shadow_start,
                        shadow_start + shadow_size,
                        GFP_KERNEL,
@@ -554,6 +576,9 @@ int kasan_alloc_module_shadow(void *addr, size_t size, gfp_t gfp_mask)
 
 void kasan_free_module_shadow(const struct vm_struct *vm)
 {
+       if (IS_ENABLED(CONFIG_UML))
+               return;
+
        if (vm->flags & VM_KASAN)
                vfree(kasan_mem_to_shadow(vm->addr));
 }