The inactive variants of test_numa_migrate report their pages populated
before they madvise(MADV_COLD) them. The parent starts the migration as
soon as 85% of the pages are inactive on the source node, while the
rest are still being deactivated. memory.numa_migrate takes the size of
each LRU list as its scan budget when it gets to the list, so the pages
that become inactive later are not scanned, and up to the 15% that
verify_stats() tolerates can stay behind. The slower a kernel
deactivates the pages, the more often the test fails, which made
inactive_disk_file fail often on coverage kernels.
Call madvise(MADV_COLD) before reporting the pages populated.
Fixes: 3842964f4497 ("selftests: cgroup: test numa migration of lruvecs")
https://virtuozzo.atlassian.net/browse/VSTOR-154520
Feature: fix selftests
Signed-off-by: Eva Kurchatova <[email protected]>
---
.../selftests/cgroup/test_numa_migrate.c | 19 +++++++++++--------
1 file changed, 11 insertions(+), 8 deletions(-)
diff --git a/tools/testing/selftests/cgroup/test_numa_migrate.c
b/tools/testing/selftests/cgroup/test_numa_migrate.c
index 5f4a55684f61..12c9bab79d6e 100644
--- a/tools/testing/selftests/cgroup/test_numa_migrate.c
+++ b/tools/testing/selftests/cgroup/test_numa_migrate.c
@@ -587,12 +587,15 @@ static int touch_pages(const char *cgroup, void *arg)
void *mmap_ptr;
volatile uint8_t *ptr;
enum memory_type mem_type;
+ bool inactive;
char tmp = 's';
struct test_context *ctx = arg;
int ret = EXIT_SUCCESS;
EXPAND_CTX(ctx);
mem_type = variant->mem_type;
+ inactive = mem_type == MEMORY_TYPE_INACTIVE_FILE ||
+ mem_type == MEMORY_TYPE_INACTIVE_ANON;
numa_bind(src_mask);
@@ -627,6 +630,13 @@ static int touch_pages(const char *cgroup, void *arg)
goto err_unmap;
}
+ /* Deactivate all pages before the parent starts migrating them */
+ if (inactive && madvise(mmap_ptr, file_size, MADV_COLD) < 0) {
+ ksft_perror("failed to mark test mapping cold\n");
+ ret = EXIT_FAILURE;
+ goto err_unmap;
+ }
+
if (write(self->pipefd[1], &tmp, 1) != 1) {
ksft_print_msg("failed to write to pipe\n");
close(self->pipefd[1]);
@@ -640,15 +650,8 @@ static int touch_pages(const char *cgroup, void *arg)
goto err_unmap;
}
- if (mem_type == MEMORY_TYPE_INACTIVE_FILE ||
- mem_type == MEMORY_TYPE_INACTIVE_ANON) {
- if (madvise(mmap_ptr, file_size, MADV_COLD) < 0) {
- ksft_perror("failed to mark test mapping cold\n");
- ret = EXIT_FAILURE;
- goto err_unmap;
- }
+ if (inactive)
pause();
- }
srand(getpid());
while (1) {
--
2.56.0
_______________________________________________
Devel mailing list
[email protected]
https://lists.openvz.org/mailman/listinfo/devel