summaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
authorBaoquan He <bhe@redhat.com>2022-10-25 05:45:16 +0200
committerDennis Zhou <dennis@kernel.org>2022-11-08 07:59:12 +0100
commit73046f8d31701c379f6db899cb09ba70a3285143 (patch)
tree64a181641e3544167a02388136a70d30ab1faf46 /mm
parentmm/percpu: Update the code comment when creating new chunk (diff)
downloadlinux-73046f8d31701c379f6db899cb09ba70a3285143.tar.xz
linux-73046f8d31701c379f6db899cb09ba70a3285143.zip
mm/percpu: add comment to state the empty populated pages accounting
When allocating an area from a chunk, pcpu_block_update_hint_alloc() is called to update chunk metadata, including chunk's and global nr_empty_pop_pages. However, if the allocation is not atomic, some blocks may not be populated with pages yet, while we still subtract the number here. The number of pages will be added back with pcpu_chunk_populated() when populating pages. Adding code comment to make that more understandable. Signed-off-by: Baoquan He <bhe@redhat.com> Signed-off-by: Dennis Zhou <dennis@kernel.org>
Diffstat (limited to 'mm')
-rw-r--r--mm/percpu.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/mm/percpu.c b/mm/percpu.c
index 68d5ba61c935..2a7313b56254 100644
--- a/mm/percpu.c
+++ b/mm/percpu.c
@@ -831,13 +831,15 @@ static void pcpu_block_update_hint_alloc(struct pcpu_chunk *chunk, int bit_off,
/*
* Update s_block.
- * block->first_free must be updated if the allocation takes its place.
- * If the allocation breaks the contig_hint, a scan is required to
- * restore this hint.
*/
if (s_block->contig_hint == PCPU_BITMAP_BLOCK_BITS)
nr_empty_pages++;
+ /*
+ * block->first_free must be updated if the allocation takes its place.
+ * If the allocation breaks the contig_hint, a scan is required to
+ * restore this hint.
+ */
if (s_off == s_block->first_free)
s_block->first_free = find_next_zero_bit(
pcpu_index_alloc_map(chunk, s_index),
@@ -912,6 +914,12 @@ static void pcpu_block_update_hint_alloc(struct pcpu_chunk *chunk, int bit_off,
}
}
+ /*
+ * If the allocation is not atomic, some blocks may not be
+ * populated with pages, while we account it here. The number
+ * of pages will be added back with pcpu_chunk_populated()
+ * when populating pages.
+ */
if (nr_empty_pages)
pcpu_update_empty_pages(chunk, -nr_empty_pages);