@@ -5951,23 +5951,6 @@ overlap_memmap_init(unsigned long zone, unsigned long *pfn)
5951
5951
return false;
5952
5952
}
5953
5953
5954
- #ifdef CONFIG_SPARSEMEM
5955
- /* Skip PFNs that belong to non-present sections */
5956
- static inline __meminit unsigned long next_pfn (unsigned long pfn )
5957
- {
5958
- const unsigned long section_nr = pfn_to_section_nr (++ pfn );
5959
-
5960
- if (present_section_nr (section_nr ))
5961
- return pfn ;
5962
- return section_nr_to_pfn (next_present_section_nr (section_nr ));
5963
- }
5964
- #else
5965
- static inline __meminit unsigned long next_pfn (unsigned long pfn )
5966
- {
5967
- return pfn ++ ;
5968
- }
5969
- #endif
5970
-
5971
5954
/*
5972
5955
* Initially all pages are reserved - free ones are freed
5973
5956
* up by memblock_free_all() once the early boot process is
@@ -6007,14 +5990,6 @@ void __meminit memmap_init_zone(unsigned long size, int nid, unsigned long zone,
6007
5990
* function. They do not exist on hotplugged memory.
6008
5991
*/
6009
5992
if (context == MEMMAP_EARLY ) {
6010
- if (!early_pfn_valid (pfn )) {
6011
- pfn = next_pfn (pfn );
6012
- continue ;
6013
- }
6014
- if (!early_pfn_in_nid (pfn , nid )) {
6015
- pfn ++ ;
6016
- continue ;
6017
- }
6018
5993
if (overlap_memmap_init (zone , & pfn ))
6019
5994
continue ;
6020
5995
if (defer_init (nid , pfn , end_pfn ))
@@ -6130,9 +6105,23 @@ static void __meminit zone_init_free_lists(struct zone *zone)
6130
6105
}
6131
6106
6132
6107
void __meminit __weak memmap_init (unsigned long size , int nid ,
6133
- unsigned long zone , unsigned long start_pfn )
6108
+ unsigned long zone ,
6109
+ unsigned long range_start_pfn )
6134
6110
{
6135
- memmap_init_zone (size , nid , zone , start_pfn , MEMMAP_EARLY , NULL );
6111
+ unsigned long start_pfn , end_pfn ;
6112
+ unsigned long range_end_pfn = range_start_pfn + size ;
6113
+ int i ;
6114
+
6115
+ for_each_mem_pfn_range (i , nid , & start_pfn , & end_pfn , NULL ) {
6116
+ start_pfn = clamp (start_pfn , range_start_pfn , range_end_pfn );
6117
+ end_pfn = clamp (end_pfn , range_start_pfn , range_end_pfn );
6118
+
6119
+ if (end_pfn > start_pfn ) {
6120
+ size = end_pfn - start_pfn ;
6121
+ memmap_init_zone (size , nid , zone , start_pfn ,
6122
+ MEMMAP_EARLY , NULL );
6123
+ }
6124
+ }
6136
6125
}
6137
6126
6138
6127
static int zone_batchsize (struct zone * zone )
0 commit comments