Describing the possible ranges in split and marking ranges with name to
help audience understand the logic.

Also this prepares to illustrate a code refine next.

Signed-off-by: Wei Yang <[email protected]>
---
 arch/x86/mm/init.c | 51 ++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 45 insertions(+), 6 deletions(-)

diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c
index 6fb84be79c7c..2b782dcd6d71 100644
--- a/arch/x86/mm/init.c
+++ b/arch/x86/mm/init.c
@@ -328,6 +328,31 @@ static const char *page_size_string(struct map_range *mr)
        return str_4k;
 }
 
+/*
+ * There are 3 types of ranges:
+ *
+ *    k : 4K size
+ *    m : 2M size
+ *    G : 1G size
+ *
+ * 1G size is only valid when CONFIG_X86_64 is set.
+ *
+ * So we can describe the possible ranges like below:
+ *
+ *               kkkmmmGGGmmmkkk
+ *               (A)(B)(C)(D)(E)
+ *
+ * This means there are at most:
+ *
+ *    3 ranges when CONFIG_X86_32 is set
+ *    5 ranges when CONFIG_X86_64 is set
+ *
+ * which corresponds to the definition of NR_RANGE_MR.
+ *
+ * split_mem_range() does the split from low to high. By naming these ranges
+ * to A, B, C, D, E respectively and marking the name in following comment, it
+ * may help you to understand how ranges are split.
+ */
 static int __meminit split_mem_range(struct map_range *mr,
                                     unsigned long start,
                                     unsigned long end)
@@ -338,7 +363,10 @@ static int __meminit split_mem_range(struct map_range *mr,
 
        limit_pfn = PFN_DOWN(end);
 
-       /* head if not big page alignment ? */
+       /*
+        * Range (A):
+        * head if not big page alignment ?
+        */
        pfn = start_pfn = PFN_DOWN(start);
 #ifdef CONFIG_X86_32
        /*
@@ -361,7 +389,10 @@ static int __meminit split_mem_range(struct map_range *mr,
                pfn = end_pfn;
        }
 
-       /* big page (2M) range */
+       /*
+        * Range (B):
+        * big page (2M) range
+        */
        start_pfn = round_up(pfn, PFN_DOWN(PMD_SIZE));
 #ifdef CONFIG_X86_32
        end_pfn = round_down(limit_pfn, PFN_DOWN(PMD_SIZE));
@@ -370,7 +401,6 @@ static int __meminit split_mem_range(struct map_range *mr,
        if (end_pfn > round_down(limit_pfn, PFN_DOWN(PMD_SIZE)))
                end_pfn = round_down(limit_pfn, PFN_DOWN(PMD_SIZE));
 #endif
-
        if (start_pfn < end_pfn) {
                nr_range = save_mr(mr, nr_range, start_pfn, end_pfn,
                                page_size_mask & (1<<PG_LEVEL_2M));
@@ -378,7 +408,10 @@ static int __meminit split_mem_range(struct map_range *mr,
        }
 
 #ifdef CONFIG_X86_64
-       /* big page (1G) range */
+       /*
+        * Range (C):
+        * big page (1G) range
+        */
        start_pfn = round_up(pfn, PFN_DOWN(PUD_SIZE));
        end_pfn = round_down(limit_pfn, PFN_DOWN(PUD_SIZE));
        if (start_pfn < end_pfn) {
@@ -388,7 +421,10 @@ static int __meminit split_mem_range(struct map_range *mr,
                pfn = end_pfn;
        }
 
-       /* tail is not big page (1G) alignment */
+       /*
+        * Range (D):
+        * big page (2M) range
+        */
        start_pfn = round_up(pfn, PFN_DOWN(PMD_SIZE));
        end_pfn = round_down(limit_pfn, PFN_DOWN(PMD_SIZE));
        if (start_pfn < end_pfn) {
@@ -398,7 +434,10 @@ static int __meminit split_mem_range(struct map_range *mr,
        }
 #endif
 
-       /* tail is not big page (2M) alignment */
+       /*
+        * Range (E):
+        * tail is not big page (2M) alignment
+        */
        start_pfn = pfn;
        end_pfn = limit_pfn;
        nr_range = save_mr(mr, nr_range, start_pfn, end_pfn, 0);
-- 
2.19.1

Reply via email to