Merge branch 'x86-mm-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip

* 'x86-mm-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
x86-64: Combine SRAT regions when possible

+48
+48
arch/x86/mm/srat_64.c
··· 363 363 for (i = 0; i < MAX_NUMNODES; i++) 364 364 cutoff_node(i, start, end); 365 365 366 + /* 367 + * Join together blocks on the same node, holes between 368 + * which don't overlap with memory on other nodes. 369 + */ 370 + for (i = 0; i < num_node_memblks; ++i) { 371 + int j, k; 372 + 373 + for (j = i + 1; j < num_node_memblks; ++j) { 374 + unsigned long start, end; 375 + 376 + if (memblk_nodeid[i] != memblk_nodeid[j]) 377 + continue; 378 + start = min(node_memblk_range[i].end, 379 + node_memblk_range[j].end); 380 + end = max(node_memblk_range[i].start, 381 + node_memblk_range[j].start); 382 + for (k = 0; k < num_node_memblks; ++k) { 383 + if (memblk_nodeid[i] == memblk_nodeid[k]) 384 + continue; 385 + if (start < node_memblk_range[k].end && 386 + end > node_memblk_range[k].start) 387 + break; 388 + } 389 + if (k < num_node_memblks) 390 + continue; 391 + start = min(node_memblk_range[i].start, 392 + node_memblk_range[j].start); 393 + end = max(node_memblk_range[i].end, 394 + node_memblk_range[j].end); 395 + printk(KERN_INFO "SRAT: Node %d " 396 + "[%Lx,%Lx) + [%Lx,%Lx) -> [%lx,%lx)\n", 397 + memblk_nodeid[i], 398 + node_memblk_range[i].start, 399 + node_memblk_range[i].end, 400 + node_memblk_range[j].start, 401 + node_memblk_range[j].end, 402 + start, end); 403 + node_memblk_range[i].start = start; 404 + node_memblk_range[i].end = end; 405 + k = --num_node_memblks - j; 406 + memmove(memblk_nodeid + j, memblk_nodeid + j+1, 407 + k * sizeof(*memblk_nodeid)); 408 + memmove(node_memblk_range + j, node_memblk_range + j+1, 409 + k * sizeof(*node_memblk_range)); 410 + --j; 411 + } 412 + } 413 + 366 414 memnode_shift = compute_hash_shift(node_memblk_range, num_node_memblks, 367 415 memblk_nodeid); 368 416 if (memnode_shift < 0) {