percpu: setup_first_chunk enforce dynamic region must exist
authorDennis Zhou (Facebook) <dennisszhou@gmail.com>
Mon, 24 Jul 2017 23:01:58 +0000 (19:01 -0400)
committerTejun Heo <tj@kernel.org>
Wed, 26 Jul 2017 14:23:51 +0000 (10:23 -0400)
The first chunk is handled as a special case as it is composed of the
static, reserved, and dynamic regions. The code handles each case
individually. The next several patches will merge these code paths and
lay the foundation for the bitmap allocator.

This patch modifies logic to enforce that a dynamic region exists and
changes the area map to account for that. This brings the logic closer
to the dynamic chunk's init logic.

Signed-off-by: Dennis Zhou <dennisszhou@gmail.com>
Reviewed-by: Josef Bacik <jbacik@fb.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
mm/percpu.c

index 29244fb076ba8b04a3770e90721158031c721ad3..3602d41a7dfe3872fe3c6d545344c482895bcf32 100644 (file)
@@ -1598,6 +1598,7 @@ int __init pcpu_setup_first_chunk(const struct pcpu_alloc_info *ai,
        PCPU_SETUP_BUG_ON(offset_in_page(ai->unit_size));
        PCPU_SETUP_BUG_ON(ai->unit_size < PCPU_MIN_UNIT_SIZE);
        PCPU_SETUP_BUG_ON(ai->dyn_size < PERCPU_DYNAMIC_EARLY_SIZE);
+       PCPU_SETUP_BUG_ON(!ai->dyn_size);
        PCPU_SETUP_BUG_ON(pcpu_verify_alloc_info(ai) < 0);
 
        /* process group information and build config tables accordingly */
@@ -1700,14 +1701,12 @@ int __init pcpu_setup_first_chunk(const struct pcpu_alloc_info *ai,
                schunk->free_size = dyn_size;
                dyn_size = 0;                   /* dynamic area covered */
        }
-       schunk->contig_hint = schunk->free_size;
 
+       schunk->contig_hint = schunk->free_size;
        schunk->map[0] = 1;
        schunk->map[1] = ai->static_size;
-       schunk->map_used = 1;
-       if (schunk->free_size)
-               schunk->map[++schunk->map_used] = ai->static_size + schunk->free_size;
-       schunk->map[schunk->map_used] |= 1;
+       schunk->map[2] = (ai->static_size + schunk->free_size) | 1;
+       schunk->map_used = 2;
        schunk->has_reserved = true;
 
        /* init dynamic chunk if necessary */