diff options
Diffstat (limited to 'arch/ia64/mm/numa.c')
| -rw-r--r-- | arch/ia64/mm/numa.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/arch/ia64/mm/numa.c b/arch/ia64/mm/numa.c index 77118bbf3d8b..4e5c8b36ad93 100644 --- a/arch/ia64/mm/numa.c +++ b/arch/ia64/mm/numa.c | |||
| @@ -47,3 +47,27 @@ paddr_to_nid(unsigned long paddr) | |||
| 47 | 47 | ||
| 48 | return (i < num_node_memblks) ? node_memblk[i].nid : (num_node_memblks ? -1 : 0); | 48 | return (i < num_node_memblks) ? node_memblk[i].nid : (num_node_memblks ? -1 : 0); |
| 49 | } | 49 | } |
| 50 | |||
| 51 | #if defined(CONFIG_SPARSEMEM) && defined(CONFIG_NUMA) | ||
| 52 | /* | ||
| 53 | * Because of holes evaluate on section limits. | ||
| 54 | * If the section of memory exists, then return the node where the section | ||
| 55 | * resides. Otherwise return node 0 as the default. This is used by | ||
| 56 | * SPARSEMEM to allocate the SPARSEMEM sectionmap on the NUMA node where | ||
| 57 | * the section resides. | ||
| 58 | */ | ||
| 59 | int early_pfn_to_nid(unsigned long pfn) | ||
| 60 | { | ||
| 61 | int i, section = pfn >> PFN_SECTION_SHIFT, ssec, esec; | ||
| 62 | |||
| 63 | for (i = 0; i < num_node_memblks; i++) { | ||
| 64 | ssec = node_memblk[i].start_paddr >> PA_SECTION_SHIFT; | ||
| 65 | esec = (node_memblk[i].start_paddr + node_memblk[i].size + | ||
| 66 | ((1L << PA_SECTION_SHIFT) - 1)) >> PA_SECTION_SHIFT; | ||
| 67 | if (section >= ssec && section < esec) | ||
| 68 | return node_memblk[i].nid; | ||
| 69 | } | ||
| 70 | |||
| 71 | return 0; | ||
| 72 | } | ||
| 73 | #endif | ||
