spi: dt-bindings: cadence: add missing 'required'
[platform/kernel/linux-rpi.git] / mm / memblock.c
index b91df5c..2b73977 100644 (file)
@@ -366,14 +366,20 @@ void __init memblock_discard(void)
                addr = __pa(memblock.reserved.regions);
                size = PAGE_ALIGN(sizeof(struct memblock_region) *
                                  memblock.reserved.max);
-               __memblock_free_late(addr, size);
+               if (memblock_reserved_in_slab)
+                       kfree(memblock.reserved.regions);
+               else
+                       __memblock_free_late(addr, size);
        }
 
        if (memblock.memory.regions != memblock_memory_init_regions) {
                addr = __pa(memblock.memory.regions);
                size = PAGE_ALIGN(sizeof(struct memblock_region) *
                                  memblock.memory.max);
-               __memblock_free_late(addr, size);
+               if (memblock_memory_in_slab)
+                       kfree(memblock.memory.regions);
+               else
+                       __memblock_free_late(addr, size);
        }
 
        memblock_memory = NULL;
@@ -932,16 +938,14 @@ int __init_memblock memblock_mark_mirror(phys_addr_t base, phys_addr_t size)
  * covered by the memory map. The struct page representing NOMAP memory
  * frames in the memory map will be PageReserved()
  *
+ * Note: if the memory being marked %MEMBLOCK_NOMAP was allocated from
+ * memblock, the caller must inform kmemleak to ignore that memory
+ *
  * Return: 0 on success, -errno on failure.
  */
 int __init_memblock memblock_mark_nomap(phys_addr_t base, phys_addr_t size)
 {
-       int ret = memblock_setclr_flag(base, size, 1, MEMBLOCK_NOMAP);
-
-       if (!ret)
-               kmemleak_free_part_phys(base, size);
-
-       return ret;
+       return memblock_setclr_flag(base, size, 1, MEMBLOCK_NOMAP);
 }
 
 /**