On Wed, May 05, 2021 at 11:44:29AM -0700, Dan Williams wrote:
quoted
@@ -6285,6 +6285,8 @@ void __ref memmap_init_zone_device(struct zone *zone,
unsigned long pfn, end_pfn = start_pfn + nr_pages;
struct pglist_data *pgdat = zone->zone_pgdat;
struct vmem_altmap *altmap = pgmap_altmap(pgmap);
+ unsigned int pfn_align = pgmap_pfn_align(pgmap);
+ unsigned int order_align = order_base_2(pfn_align);
unsigned long zone_idx = zone_idx(zone);
unsigned long start = jiffies;
int nid = pgdat->node_id;@@ -6302,10 +6304,30 @@ void __ref memmap_init_zone_device(struct zone *zone,
nr_pages = end_pfn - start_pfn;
}
- for (pfn = start_pfn; pfn < end_pfn; pfn++) {
+ for (pfn = start_pfn; pfn < end_pfn; pfn += pfn_align) {
pfn_align is in bytes and pfn is in pages... is there a "pfn_align >>=
PAGE_SHIFT" I missed somewhere?
If something is measured in bytes, I like to use size_t (if it's
in memory) and loff_t (if it's on storage). The compiler doesn't do
anything useful to warn you, but it's a nice indication to humans about
what's going on. And it removes the temptation to do 'pfn_align >>=
PAGE_SHIFT' and suddenly take pfn_align from being measured in bytes to
being measured in pages.