Merge tag 'docs-4.20' of git://git.lwn.net/linux
[linux-2.6-microblaze.git] / kernel / memremap.c
index 3828336..5b8600d 100644 (file)
@@ -5,6 +5,7 @@
 #include <linux/types.h>
 #include <linux/pfn_t.h>
 #include <linux/io.h>
+#include <linux/kasan.h>
 #include <linux/mm.h>
 #include <linux/memory_hotplug.h>
 #include <linux/swap.h>
@@ -42,7 +43,7 @@ static unsigned long order_at(struct resource *res, unsigned long pgoff)
                        pgoff += 1UL << order, order = order_at((res), pgoff))
 
 #if IS_ENABLED(CONFIG_DEVICE_PRIVATE)
-int device_private_entry_fault(struct vm_area_struct *vma,
+vm_fault_t device_private_entry_fault(struct vm_area_struct *vma,
                       unsigned long addr,
                       swp_entry_t entry,
                       unsigned int flags,
@@ -137,6 +138,7 @@ static void devm_memremap_pages_release(void *data)
        mem_hotplug_begin();
        arch_remove_memory(align_start, align_size, pgmap->altmap_valid ?
                        &pgmap->altmap : NULL);
+       kasan_remove_zero_shadow(__va(align_start), align_size);
        mem_hotplug_done();
 
        untrack_pfn(NULL, PHYS_PFN(align_start), align_size);
@@ -239,6 +241,12 @@ void *devm_memremap_pages(struct device *dev, struct dev_pagemap *pgmap)
                goto err_pfn_remap;
 
        mem_hotplug_begin();
+       error = kasan_add_zero_shadow(__va(align_start), align_size);
+       if (error) {
+               mem_hotplug_done();
+               goto err_kasan;
+       }
+
        error = arch_add_memory(nid, align_start, align_size, altmap, false);
        if (!error)
                move_pfn_range_to_zone(&NODE_DATA(nid)->node_zones[ZONE_DEVICE],
@@ -267,6 +275,8 @@ void *devm_memremap_pages(struct device *dev, struct dev_pagemap *pgmap)
        return __va(res->start);
 
  err_add_memory:
+       kasan_remove_zero_shadow(__va(align_start), align_size);
+ err_kasan:
        untrack_pfn(NULL, PHYS_PFN(align_start), align_size);
  err_pfn_remap:
  err_radix:
@@ -355,7 +365,6 @@ void __put_devmap_managed_page(struct page *page)
                __ClearPageActive(page);
                __ClearPageWaiters(page);
 
-               page->mapping = NULL;
                mem_cgroup_uncharge(page);
 
                page->pgmap->page_free(page, page->pgmap->data);