From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 067E83A6B8C for ; Tue, 7 Apr 2026 09:43:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775555022; cv=none; b=bbeE+++GB9VU6l3eRU//wCLK9Ll00hkX4tWBUN4okaaVq8CaHL1HmIhdYIM0VLsqvJp925FkTSYKoPpbZBnxkgBRw+voqjeRbgJWV6VB2hUi+qnF9d1CVotBAdSt0iVZLaadcch2wZmKfKCYnT/mYh+2+ObrgvadQhX7YX/BsNA= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775555022; c=relaxed/simple; bh=5swpGJLLM7ocCgxAbPQMvQ1UNSary/VO1SavUaPUMLc=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=Ul11SoXOhxWW4CA2PRuSse7XD22MrK6Zmd9307G4dUaEA/P8MdibsETj3/IO4YVrrml7RBiSZjFtVKWDSiHa08W85psMLsVRH5SXgB2EE/Vqs9BfI+KTfJSiwcO/dHmY/sRMtKxDyVM8sC0deZl06/0wHYnEYfWI76Wv5ZNouYQ= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=u211mTq6; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="u211mTq6" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 994F5C116C6; Tue, 7 Apr 2026 09:43:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1775555021; bh=5swpGJLLM7ocCgxAbPQMvQ1UNSary/VO1SavUaPUMLc=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=u211mTq69k4LSK6Rv7+fzWLZarJSqC5osrmVd+KLmbKe0cqzDhF590TmZkeAYvqab 12wT5CjAmXhYY/iV2g+MwMRlRv29TmixuVaIaOfDncXkmtapNVZ9G5a5OAGS7XIdOK 69gs4/uM53bYVm/eSOYymWH0HEHLB2+HSEup6y+rNLZyeWMOQxrSpLjPWT4vFUoPOC iFR83Cvy82FXSqaFrRnMC6wzPxqaC9b7mFxdComnDGfSbOV9dWt/rOxqoFKNfIv6ll w1841iIYmd3amDMp+gdzvQgI+e4zYmZO/LiR7E1axsYOvTfy4ARLvKT8l+10VocDv/ ZmeB/6eKaZaPg== Date: Tue, 7 Apr 2026 10:43:37 +0100 From: "Lorenzo Stoakes (Oracle)" To: xu.xin16@zte.com.cn Cc: hughd@google.com, akpm@linux-foundation.org, david@kernel.org, michel@lespinasse.org, chengming.zhou@linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: Re: ksm: add mremap selftests for ksm_rmap_walk Message-ID: References: <20260407140805858ViqJKFhfmYSfq0FynsaEY@zte.com.cn> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20260407140805858ViqJKFhfmYSfq0FynsaEY@zte.com.cn> On Tue, Apr 07, 2026 at 02:08:05PM +0800, xu.xin16@zte.com.cn wrote: > From: xu xin > > The existing tools/testing/selftests/mm/rmap.c has already one testcase > for ksm_rmap_walk in TEST_F(migrate, ksm), which takes use of migration > of page from one NUMA node to another NUMA node. However, it just lacks > the senario of mremapped VMAs. > > Before migrating, we add the calling of mremap() to address mapped with KSM > pages, which is specailly to test a optimization which is introduced by this > patch ("ksm: Optimize rmap_walk_ksm by passing a suitable address range") > https://lore.kernel.org/all/20260212193045556CbzCX8p9gDu73tQ2nvHEI@zte.com.cn/ > > Result: > TAP version 13 > 1..5 > ok 1 migrate.anon > ok 2 migrate.shm > ok 3 migrate.file # SKIP Failed in worker > ok 4 migrate.ksm > ok 5 migrate.ksm_and_mremap > > Signed-off-by: xu xin Thanks for this, tests are always good, but I think we should bundle this in the same series as with the rmap_walk_ksm optimisation, assuming we can be sure whatever-form-of-that-we-end-up-with is ok. I currently share Hugh's doubts as to correctness, so let's put the two together I think. Cheers, Lorenzo > --- > tools/testing/selftests/mm/rmap.c | 69 ++++++++++++++++++++++++++++ > tools/testing/selftests/mm/vm_util.c | 38 +++++++++++++++ > tools/testing/selftests/mm/vm_util.h | 2 + > 3 files changed, 109 insertions(+) > > diff --git a/tools/testing/selftests/mm/rmap.c b/tools/testing/selftests/mm/rmap.c > index 53f2058b0ef2..65470def2bf1 100644 > --- a/tools/testing/selftests/mm/rmap.c > +++ b/tools/testing/selftests/mm/rmap.c > @@ -430,4 +430,73 @@ TEST_F(migrate, ksm) > propagate_children(_metadata, data); > } > > +/* To test if ksm page can be migrated when it's mremapped */ > +int merge_mremap_and_migrate(struct global_data *data) > +{ > + int ret = 0; > + /* Allocate range and set the same data */ > + data->mapsize = 3*getpagesize(); > + data->region = mmap(NULL, data->mapsize, PROT_READ|PROT_WRITE, > + MAP_PRIVATE|MAP_ANON, -1, 0); > + if (data->region == MAP_FAILED) > + ksft_exit_fail_perror("mmap failed"); > + > + memset(data->region, 0x77, data->mapsize); > + > + if (ksm_start() < 0) > + return FAIL_ON_CHECK; > + > + /* 1 2 expected */ > + ksft_print_msg("Shared: %ld (1 expected) Sharing: %ld (2 expected)\n", > + ksm_get_pages_shared(), ksm_get_pages_sharing()); > + > + /* > + * Mremap the second pagesize address range into the third pagesize > + * address. > + */ > + data->region = mremap(data->region + getpagesize(), getpagesize(), getpagesize(), > + MREMAP_MAYMOVE|MREMAP_FIXED, data->region + 2*getpagesize()); > + > + if (data->region == MAP_FAILED) > + return FAIL_ON_CHECK; > + > + /* Check if we can migrate this region successfully */ > + ret = try_to_move_page(data->region); > + if (ret != 0) > + return ret; > + > + /* Wait ksm scan two turns at least */ > + if (ksm_start() < 0) > + return FAIL_ON_CHECK; > + > + /* 1 1 expected */ > + ksft_print_msg("Shared: %ld (1 expected) Sharing: %ld (1 expected)\n", > + ksm_get_pages_shared(), ksm_get_pages_sharing()); > + > + return 0; > +} > + > +TEST_F(migrate, ksm_and_mremap) > +{ > + int ret; > + struct global_data *data = &self->data; > + > + /* prepare KSM interface setting */ > + if (ksm_stop() < 0) > + SKIP(return, "accessing \"/sys/kernel/mm/ksm/run\") failed"); > + if (ksm_get_full_scans() < 0) > + SKIP(return, "accessing \"/sys/kernel/mm/ksm/full_scan\") failed"); > + > + ret = prctl(PR_SET_MEMORY_MERGE, 1, 0, 0, 0); > + if (ret < 0 && errno == EINVAL) > + SKIP(return, "PR_SET_MEMORY_MERGE not supported"); > + else if (ret) > + ksft_exit_fail_perror("PR_SET_MEMORY_MERGE=1 failed"); > + > + /* Start to merge same pages and mremap one of the three page area, > + * and test if ksm page can be migrated when it's mremapped */ > + ASSERT_EQ(merge_mremap_and_migrate(data), 0); > +} > + > + > TEST_HARNESS_MAIN > diff --git a/tools/testing/selftests/mm/vm_util.c b/tools/testing/selftests/mm/vm_util.c > index 9428f4d7bf55..47402b771ef8 100644 > --- a/tools/testing/selftests/mm/vm_util.c > +++ b/tools/testing/selftests/mm/vm_util.c > @@ -646,6 +646,44 @@ long ksm_get_self_merging_pages(void) > return strtol(buf, NULL, 10); > } > > +long ksm_get_pages_shared(void) > +{ > + int ksm_pages_shared_fd; > + char buf[10]; > + ssize_t ret; > + > + ksm_pages_shared_fd = open("/sys/kernel/mm/ksm/pages_shared", O_RDONLY); > + if (ksm_pages_shared_fd < 0) > + return -errno; > + > + ret = pread(ksm_pages_shared_fd, buf, sizeof(buf) - 1, 0); > + close(ksm_pages_shared_fd); > + if (ret <= 0) > + return -errno; > + buf[ret] = 0; > + > + return strtol(buf, NULL, 10); > +} > + > +long ksm_get_pages_sharing(void) > +{ > + int ksm_pages_sharing_fd; > + char buf[10]; > + ssize_t ret; > + > + ksm_pages_sharing_fd = open("/sys/kernel/mm/ksm/pages_sharing", O_RDONLY); > + if (ksm_pages_sharing_fd < 0) > + return -errno; > + > + ret = pread(ksm_pages_sharing_fd, buf, sizeof(buf) - 1, 0); > + close(ksm_pages_sharing_fd); > + if (ret <= 0) > + return -errno; > + buf[ret] = 0; > + > + return strtol(buf, NULL, 10); > +} > + > long ksm_get_full_scans(void) > { > int ksm_full_scans_fd; > diff --git a/tools/testing/selftests/mm/vm_util.h b/tools/testing/selftests/mm/vm_util.h > index e9c4e24769c1..b0dd190f83e4 100644 > --- a/tools/testing/selftests/mm/vm_util.h > +++ b/tools/testing/selftests/mm/vm_util.h > @@ -151,6 +151,8 @@ void *sys_mremap(void *old_address, unsigned long old_size, > > long ksm_get_self_zero_pages(void); > long ksm_get_self_merging_pages(void); > +long ksm_get_pages_shared(void); > +long ksm_get_pages_sharing(void); > long ksm_get_full_scans(void); > int ksm_use_zero_pages(void); > int ksm_start(void); > -- > 2.25.1