From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2FBF9C83F1B for ; Wed, 16 Jul 2025 13:34:20 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id B71F48D0001; Wed, 16 Jul 2025 09:34:19 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id B22E16B009A; Wed, 16 Jul 2025 09:34:19 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 9EA1A8D0001; Wed, 16 Jul 2025 09:34:19 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 8CECB6B0099 for ; Wed, 16 Jul 2025 09:34:19 -0400 (EDT) Received: from smtpin14.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 125491A046E for ; Wed, 16 Jul 2025 13:34:19 +0000 (UTC) X-FDA: 83670221838.14.F0167D1 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by imf15.hostedemail.com (Postfix) with ESMTP id 9C5B1A0008 for ; Wed, 16 Jul 2025 13:34:16 +0000 (UTC) Authentication-Results: imf15.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b="MZIm7SQ/"; dmarc=pass (policy=quarantine) header.from=redhat.com; spf=pass (imf15.hostedemail.com: domain of david@redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=david@redhat.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1752672856; a=rsa-sha256; cv=none; b=XZxSjGguuEKz6TwT0EkTQddVbdNbRc8gqqNwbPZ6gWGkgk3ebyD7BuCdzt6e8fxUjobLcU FcpEaHimr0Q6x0FI+dQqsdTGNHu6ScTovhDxokgwGi7M1OIj9wOEE6BWtHaPy8wMxa/x+/ QcDvdCVNhubIQOTATAxdV97XNRshcuI= ARC-Authentication-Results: i=1; imf15.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b="MZIm7SQ/"; dmarc=pass (policy=quarantine) header.from=redhat.com; spf=pass (imf15.hostedemail.com: domain of david@redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=david@redhat.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1752672856; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=ZDyjmKCiKnjbPt2HZrJLmfE8+g0jKiUeQVld11PawPM=; b=4jtxjAlKgBDoHTT1/XKYxkwutStgNPDOp/umppgl+gy3Aif6Hfv/bktNkP1VQIskKGvKbW rrF4JOZP+MCgK8IYEaZJNCq5gD8Rzf5gukV2/j6Fzvx8Onuj+pLNQ+c2cfrAaRP7+sTPma uyYsEP7kxpA5bAYZBC8hzkWsS/e7fKM= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1752672856; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:autocrypt:autocrypt; bh=ZDyjmKCiKnjbPt2HZrJLmfE8+g0jKiUeQVld11PawPM=; b=MZIm7SQ/Z+MUsaa909gJudfNnaTUJB4evSfMNUo5ZNnkJsYRBsQS//brGOZGYAoE3AY+j+ mdGbDZ1uo8O0Zgy0SVUvCUDlqscUfkmiQgM2deYJfvWjuXKwRDrT0CW95AVcPkIYu272Tv 76cPRmA4JPfX4aWCGHINypyeyZDAXwg= Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-503-j1ITYFENPdezySS5mEc1Ig-1; Wed, 16 Jul 2025 09:34:14 -0400 X-MC-Unique: j1ITYFENPdezySS5mEc1Ig-1 X-Mimecast-MFC-AGG-ID: j1ITYFENPdezySS5mEc1Ig_1752672853 Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-451ecc3be97so35089625e9.0 for ; Wed, 16 Jul 2025 06:34:14 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1752672853; x=1753277653; h=content-transfer-encoding:in-reply-to:organization:autocrypt :content-language:from:references:cc:to:subject:user-agent :mime-version:date:message-id:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to; bh=ZDyjmKCiKnjbPt2HZrJLmfE8+g0jKiUeQVld11PawPM=; b=sJgghzJVBqHEAKpwU8GR2H9x4hKoMr3bT1IGYsvrWX2aOPm2S7zZ8pINPjtpUHlFgH YaYE6zgu7OWlkBu6azHBq6aOHMdyvRHkW3p03V+yaJeyFIlmXmslmruGrQf/3z37BRDQ 1qnKEEFU/u8FTn2vrbhb2SjYTEzymqDu8MSbpAYJd282aPLgjgVzP8zD2OBG55jynITu yUbXzfVsOP8A89oV+XeZuW2h/XoPTrMZSPL/7fjO5QJGUsh0v4jgu+askXRMiEetNdrO RuSwR261ina4UtNvXNqn2SE0Rk7Jvfbg9wR13NwL8ao3KJiAJ7QvaJdfMDhIR4BjpYO9 PZpA== X-Gm-Message-State: AOJu0YwzcH+/cHOCvlT1BHWjGZtIVEbdDDV2IR5pPOUPlxpfwSAJ/keC sT7YJ1oHNtrXiRdwvkKEF8N0VhcquW52YOtyNAS+fYYy+v0S2KEG7t8dxXYsPW2CasuKk9eah2C Sx7YGYaI88AxBfmhyjvulQ0lkyXtjdyfcoASfLg5dVIpJKlLZbowH X-Gm-Gg: ASbGnctKR9SybhhmWuYOaWK3aPA15lazN/22i4vGSD5RqTAt1boCMZdbmktmJSKy8zJ g1nPEpN16bkBKam0wnLLOS/knyqUJFxZ9ZvbTY9RCQNlLHY+N+Bo8idJxEid7N5CnwOYZp/ZyKH bEuP4/t2l754U9WvUuUTFQXXtwcZrU01Xpz3J2eLGWH7LnCjJtmWJ1ztjmV0HGXDxmGk9G8UGiD mrtlNNHfuWgwsH6QnIue7Dkcrx8s525BxkUGnSNzNYSd3l6inF1qBcoxr0JntQR+2M4T4wEUF9J /qKGuAj7KubM4ZT+4bn/nj40FFlolY3ylfKy+ZVWyDv4nC0wGctEZclIsdXOkzAWL9uOJWHdggW CXJG7Fo05JBKwLklkFxd6lw/YbpbaT/zqUlqDg33kweIP409UZeHU6rz6xg8TZ8AOR7I= X-Received: by 2002:a05:600c:1f13:b0:43c:fbba:41ba with SMTP id 5b1f17b1804b1-456327bbf81mr6833705e9.28.1752672853183; Wed, 16 Jul 2025 06:34:13 -0700 (PDT) X-Google-Smtp-Source: AGHT+IG3rVzWoigwZFjyMBqPUlYw9kwNKPvu3KsYxSO6AywPbs9/Au3Mw6JPWru6NaAH5XDUf2EugA== X-Received: by 2002:a05:600c:1f13:b0:43c:fbba:41ba with SMTP id 5b1f17b1804b1-456327bbf81mr6833405e9.28.1752672852674; Wed, 16 Jul 2025 06:34:12 -0700 (PDT) Received: from ?IPV6:2003:d8:2f1d:ed00:1769:dd7c:7208:eb33? (p200300d82f1ded001769dd7c7208eb33.dip0.t-ipconnect.de. [2003:d8:2f1d:ed00:1769:dd7c:7208:eb33]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4562e7f2f1bsm21629725e9.4.2025.07.16.06.34.11 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 16 Jul 2025 06:34:12 -0700 (PDT) Message-ID: Date: Wed, 16 Jul 2025 15:34:11 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH 3/3] selftests/mm: assert rmap behave as expected To: Wei Yang , akpm@linux-foundation.org Cc: linux-mm@kvack.org, Lorenzo Stoakes , Rik van Riel , "Liam R . Howlett" , Vlastimil Babka , Harry Yoo References: <20250716082710.2801-1-richard.weiyang@gmail.com> <20250716082710.2801-4-richard.weiyang@gmail.com> From: David Hildenbrand Autocrypt: addr=david@redhat.com; keydata= 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 g3eXuA== Organization: Red Hat In-Reply-To: <20250716082710.2801-4-richard.weiyang@gmail.com> X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: cFCvOd3a_EuKabgeaupDsm_xZpyrr8wOcAf8rqPXsbs_1752672853 X-Mimecast-Originator: redhat.com Content-Language: en-US Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Rspamd-Server: rspam12 X-Rspamd-Queue-Id: 9C5B1A0008 X-Stat-Signature: xmziht6cp6p33et3knje5ikkjxup951h X-Rspam-User: X-HE-Tag: 1752672856-518982 X-HE-Meta: U2FsdGVkX1+qoVagXsy5ZWer+zvpdKybSsezN6Ph4ThJ4iAnC/m3ujEfIWYflO/YcjV5KKGkLrMer0wzRrEBy5+kNkSvHUR/elyPqqxJXTDYxtbf/mRFGfU1m0zulvD0jjOmZS4OD8GeUqwDcrZIY9dBcGWYa79FYE0pW7lTGIK2DFoizkwU7cgguOf4z/tzHOSsQg7ZGuI+o2dKp18dqI6/RPg3Y64TQIybVtbHQvi9OaO7ueomqG9P1weQnzeZCSU37Laau0u3ZWKTceZkt7+LyQ61mGB1dGT8wKSnVZnPznH1k0621+Lykt3BQ5A9wtsLHQ54hh1iRA5zaH5vzZ8AmVpgOE/EM7k6/M3bNEnFnZ1Zosi5KNqYqfqDcKQzLmHD2Ak1wQAgoKyZzDs8iHWazQrdpSFuR+BsvhYsU6ZQaA6R32AFibBIPJx2F05vfaW/MSe7LWhLLiVSlGHbi7k9QiftDxlRf+NDupWgA+Ix+zwHQalhGu4KOjlB+ZBBlL2fhp8lgquWwknvuvJIIDhoGjslyFwMT3+1quanflZwuH1OggdDMS2Y5IUL7SQT0khLOlb5NMNpenZotuwxex8c2wNKIOYpVE/NgJFQIkDqgMxDOXHCRFIMeQGEIn1vdwIWGmMPW8MoUN4xmhAg02flIr3FJbHPKV9v2hDGIUhsapeQP/t/iPh8G5TymmQ+h2Flr4YrwLk1thOXhbLauwDmRJIR/ZsWL5QV8ynIvZBss3T/vK52//y6N31vnooMBrOi4m0JxOZNfSO2nrgCi+wYM1bsn51X3ePrW0OyadN2GeB5GTu5ZzkB5YIFhYSGBK+qmZO/TYdvk4lVWsL7GT1s7nRpB+tY0kEYrmNgOI9pH8LcjY67JE1/kLl5uisle3dSaJQiy0FMW85t5zRPIAhvz938CzYniSvxC7F7XS18MkOwQQvm78a2gwIxPL+fd21BtC45K0SZBeTeavF A0sgfjpD JaaqNivIrJP2R96roEC1LNK+f/uUXW/AVigSikYegipshq5rOBd+5FFvcqeqbo7YdB+jHSTOysqyErCB7V64dMEXAOKCjC+GHy8JTo6kGWLa0cFeIc/vDU3P3VWnvf4U3ME/bMwBAxgZVTwDZ/jKsycIBsF2/duXCV2Uj8+5wbASxM2KjHvzQDQh/jZlJY4lWtj+MxrOvTjlJbz3OR4J/CZo5czMWjfWIcFcSo8ut0vJaKMDaT8rcSgPexQ7wbWgflYS6Jba/3kVE9wSW7gtA7zG3d8zoSyAHECxLsWbGSm3YwhDyHtHbrONfy3vaegAsqcuKUYeqkAvvpcw3vlD7fSsfbopZRgK8ZsHjHex4kpcm3Efbr8UkLbbadyP3nMkM9+fRu+ZYi6LFHFeVvwwSZyCQ4hAfuViwH//QnTNsXPADs4xN1zE6AmT1Z3WmLvuWm91r/A+5e6mXcU7yH49WxgMUb9rMamhG935SEXlsL6PHZFDSwqw4Eplb1KGoPSqy5n33K2/rhIS6YMJpdNTFI7gQ0c6B/j4d/F4MnLPd/W5MT0/ZShQSOhuhgZHczvPHXazJw/aO3TiiwiLMiZg/IFp6CdUyv4EA/9kcD2LbGXnpRFawDu85YAUlldxpmFWTkLo88rmHVQXoZXmAHgbxdEr/xEcu/SakvU0trJTswu9+I7k08k4YuCdUHc2xg1j2slzO0x5vAtjAkkg= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: On 16.07.25 10:27, Wei Yang wrote: > As David suggested, currently we don't have a high level test case to > verify the behavior of rmap. This patch introduce the verification on > rmap by migration. > > The general idea is if migrate one shared page between processes, this > would be reflected in all related processes. Otherwise, we have problem > in rmap. > > Currently it covers following four scenarios: > > * anonymous page > * shmem page > * pagecache page > * ksm page > > Signed-off-by: Wei Yang > Suggested-by: David Hildenbrand > Cc: David Hildenbrand > Cc: Lorenzo Stoakes > Cc: Rik van Riel > Cc: Liam R. Howlett > Cc: Vlastimil Babka > Cc: Harry Yoo > > --- > v1: fault in region by just accessing it instead of print it > --- > MAINTAINERS | 1 + > tools/testing/selftests/mm/.gitignore | 1 + > tools/testing/selftests/mm/Makefile | 3 + > tools/testing/selftests/mm/rmap.c | 470 ++++++++++++++++++++++ > tools/testing/selftests/mm/run_vmtests.sh | 4 + > 5 files changed, 479 insertions(+) > create mode 100644 tools/testing/selftests/mm/rmap.c > > diff --git a/MAINTAINERS b/MAINTAINERS > index 70df1d8cfaf5..5fb62a275c37 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -15917,6 +15917,7 @@ S: Maintained > F: include/linux/rmap.h > F: mm/page_vma_mapped.c > F: mm/rmap.c > +F: tools/testing/selftests/mm/rmap.c > > MEMORY MANAGEMENT - SECRETMEM > M: Andrew Morton > diff --git a/tools/testing/selftests/mm/.gitignore b/tools/testing/selftests/mm/.gitignore > index f2dafa0b700b..c1f3de607ba2 100644 > --- a/tools/testing/selftests/mm/.gitignore > +++ b/tools/testing/selftests/mm/.gitignore > @@ -57,3 +57,4 @@ pkey_sighandler_tests_32 > pkey_sighandler_tests_64 > guard-regions > merge > +rmap > diff --git a/tools/testing/selftests/mm/Makefile b/tools/testing/selftests/mm/Makefile > index ae6f994d3add..c7e3a19b5555 100644 > --- a/tools/testing/selftests/mm/Makefile > +++ b/tools/testing/selftests/mm/Makefile > @@ -100,6 +100,7 @@ TEST_GEN_FILES += hugetlb_dio > TEST_GEN_FILES += droppable > TEST_GEN_FILES += guard-regions > TEST_GEN_FILES += merge > +TEST_GEN_FILES += rmap > > ifneq ($(ARCH),arm64) > TEST_GEN_FILES += soft-dirty > @@ -227,6 +228,8 @@ $(OUTPUT)/ksm_tests: LDLIBS += -lnuma > > $(OUTPUT)/migration: LDLIBS += -lnuma > > +$(OUTPUT)/rmap: LDLIBS += -lnuma > + > local_config.mk local_config.h: check_config.sh > /bin/sh ./check_config.sh $(CC) > > diff --git a/tools/testing/selftests/mm/rmap.c b/tools/testing/selftests/mm/rmap.c > new file mode 100644 > index 000000000000..e05cd8a9c1bc > --- /dev/null > +++ b/tools/testing/selftests/mm/rmap.c > @@ -0,0 +1,470 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * RMAP functional tests > + * > + * Author(s): Wei Yang > + */ > + > +#include "../kselftest_harness.h" > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include "vm_util.h" > + > +#define TOTAL_LEVEL 5 > +#define MAX_CHILDREN 3 > + > +#define FAIL_ON_CHECK (1 << 0) > +#define FAIL_ON_WORK (1 << 1) > + > +struct sembuf sem_wait = {0, -1, 0}; > +struct sembuf sem_signal = {0, 1, 0}; > + > +static const char initial_data[] = "Hello, world 0!"; > +static const char updated_data[] = "Hello, World 0!"; > + > +enum backend_type { > + ANON, > + SHM, > + NORM_FILE, > +}; > + > +#define PREFIX "kst_rmap" > +#define MAX_FILENAME_LEN 256 > +const char *suffixes[] = { > + "", > + "_shm", > + "_norm", > +}; > + > +struct global_data; > +typedef int (*work_fn)(struct global_data *data); > +typedef int (*check_fn)(struct global_data *data); > +typedef void (*prepare_fn)(struct global_data *data); > + > +struct global_data { > + int worker_level; > + > + int semid; > + int pipefd[2]; > + > + unsigned int mapsize; > + unsigned int rand_seed; > + char *region; > + > + prepare_fn do_prepare; > + work_fn do_work; > + check_fn do_check; > + > + enum backend_type backend; > + char filename[MAX_FILENAME_LEN]; > + > + unsigned long *expected_pfn; > +}; > + > +/* > + * Create a process tree with TOTAL_LEVEL height and at most MAX_CHILDREN > + * children for each. > + * > + * It will randomly select one process as 'worker' process which will > + * 'do_work' until all processes are created. And all other processes will > + * wait until 'worker' finish its work. > + */ > +int propagate_children(struct global_data *data) > +{ > + pid_t pid; > + unsigned int num_child; > + int status; > + int ret = 0; > + int curr_child, worker_child; > + int curr_level = 1; > + bool is_worker = true; > + > +repeat: > + num_child = rand_r(&data->rand_seed) % MAX_CHILDREN + 1; > + worker_child = is_worker ? rand_r(&data->rand_seed) % num_child : -1; > + > + for (curr_child = 0; curr_child < num_child; curr_child++) { > + pid = fork(); > + > + if (pid < 0) { > + perror("Error: fork\n"); > + } else if (pid == 0) { > + curr_level++; > + > + if (curr_child != worker_child) > + is_worker = false; > + > + if (curr_level == TOTAL_LEVEL) > + break; > + > + data->rand_seed += curr_child; > + goto repeat; > + } > + } > + > + if (data->do_prepare) > + data->do_prepare(data); > + > + close(data->pipefd[1]); > + > + if (is_worker && curr_level == data->worker_level) { > + /* This is the worker process, first wait last process created */ > + char buf; > + > + while (read(data->pipefd[0], &buf, 1) > 0) > + ; > + > + if (data->do_work) > + ret = data->do_work(data); > + > + /* Kick others */ > + semctl(data->semid, 0, IPC_RMID); > + } else { > + /* Wait worker finish */ > + semop(data->semid, &sem_wait, 1); > + if (data->do_check) > + ret = data->do_check(data); > + } > + > + /* Wait all child to quit */ > + while (wait(&status) > 0) { > + if (WIFEXITED(status)) > + ret |= WEXITSTATUS(status); > + } > + > + return ret; > +} > + > +FIXTURE(migrate) > +{ > + struct global_data data; > +}; > + > +FIXTURE_SETUP(migrate) > +{ > + struct global_data *data = &self->data; > + > + ASSERT_EQ(numa_available(), 0); if (numa_available() < 0) SKIP(return, "NUMA not available"); Should that be a skip instead? > + if (numa_bitmask_weight(numa_all_nodes_ptr) <= 1) > + SKIP(return, "Not enough NUMA nodes available"); > + > + data->mapsize = getpagesize();> + > + /* Prepare semaphore */ > + data->semid = semget(IPC_PRIVATE, 1, 0666 | IPC_CREAT); > + ASSERT_NE(data->semid, -1); > + ASSERT_NE(semctl(data->semid, 0, SETVAL, 0), -1); > + > + /* Prepare pipe */ > + ASSERT_NE(pipe(data->pipefd), -1); > + > + data->rand_seed = time(NULL); > + srand(data->rand_seed); > + > + data->worker_level = rand() % TOTAL_LEVEL + 1; > + > + data->do_prepare = NULL; > + data->do_work = NULL; > + data->do_check = NULL; > + > + data->backend = ANON; > +}; > + > +FIXTURE_TEARDOWN(migrate) > +{ > + struct global_data *data = &self->data; > + > + if (data->region != MAP_FAILED) > + munmap(data->region, data->mapsize); > + data->region = MAP_FAILED; > + if (data->expected_pfn != MAP_FAILED) > + munmap(data->expected_pfn, sizeof(unsigned long)); > + data->expected_pfn = MAP_FAILED; > + semctl(data->semid, 0, IPC_RMID); > + data->semid = -1; > + > + close(data->pipefd[0]); > + > + data->do_work = NULL; > + data->do_check = NULL; > + > + switch (data->backend) { > + case ANON: > + break; > + case SHM: > + shm_unlink(data->filename); > + break; > + case NORM_FILE: > + unlink(data->filename); > + break; > + } > +} > + > +int try_to_move_page(char *region) > +{ > + int ret; > + int node; > + int status = 0; > + volatile unsigned long dummy = 0; > + > + /* > + * Fault in page in case it is not, otherwise move_pages() would > + * return -ENOENT. > + */ > + dummy = *((unsigned long *)region); Use FORCE_READ() here https://lkml.kernel.org/r/20250716123126.3851-1-lianux.mm@gmail.com But, this really must happen in all children before actually performing the move in the worker. Otherwise the other processes don't map the page and will just ... fault it in later. > + /* Prevent the compiler from optimizing out the entire loop: */ > + asm volatile("" : "+r" (dummy)); > + > + ret = move_pages(0, 1, (void **)®ion, NULL, &status, MPOL_MF_MOVE_ALL); > + if (ret != 0) > + return FAIL_ON_WORK; > + > + /* Pick up a different target node */ > + for (node = 0; node <= numa_max_node(); node++) { > + if (numa_bitmask_isbitset(numa_all_nodes_ptr, node) && node != status) > + break; > + } > + > + if (node > numa_max_node()) { > + ksft_print_msg("Couldn't find available numa node for testing\n"); > + return FAIL_ON_WORK; > + } > + > + ret = move_pages(0, 1, (void **)®ion, &node, &status, MPOL_MF_MOVE_ALL); > + if (ret != 0) > + return FAIL_ON_WORK; Probably, if we don't manage to migrate, we should retry a couple of times and then SKIP. Point is, migration might fail for various reasons (e.g., 2 NUMA nodes but one of them doesn't even have memory) etc. Migration failures might indicate other problems, yes, but false failures from the test are suboptimal. > + > + return 0; > +} > + > +int move_and_update(struct global_data *data) > +{ > + int ret; > + > + ret = try_to_move_page(data->region); > + if (ret != 0) > + return ret; > + > + /* Change the content */ > + strcpy(data->region, updated_data); > + > + return ret; > +} > + > +int data_updated(struct global_data *data) > +{ > + if (data->region == MAP_FAILED) > + return 0; > + > + if (strncmp((char *)data->region, updated_data, strlen(updated_data))) > + return FAIL_ON_CHECK; > + return 0; > +} I assume checking the PFN is sufficient. No need for the additional data content. In particular, with proper anon pages (CoW, see below) that doesn't work either way. > + > +TEST_F(migrate, anon) > +{ > + pid_t root_pid; > + int ret; > + struct global_data *data = &self->data; > + > + /* Map a shared area and fault in */ > + data->region = mmap(0, data->mapsize, PROT_READ | PROT_WRITE, > + MAP_SHARED | MAP_ANONYMOUS, -1, 0); That is anon_shmem. We should test proper anon memory (MAP_PRIVATE), whereby pages are shared using CoW. anon_shmem should behave mostly like shmem. > + ASSERT_NE(data->region, MAP_FAILED); > + strcpy(data->region, initial_data); > + > + data->do_work = move_and_update; > + data->do_check = data_updated; > + > + root_pid = getpid(); > + > + ret = propagate_children(data); > + > + if (getpid() == root_pid) { > + if (ret & FAIL_ON_WORK) > + SKIP(return, "Failed on moving page"); > + > + ASSERT_EQ(ret, 0); > + } else { > + exit(ret); > + } > +} [...] > +TEST_HARNESS_MAIN > diff --git a/tools/testing/selftests/mm/run_vmtests.sh b/tools/testing/selftests/mm/run_vmtests.sh > index a38c984103ce..f6fb8dec6e64 100755 > --- a/tools/testing/selftests/mm/run_vmtests.sh > +++ b/tools/testing/selftests/mm/run_vmtests.sh > @@ -83,6 +83,8 @@ separated by spaces: > test handling of page fragment allocation and freeing > - vma_merge > test VMA merge cases behave as expected > +- rmap > + test rmap behave as expected "behaves" -- Cheers, David / dhildenb