Skip to content

Commit

Permalink
stress-*: ensure numa mask frees are performed correctly
Browse files Browse the repository at this point in the history
Signed-off-by: Colin Ian King <colin.i.king@gmail.com>
  • Loading branch information
ColinIanKing committed Jan 22, 2025
1 parent b9a7bd9 commit faf4a6a
Show file tree
Hide file tree
Showing 14 changed files with 148 additions and 86 deletions.
35 changes: 20 additions & 15 deletions stress-llc-affinity.c
Original file line number Diff line number Diff line change
Expand Up @@ -370,10 +370,29 @@ static int stress_llc_affinity(stress_args_t *args)
}
}

mmap_sz = STRESS_MAXIMUM(n_cpus * page_size, llc_size);

/*
* Allocate a LLC sized buffer to exercise
*/
buf = (uint64_t *)stress_mmap_populate(NULL, mmap_sz, PROT_READ | PROT_WRITE,
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
if (buf == MAP_FAILED) {
pr_fail("%s: mmap'd region of %zu bytes failed\n", args->name, mmap_sz);
stress_free_usable_cpus(&cpus);
return EXIT_NO_RESOURCE;
}
stress_set_vma_anon_name(buf, mmap_sz, "llc-buffer");

if (llc_affinity_numa) {
#if defined(HAVE_LINUX_MEMPOLICY_H)
if (stress_numa_nodes() > 1) {
numa_mask = stress_numa_mask_alloc();
if (!numa_mask) {
pr_inf("%s: cannot allocate NUMA mask, disabling --llc-affinity-numa\n",
args->name);
llc_affinity_numa = false;
}
} else {
if (args->instance == 0) {
pr_inf("%s: only 1 NUMA node available, disabling --llc-affinity-numa\n",
Expand All @@ -388,22 +407,8 @@ static int stress_llc_affinity(stress_args_t *args)
llc_affinity_numa = false;
#endif
}

mmap_sz = STRESS_MAXIMUM(n_cpus * page_size, llc_size);

/*
* Allocate a LLC sized buffer to exercise
*/
buf = (uint64_t *)stress_mmap_populate(NULL, mmap_sz, PROT_READ | PROT_WRITE,
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
if (buf == MAP_FAILED) {
pr_fail("%s: mmap'd region of %zu bytes failed\n", args->name, mmap_sz);
stress_free_usable_cpus(&cpus);
return EXIT_NO_RESOURCE;
}
stress_set_vma_anon_name(buf, mmap_sz, "llc-buffer");
#if defined(HAVE_LINUX_MEMPOLICY_H)
if (llc_affinity_numa) {
if (llc_affinity_numa && numa_mask) {
stress_numa_randomize_pages(numa_mask, buf, page_size, mmap_sz);
stress_numa_mask_free(numa_mask);
}
Expand Down
46 changes: 26 additions & 20 deletions stress-mcontend.c
Original file line number Diff line number Diff line change
Expand Up @@ -464,25 +464,6 @@ static int stress_mcontend(stress_args_t *args)
n_cpus = stress_get_usable_cpus(&cpus, true);
#endif

if (mcontend_numa) {
#if defined(HAVE_LINUX_MEMPOLICY_H)
if (stress_numa_nodes() > 1) {
numa_mask = stress_numa_mask_alloc();
} else {
if (args->instance == 0) {
pr_inf("%s: only 1 NUMA node available, disabling --mcontend-numa\n",
args->name);
mcontend_numa = false;
}
}
#else
if (args->instance == 0)
pr_inf("%s: --mcontend-numa selected but not supported by this system, disabling option\n",
args->name);
mcontend_numa = false;
#endif
}

rc = stress_temp_dir_mk_args(args);
if (rc < 0) {
#if defined(HAVE_SCHED_SETAFFINITY)
Expand Down Expand Up @@ -550,8 +531,33 @@ static int stress_mcontend(stress_args_t *args)
return EXIT_NO_RESOURCE;
}
(void)close(fd);

if (mcontend_numa) {
#if defined(HAVE_LINUX_MEMPOLICY_H)
if (stress_numa_nodes() > 1) {
numa_mask = stress_numa_mask_alloc();
if (!numa_mask) {
pr_inf("%s: cannot allocate NUMA mask, disabling --mcontend-numa\n",
args->name);
mcontend_numa = false;
}
} else {
if (args->instance == 0) {
pr_inf("%s: only 1 NUMA node available, disabling --mcontend-numa\n",
args->name);
mcontend_numa = false;
}
}
#else
if (args->instance == 0)
pr_inf("%s: --mcontend-numa selected but not supported by this system, disabling option\n",
args->name);
mcontend_numa = false;
#endif
}

#if defined(HAVE_LINUX_MEMPOLICY_H)
if (mcontend_numa) {
if (mcontend_numa && numa_mask) {
stress_numa_randomize_pages(numa_mask, data[0], page_size, page_size);
stress_numa_randomize_pages(numa_mask, data[1], page_size, page_size);
stress_numa_mask_free(numa_mask);
Expand Down
47 changes: 26 additions & 21 deletions stress-memfd.c
Original file line number Diff line number Diff line change
Expand Up @@ -206,25 +206,6 @@ static int stress_memfd_child(stress_args_t *args, void *context)
}
#endif

if (memfd_numa) {
#if defined(HAVE_LINUX_MEMPOLICY_H)
if (stress_numa_nodes() > 1) {
numa_mask = stress_numa_mask_alloc();
} else {
if (args->instance == 0) {
pr_inf("%s: only 1 NUMA node available, disabling --memfd-numa\n",
args->name);
memfd_numa = false;
}
}
#else
if (args->instance == 0)
pr_inf("%s: --memfd-numa selected but not supported by this system, disabling option\n",
args->name);
memfd_numa = false;
#endif
}

#if !defined(HAVE_MADVISE) || \
!defined(MADV_PAGEOUT)
if (memfd_zap_pte) {
Expand Down Expand Up @@ -266,6 +247,30 @@ static int stress_memfd_child(stress_args_t *args, void *context)
return EXIT_NO_RESOURCE;
}

if (memfd_numa) {
#if defined(HAVE_LINUX_MEMPOLICY_H)
if (stress_numa_nodes() > 1) {
numa_mask = stress_numa_mask_alloc();
if (!numa_mask) {
pr_inf("%s: cannot allocate NUMA mask, disabling --memfd-numa\n",
args->name);
memfd_numa = false;
}
} else {
if (args->instance == 0) {
pr_inf("%s: only 1 NUMA node available, disabling --memfd-numa\n",
args->name);
memfd_numa = false;
}
}
#else
if (args->instance == 0)
pr_inf("%s: --memfd-numa selected but not supported by this system, disabling option\n",
args->name);
memfd_numa = false;
#endif
}

stress_rndstr(filename_rndstr, sizeof(filename_rndstr));
(void)snprintf(filename_unusual, sizeof(filename_unusual),
"memfd-%c[H%c%c:?*~", 27, 7, 255);
Expand Down Expand Up @@ -364,7 +369,7 @@ static int stress_memfd_child(stress_args_t *args, void *context)
if (memfd_mlock)
(void)shim_mlock(maps[i], size);
#if defined(HAVE_LINUX_MEMPOLICY_H)
if (memfd_numa)
if (memfd_numa && numa_mask)
stress_numa_randomize_pages(numa_mask, maps[i], size, page_size);
#endif
stress_memfd_fill_pages_generic(stress_mwc64(), maps[i], size);
Expand Down Expand Up @@ -559,7 +564,7 @@ static int stress_memfd_child(stress_args_t *args, void *context)
rate * STRESS_DBL_NANOSECOND, STRESS_METRIC_HARMONIC_MEAN);

#if defined(HAVE_LINUX_MEMPOLICY_H)
if (memfd_numa)
if (numa_mask)
stress_numa_mask_free(numa_mask);
#endif
free(maps);
Expand Down
3 changes: 2 additions & 1 deletion stress-memthrash.c
Original file line number Diff line number Diff line change
Expand Up @@ -995,7 +995,8 @@ static int stress_memthrash(stress_args_t *args)

stress_set_proc_state(args->name, STRESS_STATE_DEINIT);
#if defined(HAVE_MEMTHRASH_NUMA)
stress_numa_mask_free(context.numa_mask);
if (context.numa_mask)
stress_numa_mask_free(context.numa_mask);
#endif

return rc;
Expand Down
3 changes: 2 additions & 1 deletion stress-misaligned.c
Original file line number Diff line number Diff line change
Expand Up @@ -1317,7 +1317,8 @@ static int stress_misaligned(stress_args_t *args)
stress_set_proc_state(args->name, STRESS_STATE_DEINIT);

#if defined(HAVE_MISALIGNED_NUMA)
stress_numa_mask_free(numa_mask);
if (numa_mask)
stress_numa_mask_free(numa_mask);
#endif
(void)munmap((void *)buffer, buffer_size);

Expand Down
5 changes: 5 additions & 0 deletions stress-mmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -1062,6 +1062,11 @@ static int stress_mmap(stress_args_t *args)
#if defined(HAVE_LINUX_MEMPOLICY_H)
if (stress_numa_nodes() > 1) {
context.numa_mask = stress_numa_mask_alloc();
if (!context.numa_mask) {
pr_inf("%s: cannot allocate NUMA mask, disabling --mmap-numa\n",
args->name);
context.mmap_numa = false;
}
} else {
if (args->instance == 0)
pr_inf("%s: only 1 NUMA node available, disabling --mmap-numa\n",
Expand Down
7 changes: 6 additions & 1 deletion stress-mmapfiles.c
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,11 @@ static int stress_mmapfiles(stress_args_t *args)
#if defined(HAVE_LINUX_MEMPOLICY_H)
if (stress_numa_nodes() > 1) {
mmapfile_info->numa_mask = stress_numa_mask_alloc();
if (!mmapfile_info->numa_mask) {
pr_inf("%s: cannot allocate NUMA mask, disabling --mapfiles-numa\n",
args->name);
mmapfile_info->mmapfiles_numa = false;
}
} else {
if (args->instance == 0) {
pr_inf("%s: only 1 NUMA node available, disabling --mmapfiles-numa\n",
Expand Down Expand Up @@ -297,7 +302,7 @@ static int stress_mmapfiles(stress_args_t *args)
stress_metrics_set(args, 4, "pages per mapping", metric, STRESS_METRIC_HARMONIC_MEAN);

#if defined(HAVE_LINUX_MEMPOLICY_H)
if (mmapfile_info->mmapfiles_numa)
if (mmapfile_info->numa_mask)
stress_numa_mask_free(mmapfile_info->numa_mask);
#endif
(void)munmap((void *)mmapfile_info, sizeof(*mmapfile_info));
Expand Down
7 changes: 6 additions & 1 deletion stress-mmapfixed.c
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,11 @@ static int stress_mmapfixed(stress_args_t *args)
#if defined(HAVE_LINUX_MEMPOLICY_H)
if (stress_numa_nodes() >= 1) {
info.numa_mask = stress_numa_mask_alloc();
if (!info.numa_mask) {
pr_inf("%s: cannot allocate NUMA mask, disabling --mmapfixed-numa\n",
args->name);
info.mmapfixed_numa = false;
}
} else {
if (args->instance == 0) {
pr_inf("%s: only 1 NUMA node available, disabling --mmapfixed-numa\n",
Expand All @@ -296,7 +301,7 @@ static int stress_mmapfixed(stress_args_t *args)
ret = stress_oomable_child(args, &info, stress_mmapfixed_child, STRESS_OOMABLE_QUIET);

#if defined(HAVE_LINUX_MEMPOLICY_H)
if (info.mmapfixed_numa)
if (info.numa_mask)
stress_numa_mask_free(info.numa_mask);
#endif

Expand Down
8 changes: 6 additions & 2 deletions stress-mmaphuge.c
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,11 @@ static int stress_mmaphuge(stress_args_t *args)
#if defined(HAVE_LINUX_MEMPOLICY_H)
if (stress_numa_nodes() > 1) {
ctxt.numa_mask = stress_numa_mask_alloc();
if (!ctxt.numa_mask) {
pr_inf("%s: cannot allocate NUMA mask, disabling --mmaphuge-numa\n",
args->name);
ctxt.mmaphuge_numa = false;
}
} else {
if (args->instance == 0) {
pr_inf("%s: only 1 NUMA node available, disabling --mmaphuge-numa\n",
Expand All @@ -332,9 +337,8 @@ static int stress_mmaphuge(stress_args_t *args)
ret = stress_oomable_child(args, (void *)&ctxt, stress_mmaphuge_child, STRESS_OOMABLE_QUIET);

#if defined(HAVE_LINUX_MEMPOLICY_H)
if (ctxt.mmaphuge_numa) {
if (ctxt.numa_mask)
stress_numa_mask_free(ctxt.numa_mask);
}
#endif
free(ctxt.bufs);

Expand Down
7 changes: 6 additions & 1 deletion stress-mmapmany.c
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,11 @@ static int stress_mmapmany_child(stress_args_t *args, void *context)
#if defined(HAVE_LINUX_MEMPOLICY_H)
if (stress_numa_nodes() > 1) {
numa_mask = stress_numa_mask_alloc();
if (!numa_mask) {
pr_inf("%s: cannot allocate NUMA mask, disabling --mmapmany-numa\n",
args->name);
mmapmany_numa = false;
}
} else {
if (args->instance == 0) {
pr_inf("%s: only 1 NUMA node available, disabling --mmapmany-numa\n",
Expand Down Expand Up @@ -160,7 +165,7 @@ static int stress_mmapmany_child(stress_args_t *args, void *context)
stress_set_proc_state(args->name, STRESS_STATE_DEINIT);

#if defined(HAVE_LINUX_MEMPOLICY_H)
if (mmapmany_numa)
if (numa_mask)
stress_numa_mask_free(numa_mask);
#endif
free(mappings);
Expand Down
7 changes: 6 additions & 1 deletion stress-mremap.c
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,11 @@ static int stress_mremap_child(stress_args_t *args, void *context)
#if defined(HAVE_LINUX_MEMPOLICY_H)
if (stress_numa_nodes() > 1) {
numa_mask = stress_numa_mask_alloc();
if (!numa_mask) {
pr_inf("%s: cannot allocate NUMA mask, disabling --mremap-numa\n",
args->name);
mremap_numa = false;
}
} else {
if (args->instance == 0) {
pr_inf("%s: only 1 NUMA node available, disabling --mremap-numa\n",
Expand Down Expand Up @@ -362,7 +367,7 @@ static int stress_mremap_child(stress_args_t *args, void *context)
rate * STRESS_DBL_NANOSECOND, STRESS_METRIC_HARMONIC_MEAN);

#if defined(HAVE_LINUX_MEMPOLICY_H)
if (mremap_numa)
if (numa_mask)
stress_numa_mask_free(numa_mask);
#endif

Expand Down
45 changes: 25 additions & 20 deletions stress-pagemove.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,25 +82,6 @@ static int stress_pagemove_child(stress_args_t *args, void *context)
(void)stress_get_setting("pagemove-mlock", &pagemove_mlock);
(void)stress_get_setting("pagemove-numa", &pagemove_numa);

if (pagemove_numa) {
#if defined(HAVE_LINUX_MEMPOLICY_H)
if (stress_numa_nodes() > 1) {
numa_mask = stress_numa_mask_alloc();
} else {
if (args->instance == 0) {
pr_inf("%s: only 1 NUMA node available, disabling --pagemove-numa\n",
args->name);
pagemove_numa = false;
}
}
#else
if (args->instance == 0)
pr_inf("%s: --pagemove-numa selected but not supported by this system, disabling option\n",
args->name);
pagemove_numa = false;
#endif
}

if (!stress_get_setting("pagemove-bytes", &pagemove_bytes)) {
if (g_opt_flags & OPT_FLAGS_MAXIMIZE)
pagemove_bytes = MAX_32;
Expand Down Expand Up @@ -131,6 +112,30 @@ static int stress_pagemove_child(stress_args_t *args, void *context)
unmapped_page = buf_end;
(void)munmap((void *)unmapped_page, page_size);

if (pagemove_numa) {
#if defined(HAVE_LINUX_MEMPOLICY_H)
if (stress_numa_nodes() > 1) {
numa_mask = stress_numa_mask_alloc();
if (!numa_mask) {
pr_inf("%s: cannot allocate NUMA mask, disabling --pagemove-numa\n",
args->name);
pagemove_numa = false;
}
} else {
if (args->instance == 0) {
pr_inf("%s: only 1 NUMA node available, disabling --pagemove-numa\n",
args->name);
pagemove_numa = false;
}
}
#else
if (args->instance == 0)
pr_inf("%s: --pagemove-numa selected but not supported by this system, disabling option\n",
args->name);
pagemove_numa = false;
#endif
}

stress_set_proc_state(args->name, STRESS_STATE_SYNC_WAIT);
stress_sync_start_wait(args);
stress_set_proc_state(args->name, STRESS_STATE_RUN);
Expand Down Expand Up @@ -285,7 +290,7 @@ static int stress_pagemove_child(stress_args_t *args, void *context)
stress_set_proc_state(args->name, STRESS_STATE_DEINIT);
(void)munmap((void *)buf, sz);
#if defined(HAVE_LINUX_MEMPOLICY_H)
if (pagemove_numa)
if (numa_mask)
stress_numa_mask_free(numa_mask);
#endif

Expand Down
Loading

0 comments on commit faf4a6a

Please sign in to comment.