On Tue, Feb 18, 2003 at 05:54:27PM +1100, Andrew Clausen wrote: > This code isn't really relevant to what I'm working on (it isn't compiled > in to kernels for the ip27), but I just noticed it, and it looks broken: > > /* Find the highest page frame number we have available. */ > max_pfn = 0; > for (i = 0; i < boot_mem_map.nr_map; i++) { > unsigned long start, end; > > if (boot_mem_map.map[i].type != BOOT_MEM_RAM) > continue; > > ***** start = PFN_UP(boot_mem_map.map[i].addr); > ***** end = PFN_DOWN(boot_mem_map.map[i].addr > + boot_mem_map.map[i].size); > > ***** if (start >= end) > continue; > if (end > max_pfn) > max_pfn = end; > } > > > That test looks like it will always succeed... and it looks like the > author wanted it to be a sanity check. > Why all this business with PFN_UP and PFN_DOWN? (They are bit > shifts... PFN_UP shifts left, PFN_DOWN shifts right) Read again. PFN_PHYS is shifting left, the others shift right. Mm is based on complete pages and page numbers. This code simply discards partial pages before initializing mm with the list of available memory. The case start > end cannot happen but start = end is possible for small areas near the end of a page - but such an area is not usable for mm so it's ignored. Ralf