summaryrefslogtreecommitdiff
path: root/mm/percpu.c
diff options
context:
space:
mode:
authorDennis Zhou (Facebook) <dennisszhou@gmail.com>2017-07-24 19:01:58 -0400
committerTejun Heo <tj@kernel.org>2017-07-26 10:23:51 -0400
commitfb29a2cc6b06e057ab7153a85190a96f66498ff4 (patch)
tree3b414d4a7b0e0ef61db02ccdc8255973d2f78e5e /mm/percpu.c
parent9c01516278ef872190fdda95aafaa8effdf6649a (diff)
downloadlwn-fb29a2cc6b06e057ab7153a85190a96f66498ff4.tar.gz
lwn-fb29a2cc6b06e057ab7153a85190a96f66498ff4.zip
percpu: setup_first_chunk enforce dynamic region must exist
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>
Diffstat (limited to 'mm/percpu.c')
-rw-r--r--mm/percpu.c9
1 files changed, 4 insertions, 5 deletions
diff --git a/mm/percpu.c b/mm/percpu.c
index 29244fb076ba..3602d41a7dfe 100644
--- a/mm/percpu.c
+++ b/mm/percpu.c
@@ -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 */