From: Lorenzo Stoakes <lstoakes@gmail.com>
To: "Joel Fernandes (Google)" <joel@joelfernandes.org>
Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org,
linux-mm@kvack.org, Shuah Khan <shuah@kernel.org>,
Vlastimil Babka <vbabka@suse.cz>, Michal Hocko <mhocko@suse.com>,
Linus Torvalds <torvalds@linux-foundation.org>,
Kirill A Shutemov <kirill@shutemov.name>,
"Liam R. Howlett" <liam.howlett@oracle.com>,
"Paul E. McKenney" <paulmck@kernel.org>,
Suren Baghdasaryan <surenb@google.com>,
Kalesh Singh <kaleshsingh@google.com>,
Lokesh Gidra <lokeshgidra@google.com>
Subject: Re: [PATCH v5 6/7] selftests: mm: Add a test for remapping within a range
Date: Sun, 27 Aug 2023 10:57:59 +0100 [thread overview]
Message-ID: <08ce8c61-e7a2-417a-a3cc-d20861753ae8@lucifer.local> (raw)
In-Reply-To: <20230822015501.791637-7-joel@joelfernandes.org>
On Tue, Aug 22, 2023 at 01:54:59AM +0000, Joel Fernandes (Google) wrote:
> Move a block of memory within a memory range. Any alignment optimization
> on the source address may cause corruption. Verify using kselftest that
> it works. I have also verified with tracing that such optimization does
> not happen due to this check in can_align_down():
>
> if (!for_stack && vma->vm_start <= addr_masked)
> return false;
>
> Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
> ---
> tools/testing/selftests/mm/mremap_test.c | 79 +++++++++++++++++++++++-
> 1 file changed, 78 insertions(+), 1 deletion(-)
>
> diff --git a/tools/testing/selftests/mm/mremap_test.c b/tools/testing/selftests/mm/mremap_test.c
> index d7366074e2a8..f45d1abedc9c 100644
> --- a/tools/testing/selftests/mm/mremap_test.c
> +++ b/tools/testing/selftests/mm/mremap_test.c
> @@ -23,6 +23,7 @@
> #define VALIDATION_NO_THRESHOLD 0 /* Verify the entire region */
>
> #define MIN(X, Y) ((X) < (Y) ? (X) : (Y))
> +#define SIZE_MB(m) ((size_t)m * (1024 * 1024))
Nit in this instance since you always just use an integer, but generally
for good practice's sake - shouldn't we place m in parens e.g. (size_t)(m)
to avoid broken macro expansion?
>
> struct config {
> unsigned long long src_alignment;
> @@ -226,6 +227,79 @@ static void mremap_expand_merge_offset(FILE *maps_fp, unsigned long page_size)
> ksft_test_result_fail("%s\n", test_name);
> }
>
> +/*
> + * Verify that an mremap within a range does not cause corruption
> + * of unrelated part of range.
> + *
> + * Consider the following range which is 2MB aligned and is
> + * a part of a larger 10MB range which is not shown. Each
> + * character is 256KB below making the source and destination
> + * 2MB each. The lower case letters are moved (s to d) and the
> + * upper case letters are not moved. The below test verifies
> + * that the upper case S letters are not corrupted by the
> + * adjacent mremap.
> + *
> + * |DDDDddddSSSSssss|
> + */
> +static void mremap_move_within_range(char pattern_seed)
> +{
> + char *test_name = "mremap mremap move within range";
> + void *src, *dest;
> + int i, success = 1;
> +
> + size_t size = SIZE_MB(20);
> + void *ptr = mmap(NULL, size, PROT_READ | PROT_WRITE,
> + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
> + if (ptr == MAP_FAILED) {
> + perror("mmap");
> + success = 0;
> + goto out;
> + }
> + memset(ptr, 0, size);
> +
> + src = ptr + SIZE_MB(6);
> + src = (void *)((unsigned long)src & ~(SIZE_MB(2) - 1));
> +
It's nitty I know for a test (sorry!) but it'd be nice to place a bitwise
alignment trick like this into a helper function or macro if it isn't
otherwise avialable.
> + /* Set byte pattern for source block. */
> + srand(pattern_seed);
> + for (i = 0; i < SIZE_MB(2); i++) {
> + ((char *)src)[i] = (char) rand();
> + }
> +
> + dest = src - SIZE_MB(2);
> +
> + void *new_ptr = mremap(src + SIZE_MB(1), SIZE_MB(1), SIZE_MB(1),
> + MREMAP_MAYMOVE | MREMAP_FIXED, dest + SIZE_MB(1));
> + if (new_ptr == MAP_FAILED) {
> + perror("mremap");
> + success = 0;
> + goto out;
> + }
> +
> + /* Verify byte pattern after remapping */
> + srand(pattern_seed);
> + for (i = 0; i < SIZE_MB(1); i++) {
> + char c = (char) rand();
> +
> + if (((char *)src)[i] != c) {
> + ksft_print_msg("Data at src at %d got corrupted due to unrelated mremap\n",
> + i);
> + ksft_print_msg("Expected: %#x\t Got: %#x\n", c & 0xff,
> + ((char *) src)[i] & 0xff);
> + success = 0;
> + }
> + }
> +
> +out:
> + if (munmap(ptr, size) == -1)
> + perror("munmap");
> +
> + if (success)
> + ksft_test_result_pass("%s\n", test_name);
> + else
> + ksft_test_result_fail("%s\n", test_name);
> +}
> +
> /*
> * Returns the start address of the mapping on success, else returns
> * NULL on failure.
> @@ -491,6 +565,7 @@ int main(int argc, char **argv)
> unsigned int threshold_mb = VALIDATION_DEFAULT_THRESHOLD;
> unsigned int pattern_seed;
> int num_expand_tests = 2;
> + int num_misc_tests = 1;
> struct test test_cases[MAX_TEST] = {};
> struct test perf_test_cases[MAX_PERF_TEST];
> int page_size;
> @@ -572,7 +647,7 @@ int main(int argc, char **argv)
> (threshold_mb * _1MB >= _1GB);
>
> ksft_set_plan(ARRAY_SIZE(test_cases) + (run_perf_tests ?
> - ARRAY_SIZE(perf_test_cases) : 0) + num_expand_tests);
> + ARRAY_SIZE(perf_test_cases) : 0) + num_expand_tests + num_misc_tests);
>
> for (i = 0; i < ARRAY_SIZE(test_cases); i++)
> run_mremap_test_case(test_cases[i], &failures, threshold_mb,
> @@ -590,6 +665,8 @@ int main(int argc, char **argv)
>
> fclose(maps_fp);
>
> + mremap_move_within_range(pattern_seed);
> +
> if (run_perf_tests) {
> ksft_print_msg("\n%s\n",
> "mremap HAVE_MOVE_PMD/PUD optimization time comparison for 1GB region:");
> --
> 2.42.0.rc1.204.g551eb34607-goog
>
I drew a little diagram for myself and was thereby convinced this was a good test, therefore,
Reviewed-by: Lorenzo Stoakes <lstoakes@gmail.com>
next prev parent reply other threads:[~2023-08-27 9:58 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-22 1:54 [PATCH v5 0/7] Optimize mremap during mutual alignment within PMD Joel Fernandes (Google)
2023-08-22 1:54 ` [PATCH v5 1/7] mm/mremap: Optimize the start addresses in move_page_tables() Joel Fernandes (Google)
2023-08-27 9:09 ` Lorenzo Stoakes
2023-08-22 1:54 ` [PATCH v5 2/7] mm/mremap: Allow moves within the same VMA Joel Fernandes (Google)
2023-08-27 9:21 ` Lorenzo Stoakes
2023-08-28 18:32 ` Joel Fernandes
2023-08-28 19:00 ` Lorenzo Stoakes
2023-08-28 20:26 ` Joel Fernandes
2023-08-22 1:54 ` [PATCH v5 3/7] selftests: mm: Fix failure case when new remap region was not found Joel Fernandes (Google)
2023-08-27 9:22 ` Lorenzo Stoakes
2023-08-22 1:54 ` [PATCH v5 4/7] selftests: mm: Add a test for mutually aligned moves > PMD size Joel Fernandes (Google)
2023-08-27 9:36 ` Lorenzo Stoakes
2023-08-22 1:54 ` [PATCH v5 5/7] selftests: mm: Add a test for remapping to area immediately after existing mapping Joel Fernandes (Google)
2023-08-27 9:42 ` Lorenzo Stoakes
2023-08-28 18:36 ` Joel Fernandes
2023-08-22 1:54 ` [PATCH v5 6/7] selftests: mm: Add a test for remapping within a range Joel Fernandes (Google)
2023-08-27 9:57 ` Lorenzo Stoakes [this message]
2023-08-27 10:15 ` Lorenzo Stoakes
2023-08-28 18:59 ` Joel Fernandes
2023-08-28 19:38 ` Lorenzo Stoakes
2023-08-28 20:10 ` Joel Fernandes
2023-08-28 18:37 ` Joel Fernandes
2023-08-22 1:55 ` [PATCH v5 7/7] selftests: mm: Add a test for moving from an offset from start of mapping Joel Fernandes (Google)
2023-08-27 10:12 ` Lorenzo Stoakes
2023-08-28 20:17 ` Joel Fernandes
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=08ce8c61-e7a2-417a-a3cc-d20861753ae8@lucifer.local \
--to=lstoakes@gmail.com \
--cc=joel@joelfernandes.org \
--cc=kaleshsingh@google.com \
--cc=kirill@shutemov.name \
--cc=liam.howlett@oracle.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=lokeshgidra@google.com \
--cc=mhocko@suse.com \
--cc=paulmck@kernel.org \
--cc=shuah@kernel.org \
--cc=surenb@google.com \
--cc=torvalds@linux-foundation.org \
--cc=vbabka@suse.cz \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.