]> Git Repo - J-linux.git/commitdiff
Merge tag 'memblock-v5.20-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rppt...
authorLinus Torvalds <[email protected]>
Tue, 9 Aug 2022 16:48:30 +0000 (09:48 -0700)
committerLinus Torvalds <[email protected]>
Tue, 9 Aug 2022 16:48:30 +0000 (09:48 -0700)
Pull memblock updates from Mike Rapoport:

 - An optimization in memblock_add_range() to reduce array traversals

 - Improvements to the memblock test suite

* tag 'memblock-v5.20-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rppt/memblock:
  memblock test: Modify the obsolete description in README
  memblock tests: fix compilation errors
  memblock tests: change build options to run-time options
  memblock tests: remove completed TODO items
  memblock tests: set memblock_debug to enable memblock_dbg() messages
  memblock tests: add verbose output to memblock tests
  memblock tests: Makefile: add arguments to control verbosity
  memblock: avoid some repeat when add new range

1  2 
mm/memblock.c

diff --combined mm/memblock.c
index c0894c1379549d6bb572e7ded5e669e700efec49,16f006521afad8a82ddba134a4f0678a43aaa337..b5d3026979fccbb767458c2844ba1043ca47dd06
  # define INIT_MEMBLOCK_RESERVED_REGIONS               INIT_MEMBLOCK_REGIONS
  #endif
  
 +#ifndef INIT_MEMBLOCK_MEMORY_REGIONS
 +#define INIT_MEMBLOCK_MEMORY_REGIONS          INIT_MEMBLOCK_REGIONS
 +#endif
 +
  /**
   * DOC: memblock overview
   *
@@@ -59,9 -55,9 +59,9 @@@
   * the allocator metadata. The "memory" and "reserved" types are nicely
   * wrapped with struct memblock. This structure is statically
   * initialized at build time. The region arrays are initially sized to
 - * %INIT_MEMBLOCK_REGIONS for "memory" and %INIT_MEMBLOCK_RESERVED_REGIONS
 - * for "reserved". The region array for "physmem" is initially sized to
 - * %INIT_PHYSMEM_REGIONS.
 + * %INIT_MEMBLOCK_MEMORY_REGIONS for "memory" and
 + * %INIT_MEMBLOCK_RESERVED_REGIONS for "reserved". The region array
 + * for "physmem" is initially sized to %INIT_PHYSMEM_REGIONS.
   * The memblock_allow_resize() enables automatic resizing of the region
   * arrays during addition of new regions. This feature should be used
   * with care so that memory allocated for the region array will not
@@@ -106,7 -102,7 +106,7 @@@ unsigned long min_low_pfn
  unsigned long max_pfn;
  unsigned long long max_possible_pfn;
  
 -static struct memblock_region memblock_memory_init_regions[INIT_MEMBLOCK_REGIONS] __initdata_memblock;
 +static struct memblock_region memblock_memory_init_regions[INIT_MEMBLOCK_MEMORY_REGIONS] __initdata_memblock;
  static struct memblock_region memblock_reserved_init_regions[INIT_MEMBLOCK_RESERVED_REGIONS] __initdata_memblock;
  #ifdef CONFIG_HAVE_MEMBLOCK_PHYS_MAP
  static struct memblock_region memblock_physmem_init_regions[INIT_PHYSMEM_REGIONS];
  struct memblock memblock __initdata_memblock = {
        .memory.regions         = memblock_memory_init_regions,
        .memory.cnt             = 1,    /* empty dummy entry */
 -      .memory.max             = INIT_MEMBLOCK_REGIONS,
 +      .memory.max             = INIT_MEMBLOCK_MEMORY_REGIONS,
        .memory.name            = "memory",
  
        .reserved.regions       = memblock_reserved_init_regions,
@@@ -331,7 -327,7 +331,7 @@@ again
                                            NUMA_NO_NODE, flags);
  
        if (!ret && (flags & MEMBLOCK_MIRROR)) {
 -              pr_warn("Could not allocate %pap bytes of mirrored memory\n",
 +              pr_warn_ratelimited("Could not allocate %pap bytes of mirrored memory\n",
                        &size);
                flags &= ~MEMBLOCK_MIRROR;
                goto again;
@@@ -597,6 -593,17 +597,17 @@@ static int __init_memblock memblock_add
                type->total_size = size;
                return 0;
        }
+       /*
+        * The worst case is when new range overlaps all existing regions,
+        * then we'll need type->cnt + 1 empty regions in @type. So if
+        * type->cnt * 2 + 1 is less than type->max, we know
+        * that there is enough empty regions in @type, and we can insert
+        * regions directly.
+        */
+       if (type->cnt * 2 + 1 < type->max)
+               insert = true;
  repeat:
        /*
         * The following is executed twice.  Once with %false @insert and
@@@ -928,9 -935,6 +939,9 @@@ int __init_memblock memblock_clear_hotp
   */
  int __init_memblock memblock_mark_mirror(phys_addr_t base, phys_addr_t size)
  {
 +      if (!mirrored_kernelcore)
 +              return 0;
 +
        system_has_some_mirror = true;
  
        return memblock_setclr_flag(base, size, 1, MEMBLOCK_MIRROR);
@@@ -1352,8 -1356,8 +1363,8 @@@ __next_mem_pfn_range_in_zone(u64 *idx, 
   * from the regions with mirroring enabled and then retried from any
   * memory region.
   *
 - * In addition, function sets the min_count to 0 using kmemleak_alloc_phys for
 - * allocated boot memory block, so that it is never reported as leaks.
 + * In addition, function using kmemleak_alloc_phys for allocated boot
 + * memory block, it is never reported as leaks.
   *
   * Return:
   * Physical address of allocated memory block on success, %0 on failure.
@@@ -1391,7 -1395,7 +1402,7 @@@ again
  
        if (flags & MEMBLOCK_MIRROR) {
                flags &= ~MEMBLOCK_MIRROR;
 -              pr_warn("Could not allocate %pap bytes of mirrored memory\n",
 +              pr_warn_ratelimited("Could not allocate %pap bytes of mirrored memory\n",
                        &size);
                goto again;
        }
@@@ -1405,12 -1409,12 +1416,12 @@@ done
         */
        if (end != MEMBLOCK_ALLOC_NOLEAKTRACE)
                /*
 -               * The min_count is set to 0 so that memblock allocated
 -               * blocks are never reported as leaks. This is because many
 -               * of these blocks are only referred via the physical
 -               * address which is not looked up by kmemleak.
 +               * Memblock allocated blocks are never reported as
 +               * leaks. This is because many of these blocks are
 +               * only referred via the physical address which is
 +               * not looked up by kmemleak.
                 */
 -              kmemleak_alloc_phys(found, size, 0, 0);
 +              kmemleak_alloc_phys(found, size, 0);
  
        return found;
  }
This page took 0.058808 seconds and 4 git commands to generate.