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 A1EDAC83F11 for ; Sun, 27 Aug 2023 09:42:51 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 2AF66900002; Sun, 27 Aug 2023 05:42:51 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 25EA78E0001; Sun, 27 Aug 2023 05:42:51 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 12792900002; Sun, 27 Aug 2023 05:42:51 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id F3B638E0001 for ; Sun, 27 Aug 2023 05:42:50 -0400 (EDT) Received: from smtpin29.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id E8C6F40187 for ; Sun, 27 Aug 2023 09:42:49 +0000 (UTC) X-FDA: 81169395258.29.D87151E Received: from mail-wm1-f42.google.com (mail-wm1-f42.google.com [209.85.128.42]) by imf03.hostedemail.com (Postfix) with ESMTP id 0FB122000C for ; Sun, 27 Aug 2023 09:42:47 +0000 (UTC) Authentication-Results: imf03.hostedemail.com; dkim=pass header.d=gmail.com header.s=20221208 header.b=DV5he1Os; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf03.hostedemail.com: domain of lstoakes@gmail.com designates 209.85.128.42 as permitted sender) smtp.mailfrom=lstoakes@gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1693129368; 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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=2GNTJJM3vJpWZGuhi99nyYMiKp6+EolsjKvwgMauAh8=; b=T5DKaqlzlVwgE2n49h9CVrWrt2dfI3twXkfEhvAWDhADYO40ufxxr6brvvushTVWvOz13g rf2ofW74Ab+PEU1q4R85Zo8ykFIC87B5RPG0IqWX1NSjFrw4TM7OT1tvrHyiffis6YDDN7 LrzC0sB+X3MUNsuSpKPWP8hQqwXkMgw= ARC-Authentication-Results: i=1; imf03.hostedemail.com; dkim=pass header.d=gmail.com header.s=20221208 header.b=DV5he1Os; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf03.hostedemail.com: domain of lstoakes@gmail.com designates 209.85.128.42 as permitted sender) smtp.mailfrom=lstoakes@gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1693129368; a=rsa-sha256; cv=none; b=NF4H+GYDZq9i7cXBXzreQVRAAE8GsJo1QX2JLFf2HsTqhhe7U93cvK1ZLLMi9dYKjtztIm wzDHXkXtqBOl+IAgGPwNC0sEErfRjrs+YzmmkXHeFNgLRy+4eaSKPgSDwd0zfujy4l5xKI HW8au5uzhH3Mb7ZLcKOxlJJ0ZjE2A48= Received: by mail-wm1-f42.google.com with SMTP id 5b1f17b1804b1-3ff7d73a6feso20738765e9.1 for ; Sun, 27 Aug 2023 02:42:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1693129366; x=1693734166; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:from:to:cc:subject:date:message-id:reply-to; bh=2GNTJJM3vJpWZGuhi99nyYMiKp6+EolsjKvwgMauAh8=; b=DV5he1OsD/g+1v1ZUO8T1fxR6j6Lr73wr6LrU14Aw/QdE2K4kfwhQqWaWM3M6OVMvq FszkCrsgrbq8U1a0qShs1imd5Y01mHEl+veUvC+Qg56zO+BPv8sOIVVFot/OayEbDUlq OJplQ/1AsWwWfyURXNVoy3SW6/D5e9RsHKwHJ8eZ1na2RYjWopPldrWK2IOmOl5towWM f3BZv/S6im76NbGM7NAc92O9NWxIAAtXClupCLSQjIIg1ZPX31ewgL2FZfw/rP76bKG5 lSTAeIR6GFPPZ0A1wqc1AP5PLIRvX+Qr5qGBu/ZOyNvu1W3vo/LVVGBlFez6Y85GQJqq INBA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1693129366; x=1693734166; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=2GNTJJM3vJpWZGuhi99nyYMiKp6+EolsjKvwgMauAh8=; b=W+s/icUNB74dZXACOnXRAkeIBqn21ik6TDwBhyHDUVybt6Cb/P3uWNPhLDYVz9b6Kx 2CieVY+dUDeZotpbHgtFA2ypH3YJwK7o4ikRD3/k/hZu9GIVtj1qo8OOmssiGkzCj0E3 md3liazAznu7Wus17Dj86L1LUMqnGWNTFFqsUDLbLaXTomUA/E9Z7eDa2ACA3TMGJ5Xq DgyvbC9V3Fp3DIodaMrQT9W6Qt8PUa3Ub58bBMNcAHQKFa7Ulbjb81r8wmiqSKJcoerX 4eSyw+h3ZJvGr476RjXCPNQQCF8U7TqF6iyCr7OgrnOQVxNQ7fvf0R+YoMzv3+k8UIOT cjvw== X-Gm-Message-State: AOJu0YzJyIj9jfRyH/phJTfFVlXmnN1jhkO+cUxtQ8ybVqIXNCSCKDiy hQiiDlq00nW032+Or6UP9g0= X-Google-Smtp-Source: AGHT+IG77JjIZx1tPsu2mGJw91NYPbFoa8PaGlepgZ6qo6w8pr52ScoYLaWJWNJEWmqNo4+u5AZe+w== X-Received: by 2002:a7b:c009:0:b0:3fe:1cac:37d7 with SMTP id c9-20020a7bc009000000b003fe1cac37d7mr16814331wmb.10.1693129366417; Sun, 27 Aug 2023 02:42:46 -0700 (PDT) Received: from localhost ([2a00:23c5:dc8c:8701:1663:9a35:5a7b:1d76]) by smtp.gmail.com with ESMTPSA id y26-20020a7bcd9a000000b003fed7fa6c00sm10624374wmj.7.2023.08.27.02.42.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 27 Aug 2023 02:42:44 -0700 (PDT) Date: Sun, 27 Aug 2023 10:42:44 +0100 From: Lorenzo Stoakes To: "Joel Fernandes (Google)" Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, Shuah Khan , Vlastimil Babka , Michal Hocko , Linus Torvalds , Kirill A Shutemov , "Liam R. Howlett" , "Paul E. McKenney" , Suren Baghdasaryan , Kalesh Singh , Lokesh Gidra Subject: Re: [PATCH v5 5/7] selftests: mm: Add a test for remapping to area immediately after existing mapping Message-ID: References: <20230822015501.791637-1-joel@joelfernandes.org> <20230822015501.791637-6-joel@joelfernandes.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20230822015501.791637-6-joel@joelfernandes.org> X-Rspamd-Server: rspam09 X-Rspamd-Queue-Id: 0FB122000C X-Stat-Signature: o8k8m633rqijhgay8aswpgzm7u99sptt X-Rspam-User: X-HE-Tag: 1693129367-506565 X-HE-Meta: U2FsdGVkX18GBExWK+syAsqURYnDrUcofkB0iLVivuTFRnc2kDCLVlLH33kW8W7uq3IIDIFMFRldc5jUs36wroKSMpoL4NndKROdSf5a8BC3VQbWmJhr83aX/eqMJUke2LnOSOIPhCjp/dcSjeD3uS11i+LV+YKQUhqtQNnVWpDqEPiXQMYeU89glfZvt65nQuyAdACvA845XHoi+5vkwJ+9ZZiYKAfsXeXD8C9UzvYf6YLJv5yKSOhlFr8DRIUcs+7AaZRVMg6ojGMmGGUv1x1FUGFCyVXUr6+UzU5U5aFilxEszte6WAdfuTb13ACR7UrZmPYtoZBn+vXtAbzpr7VmJdzAtUbOe8A3hf2n2ot43fLP/wrNC2Hp1TF4Jlt/Ub3zjPfzzqavGGdi017cDtmqbISXBL/rfgbJpGXsG/E+C7ko4PmK4IpS9GNRbrCSty316r5ylyhTtLxJumM0jMhcLR6hvp5+Kv8XSusSXjlGcHJcZR0uSth7BBbs2Ux1/x8RRHzIscXz0kLjNO4TKWfDPhzw0q7m9vma8hqInEw/p8Zvktz11PGox1vE12qiGbnC+VWQ9mY1hgI9TiqfL4PwKrNRDVNt0hgdAQRB/GUtSgfdUdH2Q5OtRDErXUcSBAar68kgS0RG0ggTjn2WWDiYxSz6csMCmmw3kO/mzX+yTg0WJtm6B+c37w/DXoIJSU8Q5Fm/t0IgXamisGizsdsX/S9spSycphI1lWjAJ52Myk0TRlCSRsUbSrysYNkfvZRuqv1RII2y+MEy5gH1ACley3OhGLEKCOCvdUiIlFGbTmJcXfsATgkCIEoIPsWMvUPFEbCa71tyx0kqSq0rHScziWaUa3WnkWcDhsO9f3Wjl1dJZFkmK8Trjop6DkWPiYs1Tmo3CXtMuhlxox9wPwvCsv88Qrpgaf4N6mhWPuK4N8Ch1sfDtxTvB/KjQojzDd6jMJtuzKiXe+l+zsu WLnmNOpK c7M1jhXqEJB/1TJBg6siewVEF/sCEAVjjhM87GP7mvV3kPtUcn08+zdM2ogVk9BboL8Bu9fTOCDQdM6MahUetYOrAGcpsCKcHKyAGq6XOUFew2YAYzscBnTKVZ9dWkpGRPcrsBS998UZ6UMDGXE+wo/Em2Riy8aq/DdsBjM47vJhomGMWvitzVqRFd7OvTgkhzZnoiaoHmccvR0W7v3JsiTexxgxxhINSf1ArGoWJuc0/1OFAiYJSIDW93rGbCnc3BYEIjJSdNmLJxCbiRDo947EUiwgaKNPSjy1vYOZpxmn99xNMqVzqyM941meCFmLwTHTJYamtqKglap4zcx6ePUsYacAkCOScI4zcp+g6m4Q+d5OBpFtBgIDeMlICDxJDTFaS1JLGCCcJOvbMJLkBlEaQ/bubAMvEbmtawtKJJSHmqEdbjNGgqKJSsIaYO520hGR86ngO2bIUpo+vXg8bOyzR1efpowKXZIfmv/BlQjcshQJ5yMjlCti36WMzYSjrOGBnjr2C0QqC0W7oXaLkCL6Niw== 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: On Tue, Aug 22, 2023 at 01:54:58AM +0000, Joel Fernandes (Google) wrote: > This patch adds support for verifying that we correctly handle the > situation where something is already mapped before the destination of the remap. > > Any realignment of destination address and PMD-copy will destroy that > existing mapping. In such cases, we need to avoid doing the optimization. > > To test this, we map an area called the preamble before the remap > region. Then we verify after the mremap operation that this region did not get > corrupted. > > Putting some prints in the kernel, I verified that we optimize > correctly in different situations: > > Optimize when there is alignment and no previous mapping (this is tested > by previous patch). > > can_align_down(old_vma->vm_start=2900000, old_addr=2900000, mask=-2097152): 0 > can_align_down(new_vma->vm_start=2f00000, new_addr=2f00000, mask=-2097152): 0 > === Starting move_page_tables === > Doing PUD move for 2800000 -> 2e00000 of extent=200000 <-- Optimization > Doing PUD move for 2a00000 -> 3000000 of extent=200000 > Doing PUD move for 2c00000 -> 3200000 of extent=200000 > > > Don't optimize when there is alignment but there is previous mapping > (this is tested by this patch). > Notice that can_align_down() returns 1 for the destination mapping > as we detected there is something there. > > can_align_down(old_vma->vm_start=2900000, old_addr=2900000, mask=-2097152): 0 > can_align_down(new_vma->vm_start=5700000, new_addr=5700000, mask=-2097152): 1 > === Starting move_page_tables === > Doing move_ptes for 2900000 -> 5700000 of extent=100000 <-- Unoptimized > Doing PUD move for 2a00000 -> 5800000 of extent=200000 > Doing PUD move for 2c00000 -> 5a00000 of extent=200000 > > Have you additionally tested this by changing the code to be intentionally broken then running the test and observing it fail? > Signed-off-by: Joel Fernandes (Google) > --- > tools/testing/selftests/mm/mremap_test.c | 57 +++++++++++++++++++++--- > 1 file changed, 52 insertions(+), 5 deletions(-) > > diff --git a/tools/testing/selftests/mm/mremap_test.c b/tools/testing/selftests/mm/mremap_test.c > index 6304eb0947a3..d7366074e2a8 100644 > --- a/tools/testing/selftests/mm/mremap_test.c > +++ b/tools/testing/selftests/mm/mremap_test.c > @@ -29,6 +29,7 @@ struct config { > unsigned long long dest_alignment; > unsigned long long region_size; > int overlapping; > + int dest_preamble_size; > }; > > struct test { > @@ -283,7 +284,7 @@ static void *get_source_mapping(struct config c) > static long long remap_region(struct config c, unsigned int threshold_mb, > char pattern_seed) > { > - void *addr, *src_addr, *dest_addr; > + void *addr, *src_addr, *dest_addr, *dest_preamble_addr; > unsigned long long i; > struct timespec t_start = {0, 0}, t_end = {0, 0}; > long long start_ns, end_ns, align_mask, ret, offset; > @@ -300,7 +301,7 @@ static long long remap_region(struct config c, unsigned int threshold_mb, > goto out; > } > > - /* Set byte pattern */ > + /* Set byte pattern for source block. */ > srand(pattern_seed); > for (i = 0; i < threshold; i++) > memset((char *) src_addr + i, (char) rand(), 1); > @@ -312,6 +313,9 @@ static long long remap_region(struct config c, unsigned int threshold_mb, > addr = (void *) (((unsigned long long) src_addr + c.region_size > + offset) & align_mask); > > + /* Remap after the destination block preamble. */ > + addr += c.dest_preamble_size; > + > /* See comment in get_source_mapping() */ > if (!((unsigned long long) addr & c.dest_alignment)) > addr = (void *) ((unsigned long long) addr | c.dest_alignment); > @@ -327,6 +331,24 @@ static long long remap_region(struct config c, unsigned int threshold_mb, > addr += c.dest_alignment; > } > > + if (c.dest_preamble_size) { > + dest_preamble_addr = mmap((void *) addr - c.dest_preamble_size, c.dest_preamble_size, > + PROT_READ | PROT_WRITE, > + MAP_FIXED_NOREPLACE | MAP_ANONYMOUS | MAP_SHARED, > + -1, 0); > + if (dest_preamble_addr == MAP_FAILED) { > + ksft_print_msg("Failed to map dest preamble region: %s\n", > + strerror(errno)); > + ret = -1; > + goto clean_up_src; > + } > + > + /* Set byte pattern for the dest preamble block. */ > + srand(pattern_seed); > + for (i = 0; i < c.dest_preamble_size; i++) > + memset((char *) dest_preamble_addr + i, (char) rand(), 1); > + } > + > clock_gettime(CLOCK_MONOTONIC, &t_start); > dest_addr = mremap(src_addr, c.region_size, c.region_size, > MREMAP_MAYMOVE|MREMAP_FIXED, (char *) addr); > @@ -335,7 +357,7 @@ static long long remap_region(struct config c, unsigned int threshold_mb, > if (dest_addr == MAP_FAILED) { > ksft_print_msg("mremap failed: %s\n", strerror(errno)); > ret = -1; > - goto clean_up_src; > + goto clean_up_dest_preamble; > } > > /* Verify byte pattern after remapping */ > @@ -353,6 +375,23 @@ static long long remap_region(struct config c, unsigned int threshold_mb, > } > } > > + /* Verify the dest preamble byte pattern after remapping */ > + if (c.dest_preamble_size) { > + srand(pattern_seed); > + for (i = 0; i < c.dest_preamble_size; i++) { > + char c = (char) rand(); > + > + if (((char *) dest_preamble_addr)[i] != c) { > + ksft_print_msg("Preamble data after remap doesn't match at offset %d\n", > + i); > + ksft_print_msg("Expected: %#x\t Got: %#x\n", c & 0xff, > + ((char *) dest_preamble_addr)[i] & 0xff); > + ret = -1; > + goto clean_up_dest; > + } > + } > + } > + > start_ns = t_start.tv_sec * NS_PER_SEC + t_start.tv_nsec; > end_ns = t_end.tv_sec * NS_PER_SEC + t_end.tv_nsec; > ret = end_ns - start_ns; > @@ -365,6 +404,9 @@ static long long remap_region(struct config c, unsigned int threshold_mb, > */ > clean_up_dest: > munmap(dest_addr, c.region_size); > +clean_up_dest_preamble: > + if (c.dest_preamble_size && dest_preamble_addr) > + munmap(dest_preamble_addr, c.dest_preamble_size); > clean_up_src: > munmap(src_addr, c.region_size); > out: > @@ -440,7 +482,7 @@ static int parse_args(int argc, char **argv, unsigned int *threshold_mb, > return 0; > } > > -#define MAX_TEST 14 > +#define MAX_TEST 15 > #define MAX_PERF_TEST 3 > int main(int argc, char **argv) > { > @@ -449,7 +491,7 @@ int main(int argc, char **argv) > unsigned int threshold_mb = VALIDATION_DEFAULT_THRESHOLD; > unsigned int pattern_seed; > int num_expand_tests = 2; > - struct test test_cases[MAX_TEST]; > + struct test test_cases[MAX_TEST] = {}; > struct test perf_test_cases[MAX_PERF_TEST]; > int page_size; > time_t t; > @@ -510,6 +552,11 @@ int main(int argc, char **argv) > test_cases[13] = MAKE_TEST(_1MB, _1MB, _5MB, NON_OVERLAPPING, EXPECT_SUCCESS, > "5MB mremap - Source 1MB-aligned, Destination 1MB-aligned"); > > + /* Src and Dest addr 1MB aligned. 5MB mremap. */ > + test_cases[14] = MAKE_TEST(_1MB, _1MB, _5MB, NON_OVERLAPPING, EXPECT_SUCCESS, > + "5MB mremap - Source 1MB-aligned, Dest 1MB-aligned with 40MB Preamble"); > + test_cases[14].config.dest_preamble_size = 10 * _4MB; > + > perf_test_cases[0] = MAKE_TEST(page_size, page_size, _1GB, NON_OVERLAPPING, EXPECT_SUCCESS, > "1GB mremap - Source PTE-aligned, Destination PTE-aligned"); > /* > -- > 2.42.0.rc1.204.g551eb34607-goog > Looks good to me, Reviewed-by: Lorenzo Stoakes