Loading arch/x86/mm/numa_64.c +43 −7 Original line number Diff line number Diff line Loading @@ -205,6 +205,14 @@ static int __init numa_add_memblk_to(int nid, u64 start, u64 end, return 0; } /** * numa_remove_memblk_from - Remove one numa_memblk from a numa_meminfo * @idx: Index of memblk to remove * @mi: numa_meminfo to remove memblk from * * Remove @idx'th numa_memblk from @mi by shifting @mi->blk[] and * decrementing @mi->nr_blks. */ void __init numa_remove_memblk_from(int idx, struct numa_meminfo *mi) { mi->nr_blks--; Loading @@ -212,6 +220,17 @@ void __init numa_remove_memblk_from(int idx, struct numa_meminfo *mi) (mi->nr_blks - idx) * sizeof(mi->blk[0])); } /** * numa_add_memblk - Add one numa_memblk to numa_meminfo * @nid: NUMA node ID of the new memblk * @start: Start address of the new memblk * @end: End address of the new memblk * * Add a new memblk to the default numa_meminfo. * * RETURNS: * 0 on success, -errno on failure. */ int __init numa_add_memblk(int nid, u64 start, u64 end) { return numa_add_memblk_to(nid, start, end, &numa_meminfo); Loading Loading @@ -263,6 +282,16 @@ setup_node_bootmem(int nodeid, unsigned long start, unsigned long end) node_set_online(nodeid); } /** * numa_cleanup_meminfo - Cleanup a numa_meminfo * @mi: numa_meminfo to clean up * * Sanitize @mi by merging and removing unncessary memblks. Also check for * conflicts and clear unused memblks. * * RETURNS: * 0 on success, -errno on failure. */ int __init numa_cleanup_meminfo(struct numa_meminfo *mi) { const u64 low = 0; Loading Loading @@ -353,9 +382,11 @@ static void __init numa_nodemask_from_meminfo(nodemask_t *nodemask, node_set(mi->blk[i].nid, *nodemask); } /* * Reset distance table. The current table is freed. The next * numa_set_distance() call will create a new one. /** * numa_reset_distance - Reset NUMA distance table * * The current table is freed. The next numa_set_distance() call will * create a new one. */ void __init numa_reset_distance(void) { Loading @@ -370,10 +401,15 @@ void __init numa_reset_distance(void) numa_distance = NULL; } /* * Set the distance between node @from to @to to @distance. If distance * table doesn't exist, one which is large enough to accomodate all the * currently known nodes will be created. /** * numa_set_distance - Set NUMA distance from one NUMA to another * @from: the 'from' node to set distance * @to: the 'to' node to set distance * @distance: NUMA distance * * Set the distance from node @from to @to to @distance. If distance table * doesn't exist, one which is large enough to accomodate all the currently * known nodes will be created. */ void __init numa_set_distance(int from, int to, int distance) { Loading arch/x86/mm/numa_emulation.c +26 −3 Original line number Diff line number Diff line Loading @@ -267,9 +267,32 @@ static int __init split_nodes_size_interleave(struct numa_meminfo *ei, return 0; } /* * Sets up the system RAM area from start_pfn to last_pfn according to the * numa=fake command-line option. /** * numa_emulation - Emulate NUMA nodes * @numa_meminfo: NUMA configuration to massage * @numa_dist_cnt: The size of the physical NUMA distance table * * Emulate NUMA nodes according to the numa=fake kernel parameter. * @numa_meminfo contains the physical memory configuration and is modified * to reflect the emulated configuration on success. @numa_dist_cnt is * used to determine the size of the physical distance table. * * On success, the following modifications are made. * * - @numa_meminfo is updated to reflect the emulated nodes. * * - __apicid_to_node[] is updated such that APIC IDs are mapped to the * emulated nodes. * * - NUMA distance table is rebuilt to represent distances between emulated * nodes. The distances are determined considering how emulated nodes * are mapped to physical nodes and match the actual distances. * * - emu_nid_to_phys[] reflects how emulated nodes are mapped to physical * nodes. This is used by numa_add_cpu() and numa_remove_cpu(). * * If emulation is not enabled or fails, emu_nid_to_phys[] is filled with * identity mapping and no other modification is made. */ void __init numa_emulation(struct numa_meminfo *numa_meminfo, int numa_dist_cnt) { Loading Loading
arch/x86/mm/numa_64.c +43 −7 Original line number Diff line number Diff line Loading @@ -205,6 +205,14 @@ static int __init numa_add_memblk_to(int nid, u64 start, u64 end, return 0; } /** * numa_remove_memblk_from - Remove one numa_memblk from a numa_meminfo * @idx: Index of memblk to remove * @mi: numa_meminfo to remove memblk from * * Remove @idx'th numa_memblk from @mi by shifting @mi->blk[] and * decrementing @mi->nr_blks. */ void __init numa_remove_memblk_from(int idx, struct numa_meminfo *mi) { mi->nr_blks--; Loading @@ -212,6 +220,17 @@ void __init numa_remove_memblk_from(int idx, struct numa_meminfo *mi) (mi->nr_blks - idx) * sizeof(mi->blk[0])); } /** * numa_add_memblk - Add one numa_memblk to numa_meminfo * @nid: NUMA node ID of the new memblk * @start: Start address of the new memblk * @end: End address of the new memblk * * Add a new memblk to the default numa_meminfo. * * RETURNS: * 0 on success, -errno on failure. */ int __init numa_add_memblk(int nid, u64 start, u64 end) { return numa_add_memblk_to(nid, start, end, &numa_meminfo); Loading Loading @@ -263,6 +282,16 @@ setup_node_bootmem(int nodeid, unsigned long start, unsigned long end) node_set_online(nodeid); } /** * numa_cleanup_meminfo - Cleanup a numa_meminfo * @mi: numa_meminfo to clean up * * Sanitize @mi by merging and removing unncessary memblks. Also check for * conflicts and clear unused memblks. * * RETURNS: * 0 on success, -errno on failure. */ int __init numa_cleanup_meminfo(struct numa_meminfo *mi) { const u64 low = 0; Loading Loading @@ -353,9 +382,11 @@ static void __init numa_nodemask_from_meminfo(nodemask_t *nodemask, node_set(mi->blk[i].nid, *nodemask); } /* * Reset distance table. The current table is freed. The next * numa_set_distance() call will create a new one. /** * numa_reset_distance - Reset NUMA distance table * * The current table is freed. The next numa_set_distance() call will * create a new one. */ void __init numa_reset_distance(void) { Loading @@ -370,10 +401,15 @@ void __init numa_reset_distance(void) numa_distance = NULL; } /* * Set the distance between node @from to @to to @distance. If distance * table doesn't exist, one which is large enough to accomodate all the * currently known nodes will be created. /** * numa_set_distance - Set NUMA distance from one NUMA to another * @from: the 'from' node to set distance * @to: the 'to' node to set distance * @distance: NUMA distance * * Set the distance from node @from to @to to @distance. If distance table * doesn't exist, one which is large enough to accomodate all the currently * known nodes will be created. */ void __init numa_set_distance(int from, int to, int distance) { Loading
arch/x86/mm/numa_emulation.c +26 −3 Original line number Diff line number Diff line Loading @@ -267,9 +267,32 @@ static int __init split_nodes_size_interleave(struct numa_meminfo *ei, return 0; } /* * Sets up the system RAM area from start_pfn to last_pfn according to the * numa=fake command-line option. /** * numa_emulation - Emulate NUMA nodes * @numa_meminfo: NUMA configuration to massage * @numa_dist_cnt: The size of the physical NUMA distance table * * Emulate NUMA nodes according to the numa=fake kernel parameter. * @numa_meminfo contains the physical memory configuration and is modified * to reflect the emulated configuration on success. @numa_dist_cnt is * used to determine the size of the physical distance table. * * On success, the following modifications are made. * * - @numa_meminfo is updated to reflect the emulated nodes. * * - __apicid_to_node[] is updated such that APIC IDs are mapped to the * emulated nodes. * * - NUMA distance table is rebuilt to represent distances between emulated * nodes. The distances are determined considering how emulated nodes * are mapped to physical nodes and match the actual distances. * * - emu_nid_to_phys[] reflects how emulated nodes are mapped to physical * nodes. This is used by numa_add_cpu() and numa_remove_cpu(). * * If emulation is not enabled or fails, emu_nid_to_phys[] is filled with * identity mapping and no other modification is made. */ void __init numa_emulation(struct numa_meminfo *numa_meminfo, int numa_dist_cnt) { Loading