tree: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master head: b613c2bfa3e843fdeff95878edc7326b763abd1b commit: eddd1b1e54e09775f155bf6c8239e7167205606e [4160/4460] mm/compaction: speed up pageblock_pfn_to_page() when zone is contiguous config: i386-tinyconfig (attached as .config) reproduce: git checkout eddd1b1e54e09775f155bf6c8239e7167205606e # save the attached .config to linux build tree make ARCH=i386 Note: the linux-next/master HEAD b613c2bfa3e843fdeff95878edc7326b763abd1b builds fine. It may have been fixed somewhere. All error/warnings (new ones prefixed by >>): mm/page_alloc.c: In function 'page_alloc_init_late': >> mm/page_alloc.c:1304:3: error: implicit declaration of function 'set_zone_contiguous' [-Werror=implicit-function-declaration] set_zone_contiguous(zone); ^ mm/page_alloc.c: At top level: >> mm/page_alloc.c:1350:6: warning: conflicting types for 'set_zone_contiguous' void set_zone_contiguous(struct zone *zone) ^ mm/page_alloc.c:1304:3: note: previous implicit declaration of 'set_zone_contiguous' was here set_zone_contiguous(zone); ^ mm/page_alloc.c: In function 'set_zone_contiguous': >> mm/page_alloc.c:1354:16: warning: unused variable 'pfn' [-Wunused-variable] unsigned long pfn; ^ mm/page_alloc.c: In function 'free_area_init_nodes': mm/page_alloc.c:5929:34: warning: array subscript is below array bounds [-Warray-bounds] arch_zone_highest_possible_pfn[i-1]; ^ cc1: some warnings being treated as errors vim +/set_zone_contiguous +1304 mm/page_alloc.c 1298 1299 /* Reinit limits that are based on free pages after the kernel is up */ 1300 files_maxfiles_init(); 1301 #endif 1302 1303 for_each_populated_zone(zone) > 1304 set_zone_contiguous(zone); 1305 } 1306 1307 /* 1308 * Check that the whole (or subset of) a pageblock given by the interval of 1309 * [start_pfn, end_pfn) is valid and within the same zone, before scanning it 1310 * with the migration of free compaction scanner. The scanners then need to 1311 * use only pfn_valid_within() check for arches that allow holes within 1312 * pageblocks. 1313 * 1314 * Return struct page pointer of start_pfn, or NULL if checks were not passed. 1315 * 1316 * It's possible on some configurations to have a setup like node0 node1 node0 1317 * i.e. it's possible that all pages within a zones range of pages do not 1318 * belong to a single zone. We assume that a border between node0 and node1 1319 * can occur within a single pageblock, but not a node0 node1 node0 1320 * interleaving within a single pageblock. It is therefore sufficient to check 1321 * the first and last page of a pageblock and avoid checking each individual 1322 * page in a pageblock. 1323 */ 1324 struct page *__pageblock_pfn_to_page(unsigned long start_pfn, 1325 unsigned long end_pfn, struct zone *zone) 1326 { 1327 struct page *start_page; 1328 struct page *end_page; 1329 1330 /* end_pfn is one past the range we are checking */ 1331 end_pfn--; 1332 1333 if (!pfn_valid(start_pfn) || !pfn_valid(end_pfn)) 1334 return NULL; 1335 1336 start_page = pfn_to_page(start_pfn); 1337 1338 if (page_zone(start_page) != zone) 1339 return NULL; 1340 1341 end_page = pfn_to_page(end_pfn); 1342 1343 /* This gives a shorter code than deriving page_zone(end_page) */ 1344 if (page_zone_id(start_page) != page_zone_id(end_page)) 1345 return NULL; 1346 1347 return start_page; 1348 } 1349 > 1350 void set_zone_contiguous(struct zone *zone) 1351 { 1352 unsigned long block_start_pfn = zone->zone_start_pfn; 1353 unsigned long block_end_pfn; > 1354 unsigned long pfn; 1355 1356 block_end_pfn = ALIGN(block_start_pfn + 1, pageblock_nr_pages); 1357 for (; block_start_pfn < zone_end_pfn(zone); --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
Attachment:
.config.gz
Description: Binary data