114 lines
3.8 KiB
Diff
114 lines
3.8 KiB
Diff
diff --git a/kernel/include/process.h b/kernel/include/process.h
|
|
index 6f34ee2..503217c 100644
|
|
--- a/kernel/include/process.h
|
|
+++ b/kernel/include/process.h
|
|
@@ -750,6 +750,11 @@ struct process_vm {
|
|
long currss;
|
|
DECLARE_BITMAP(numa_mask, PROCESS_NUMA_MASK_BITS);
|
|
int numa_mem_policy;
|
|
+
|
|
+#if 1 /* For mbind test */
|
|
+ int numa_mem_policy_trace;
|
|
+#endif
|
|
+
|
|
/* Protected by memory_range_lock */
|
|
struct rb_root vm_range_numa_policy_tree;
|
|
struct vm_range *range_cache[VM_RANGE_CACHE_SIZE];
|
|
diff --git a/kernel/mem.c b/kernel/mem.c
|
|
index 1e0d8f8..e2ce780 100644
|
|
--- a/kernel/mem.c
|
|
+++ b/kernel/mem.c
|
|
@@ -540,6 +540,15 @@ static void reserve_pages(struct ihk_page_allocator_desc *pa_allocator,
|
|
ihk_pagealloc_reserve(pa_allocator, start, end);
|
|
}
|
|
|
|
+#if 1 /* For mbind test */
|
|
+char *mempolicy [] = {
|
|
+ "MPOL_DEFAULT",
|
|
+ "MPOL_PREFERRED",
|
|
+ "MPOL_BIND",
|
|
+ "MPOL_INTERLEAVE"
|
|
+};
|
|
+#endif
|
|
+
|
|
extern int cpu_local_var_initialized;
|
|
static void *mckernel_allocate_aligned_pages_node(int npages, int p2align,
|
|
ihk_mc_ap_flag flag, int pref_node, int is_user, uintptr_t virt_addr)
|
|
@@ -649,6 +658,19 @@ static void *mckernel_allocate_aligned_pages_node(int npages, int p2align,
|
|
}
|
|
}
|
|
|
|
+#if 1 /* For mbind test */
|
|
+ if (is_user && cpu_local_var(current)->vm->numa_mem_policy_trace && !range_policy_iter && numa_mem_policy == -1 && virt_addr != -1) {
|
|
+ int chk_shm;
|
|
+
|
|
+ range = lookup_process_memory_range(cpu_local_var(current)->vm, (uintptr_t)virt_addr, ((uintptr_t)virt_addr) + 1);
|
|
+ chk_shm = (range && range->memobj && (range->memobj->flags & MF_SHM)) ? 1 : 0;
|
|
+
|
|
+ kprintf("%s[%d]: applying default-policy, addr(0x%016lx) policy(%s) <default policy%s>\n",
|
|
+ __func__, __LINE__, virt_addr, mempolicy[(cpu_local_var(current)->vm->numa_mem_policy & 0x3)],
|
|
+ chk_shm ? ":Mapping of MAP_SHARED" : "");
|
|
+ }
|
|
+#endif
|
|
+
|
|
if (numa_mem_policy == -1)
|
|
numa_mem_policy = cpu_local_var(current)->vm->numa_mem_policy;
|
|
|
|
@@ -709,6 +731,13 @@ static void *mckernel_allocate_aligned_pages_node(int npages, int p2align,
|
|
default:
|
|
break;
|
|
}
|
|
+
|
|
+#if 1 /* For mbind test */
|
|
+ if (is_user && cpu_local_var(current)->vm->numa_mem_policy_trace && pa && range_policy_iter) {
|
|
+ kprintf("%s[%d]: applying addr-policy (and it's not default-policy), addr(0x%016lx) policy(%s) <addr policy>\n",
|
|
+ __func__, __LINE__, virt_addr, mempolicy[(numa_mem_policy & 0x3)], numa_mem_policy);
|
|
+ }
|
|
+#endif
|
|
|
|
if (pa) {
|
|
return phys_to_virt(pa);
|
|
@@ -765,6 +794,25 @@ distance_based:
|
|
if (pa) break;
|
|
}
|
|
|
|
+#if 1 /* For mbind test */
|
|
+ if (is_user && cpu_local_var(current)->vm->numa_mem_policy_trace && pa) {
|
|
+ if (range_policy_iter) {
|
|
+ kprintf("%s[%d]: applying addr-policy (and it's default-policy), addr(0x%016lx) policy(%s) <addr policy>\n",
|
|
+ __func__, __LINE__, virt_addr, mempolicy[(cpu_local_var(current)->vm->numa_mem_policy & 0x3)]);
|
|
+ } else {
|
|
+ int chk_shm = 0;
|
|
+ if (virt_addr != -1) {
|
|
+ range = lookup_process_memory_range(cpu_local_var(current)->vm, (uintptr_t)virt_addr, ((uintptr_t)virt_addr) + 1);
|
|
+ chk_shm = (range && range->memobj && (range->memobj->flags & MF_SHM)) ? 1 : 0;
|
|
+ }
|
|
+ kprintf("%s[%d]: applying default-policy, addr(0x%016lx) policy(%s) <default policy%s>\n",
|
|
+ __func__, __LINE__, virt_addr != -1 ? virt_addr : (unsigned long)phys_to_virt(pa),
|
|
+ mempolicy[(cpu_local_var(current)->vm->numa_mem_policy & 0x3)],
|
|
+ chk_shm ? ":Mapping of MAP_SHARED" : "");
|
|
+ }
|
|
+ }
|
|
+#endif
|
|
+
|
|
if (pa)
|
|
return phys_to_virt(pa);
|
|
|
|
diff --git a/kernel/syscall.c b/kernel/syscall.c
|
|
index 4f24065..5c307a1 100644
|
|
--- a/kernel/syscall.c
|
|
+++ b/kernel/syscall.c
|
|
@@ -8841,6 +8841,12 @@ SYSCALL_DECLARE(set_mempolicy)
|
|
error = -EINVAL;
|
|
}
|
|
|
|
+
|
|
+#if 1 /* For mbind test */
|
|
+ vm->numa_mem_policy_trace = 1;
|
|
+ kprintf("numa_mem_policy=%x\n", mode);
|
|
+#endif
|
|
+
|
|
dkprintf("%s: %s set for PID %d\n",
|
|
__FUNCTION__,
|
|
mode == MPOL_DEFAULT ? "MPOL_DEFAULT" :
|