diff options
| -rw-r--r-- | arch/x86/mm/srat_64.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/arch/x86/mm/srat_64.c b/arch/x86/mm/srat_64.c index 38512d0c4742..f9897f7a9ef1 100644 --- a/arch/x86/mm/srat_64.c +++ b/arch/x86/mm/srat_64.c | |||
| @@ -363,6 +363,54 @@ int __init acpi_scan_nodes(unsigned long start, unsigned long end) | |||
| 363 | for (i = 0; i < MAX_NUMNODES; i++) | 363 | for (i = 0; i < MAX_NUMNODES; i++) |
| 364 | cutoff_node(i, start, end); | 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 | memnode_shift = compute_hash_shift(node_memblk_range, num_node_memblks, | 414 | memnode_shift = compute_hash_shift(node_memblk_range, num_node_memblks, |
| 367 | memblk_nodeid); | 415 | memblk_nodeid); |
| 368 | if (memnode_shift < 0) { | 416 | if (memnode_shift < 0) { |
