NUMA: order nodes by distance for MPOL_BIND / MPOL_PREFERRED policies as well

This commit is contained in:
Balazs Gerofi
2017-01-03 08:58:50 +09:00
parent 5bac38ce8b
commit c40e7105e6

View File

@@ -508,15 +508,27 @@ static void *mckernel_allocate_aligned_pages_node(int npages, int p2align,
goto distance_based; goto distance_based;
} }
node = ihk_mc_get_numa_id();
if (!memory_nodes[node].nodes_by_distance)
goto order_based;
switch (cpu_local_var(current)->vm->numa_mem_policy) { switch (cpu_local_var(current)->vm->numa_mem_policy) {
case MPOL_BIND: case MPOL_BIND:
case MPOL_PREFERRED: case MPOL_PREFERRED:
for_each_set_bit(node,
cpu_local_var(current)->proc->vm->numa_mask, /* Look at nodes in the order of distance but consider
ihk_mc_get_nr_numa_nodes()) { * only the ones requested in user policy */
for (i = 0; i < ihk_mc_get_nr_numa_nodes(); ++i) {
/* Not part of user requested policy? */
if (!test_bit(memory_nodes[node].nodes_by_distance[i].id,
cpu_local_var(current)->proc->vm->numa_mask)) {
continue;
}
list_for_each_entry(pa_allocator, list_for_each_entry(pa_allocator,
&memory_nodes[node].allocators, list) { &memory_nodes[memory_nodes[node].
nodes_by_distance[i].id].allocators, list) {
pa = ihk_pagealloc_alloc(pa_allocator, npages, p2align); pa = ihk_pagealloc_alloc(pa_allocator, npages, p2align);
if (pa) { if (pa) {