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 02799C83F1B for ; Thu, 17 Jul 2025 03:17:53 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 769506B00A7; Wed, 16 Jul 2025 23:17:53 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 719A86B00A8; Wed, 16 Jul 2025 23:17:53 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 5E0E46B00A9; Wed, 16 Jul 2025 23:17:53 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 4A5AB6B00A7 for ; Wed, 16 Jul 2025 23:17:53 -0400 (EDT) Received: from smtpin24.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id BB26B59757 for ; Thu, 17 Jul 2025 03:17:52 +0000 (UTC) X-FDA: 83672297184.24.F7A9857 Received: from mail-ej1-f49.google.com (mail-ej1-f49.google.com [209.85.218.49]) by imf11.hostedemail.com (Postfix) with ESMTP id B069E40006 for ; Thu, 17 Jul 2025 03:17:50 +0000 (UTC) Authentication-Results: imf11.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=ZLnvEQHz; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf11.hostedemail.com: domain of richard.weiyang@gmail.com designates 209.85.218.49 as permitted sender) smtp.mailfrom=richard.weiyang@gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1752722270; h=from:from:sender:reply-to: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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=0KUTN8GD4gJBCt2nPPzA0i9esMB8AEF65Rup7RkjueI=; b=KRV5qK9HQqsBDfiChKmimpN5EHbOvSb9pkIGHO3nzG/QJ+Ewqg+43aflm/R00qtvTEHMn6 VvKJNREoy7KyO8BBI25WhSpzrT/mvil/vMvDI1HoTbaX5TnD5AJY5lP0Cs54h/vqhEQHzr fldhpZaiO7CctXoYIJobQGqT+7R9DRs= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1752722270; a=rsa-sha256; cv=none; b=JwcWIau0ZKv3RTjU+wWDRqIRDHsebFYkZ/pTJ1t0+2q4dpmXQmUHPr8HXo/ckczWylcVWn 2AbpDcFfGq5xJalG5LWlZUZNDVBauX1LEp9yJf6wvSM0dQ0HOPNngFXEjiFAG767RYWA6i q1wuEHPHCraoWeafLvVpLX5Gu/egpzE= ARC-Authentication-Results: i=1; imf11.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=ZLnvEQHz; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf11.hostedemail.com: domain of richard.weiyang@gmail.com designates 209.85.218.49 as permitted sender) smtp.mailfrom=richard.weiyang@gmail.com Received: by mail-ej1-f49.google.com with SMTP id a640c23a62f3a-ae0dd7ac1f5so80990866b.2 for ; Wed, 16 Jul 2025 20:17:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1752722269; x=1753327069; darn=kvack.org; h=user-agent:in-reply-to:content-disposition:mime-version:references :reply-to:message-id:subject:cc:to:from:date:from:to:cc:subject:date :message-id:reply-to; bh=0KUTN8GD4gJBCt2nPPzA0i9esMB8AEF65Rup7RkjueI=; b=ZLnvEQHzlD0qsc6CDdpUEi1JWJMh8eFxPYsWEZPO4f+CrtzvrYGWH3OWZhyaSCGhya nApOPaUkqE60A5VMdg5MVVoVeQnPmhWHxmpO7FaDwHjAfCeabEUWn8AdTguaxjmqWK7l 9WftHb6/YfZ2xKenjJuzCgkkKky6pN674+5YA17PpSrk0TpwADVM3QFXjxAre684iPQY 4S8AUnT+hm70Wv7zyD0ewvdsBL/tjXwxovg7/4OXRhfzXxMNqfob8XGyGtVtUoiEGIon AU6J+bN0a3NJ5rhh1oRredX69/b9KJmWZFP9zdS4ApgMBJaQDo+k8S3zl7byVE3Nh8NG wp0Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1752722269; x=1753327069; h=user-agent:in-reply-to:content-disposition:mime-version:references :reply-to:message-id:subject:cc:to:from:date:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=0KUTN8GD4gJBCt2nPPzA0i9esMB8AEF65Rup7RkjueI=; b=H2yMe9XPjrKtu/3Ib4nAmTk9lbnm51w3bNfxIIgDhf1NIS6zBjy0lDLRhPRbvZrm+1 OLd1ybnUiAqwjEliaLtvmP2H9TmiFfNYvqGqT/LxR1vNUbOsg8kU6Vkwp+nzBdNFab1r YOoVjPisVFpLBbRLVvVclM6DNfuVCaz3uK7jg/I0FJl8HYkbnEjlKAgV1S5rInQROa4D w7fgR4lClb+umnq5vsl5uQplpOofyPKdNaEO3nCIgzoh8EeF/sc9M2e+4vas96HGOaG+ Ngx7hpAV7D7kTIf+v4UmKNZc0GUvGmbFt4DwTFb6L5x5D1OBbpLkrs/B0b1+CKFWi0zf +4Kw== X-Forwarded-Encrypted: i=1; AJvYcCWVIsKUVRtdhAo5VhAsHylVCZpNEuGT3r4r91VyPRE+FVXeBudbQkByZA5OhIQTuC4oOy62T9Mlmw==@kvack.org X-Gm-Message-State: AOJu0YyA3GB4ryMnm1vwOX4AZ0aOHGZgc5qKWzsp021vvbIUIWp8JSLr 23E9qj0lBXv1U9xu2B2Rmycr0r6j6Mfn9jt9qoHlcIHcFDcJ51LmCrKF X-Gm-Gg: ASbGncvZzrELwLgEHKcZyJMsB5BmOA902jpzlOXDjVA9VkOIsK4BWwHuYBlConX3yQi NNbTCykQx/c/Mzn040R8fIOCfcf57jmTvJoU3QdN5AB38hhqbGyc8qKY4UiBLGe2sYLSSmyHvcy Qe7UN86NT0U4YQdnCk57rx4XwceoQtG1BGC4GDV0TeZFBKLL98e/oS2p1Aq/YnwUjZpd6WqsdKK fD+1w8xDALUKXZCOpwCH7YMPMReoDr+f84ZwQMEKqkXPQueuiwKFpArDp7o8ZCaSDywY7wcw3oU FMKofuMuRAycel59RNowDp6cMaclNBYKzBLaZQt9Hmd/e4W00BtCNibmA4V2Q8tr2teHJ5Ep563 eGxQ72de5NmtY3C+o1/+LcA== X-Google-Smtp-Source: AGHT+IEjLjbt3QxLJ5Q2Uh9e/u3W8N2rXWAE/XFIcgaJGfotqcFgbtLMlMT4Ms40XyRgRBSb1H12Yg== X-Received: by 2002:a17:907:25c6:b0:ae9:c789:13f9 with SMTP id a640c23a62f3a-ae9c9af9476mr484616466b.30.1752722268744; Wed, 16 Jul 2025 20:17:48 -0700 (PDT) Received: from localhost ([185.92.221.13]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ae6e82df4cfsm1267755166b.162.2025.07.16.20.17.48 (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Wed, 16 Jul 2025 20:17:48 -0700 (PDT) Date: Thu, 17 Jul 2025 03:17:48 +0000 From: Wei Yang To: David Hildenbrand Cc: Wei Yang , akpm@linux-foundation.org, linux-mm@kvack.org, Lorenzo Stoakes , Rik van Riel , "Liam R . Howlett" , Vlastimil Babka , Harry Yoo Subject: Re: [PATCH 3/3] selftests/mm: assert rmap behave as expected Message-ID: <20250717031748.27eic7qxotft6uko@master> Reply-To: Wei Yang References: <20250716082710.2801-1-richard.weiyang@gmail.com> <20250716082710.2801-4-richard.weiyang@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: NeoMutt/20170113 (1.7.2) X-Rspamd-Queue-Id: B069E40006 X-Stat-Signature: yaqx4wek174dsufthrd1xts69ph6xt7c X-Rspam-User: X-Rspamd-Server: rspam11 X-HE-Tag: 1752722270-360178 X-HE-Meta: U2FsdGVkX18YrTQGb6DJkLSl3+UqfBGf7sBC62azOScPljzhwucoOtMiaH1g5nrX7QuBKjYwzcS73LAkRTCaOgfW5v6g/BtO6e9nRFmCflNhdeH0OZhjiNoz5Y0+9T49r4gD9G7VHBDzh9vqXoXOzS4l3lLy0huLySiMCoqAVinz5CSRUHhkUlmDLHSFtCdCFHs2MujYdPf7nQ7QhdC+u65PntIMlA+cU+1bbh5xpvCjIJPn2JfHvq8UQM6jyAA12y9ssi1OJJVnEaaDtnSuNutKHi+gb4+sTJxsJnKfsmfk/n1uMnCCyk2AyNsrI8t4z/xWvKAW8+OtfCcDFZEtp3nKY2BZ7vojxFvJUCy+e26XQuAfNtEv7pBlctxbMsiM/+yv4JdNhdGYBmeCc4vJ3PgxahIBVk/B9P8ajzqcb1EPBMuGAnYLcx+rdrjZzxIn36GX7WBj08yv752jE0PThoR1iOELTY8kzo7WwCpJ8B9JSwRdabW6CMPvOCb9qi8T4ZKEWr6GJdWg3+PIF9ZhYyRz9akLa4MUAEa9xm29iww9UH7iV7dQKsUUMjYBjTi8VMUsTEYidhty+a8Dkx97tD4k20oQjGcR7Eq3URwrBQ4RAx3YTQeyGMX/3KXVAFueBIiK0RR8r88KhRNUXlxa3vRr8ZmT3AiMVS+Myq9fqRZBjQmua3eQtr0mHIkClBnDmfdf0qf90sRdXWDyXq1rm2GTnafU+FjBhwBj1tH+nXY332S6PXRLeZRKc5UbU2ZM8x8X9ZJcCQ5opwS+kaEAd+RhFVSmzCPEr0GzLmwzS8/UzAyVD8Fc0e4LiXy9VuKN4qPc7zjA46k1R/Rcjgfia60mtn5FYmd0bGPhklO5BvNzL2ZFUg+WzEXIG9ZMfkwVfKy8y7GkBmm+wlvCe6SgGxegajeiIyU+ittQqNnCPcUqAbDBbvPiwH0ft2hO9rvLTFwX1vs9M8Jys4cX0M8 vPCVPXM+ UMwdZ8XGnHdFlz9cUtP5rb9VFx/T12Ior798sgoHQTnZCbJbcnxPGyfX2xxZaia0UFmSL/AxK2SI0SGD0ngyX+nE8qR9bpHzcCyDUFT+rDuePL6j7HDxuZMaJhNNNPZnIcMffYhQOYwNxhWncM2UuotupPTAWnjT3Q4KH849/wpKycCJFEyDaxZCNSGxbd+9BXFow0Y3MFAtW+Wt0jk20WvnAnEMOh/x3jpyMZAX30DA49yZwAB0vWg7/kKl6xyFjHsPvIxMlTBYLabx+f0KfFSJ8LiSkX3JaJ0LCUIxfsyLUEnio2zr4Rx819Z9ImlXx/a395Izk1zUKZ6BpjN1VWPgJ3iDZAfvzRtB9Qbd9lEEgRrDCDLML/Jd3tfLMrL+OHwrYHYb8Hto4oEHvb1ZNv6kCjqmRoZeUNzKtpHL+zwng7fXC9IHhuVlNC6AKg0B7bSbtg2jJ3hmIlB5RbBZ+bokyLXn9sOLhvg0R5cov/v1vvDpY8vmYLsgyXyDe/RnKP8rBz+mEldo9USY4wCSZqm88p4CK6B8DjFCCMEC/nvs2I/Eb42YK2Nn5xnM2Lqo0v41y77tmR+/cI7BMA0SqKo//ORGYmBKXU9gzyQOgpRV/p2MbJayCdVxsyFC88mwxPr2EuoDyCjak3RgcyRCLeMba9ZkgF9RznUJnMMSdZsZmENfqmED9zBfP2omapn1wdgZvRAI8Gk22IBSm8C6wt0AwnbYizIJqAeH6rJQtoVPbbtz6Q+cBbpJ9Zg== 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 Wed, Jul 16, 2025 at 03:34:11PM +0200, David Hildenbrand wrote: >On 16.07.25 10:27, Wei Yang wrote: [..] >> + >> +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? > You are right, will fix it. >> + 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. > Ok, will access the region in all child before migrate. >> + /* 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. > Will add retry logic. >> + >> + 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. > So the case should be * mapping (MAP_PRIVATE | MAP_ANONYMOUS) * write some content in root parent * fault in for each child * do migration and record pfn * then check pfn is the same in each child >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 -- Wei Yang Help you, Help me