From patchwork Mon Jan 2 16:11:26 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lorenzo Stoakes X-Patchwork-Id: 13086824 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 29FC8C3DA7A for ; Mon, 2 Jan 2023 16:11:44 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id B21368E0002; Mon, 2 Jan 2023 11:11:43 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id AD08C8E0001; Mon, 2 Jan 2023 11:11:43 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 997EA8E0002; Mon, 2 Jan 2023 11:11:43 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 883E88E0001 for ; Mon, 2 Jan 2023 11:11:43 -0500 (EST) Received: from smtpin15.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id 62A10C09AC for ; Mon, 2 Jan 2023 16:11:43 +0000 (UTC) X-FDA: 80310349686.15.A87F3C7 Received: from mail-wm1-f53.google.com (mail-wm1-f53.google.com [209.85.128.53]) by imf09.hostedemail.com (Postfix) with ESMTP id B52C914000B for ; Mon, 2 Jan 2023 16:11:41 +0000 (UTC) Authentication-Results: imf09.hostedemail.com; dkim=pass header.d=gmail.com header.s=20210112 header.b=K0Mz7Mtm; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf09.hostedemail.com: domain of lstoakes@gmail.com designates 209.85.128.53 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=1672675901; 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-transfer-encoding:content-transfer-encoding: in-reply-to:references:dkim-signature; bh=I2umSBEKU1jrOTCQbYbaE77i1/wcdwV3wcFFtsOdAgA=; b=iEa1qzVvLDqrgMDH6iX3ws70CuZnyJ9I4rclJwCza6bfhDe5oGSRAKrgexUwRGbtzjkxoj p6H+NQJZSHBR4i1ZUWh/Q50G5of3FcT18XoMCT7HEfhOVf9UXv2OXLpKV01wTDpYa4tAvL z8J7enc60Pl0boxEJQnibDBB6irsVvA= ARC-Authentication-Results: i=1; imf09.hostedemail.com; dkim=pass header.d=gmail.com header.s=20210112 header.b=K0Mz7Mtm; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf09.hostedemail.com: domain of lstoakes@gmail.com designates 209.85.128.53 as permitted sender) smtp.mailfrom=lstoakes@gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1672675901; a=rsa-sha256; cv=none; b=dl4Lo+ZNdMToUU+t0SKoUxF+0R93ePaBs1DqiAn2yLzVMSNAzFH4LQgJ9fqAE0JvlD/mC5 PnWLUUHUMJ00ZAFJaZr6+5tkIHqtPghmvtmMBvZxYLvprScIZE02SQ1qTklb63YuMVuPds SNhVOilgRF7WWFxG1Rg7qpSDYrldg/Q= Received: by mail-wm1-f53.google.com with SMTP id c65-20020a1c3544000000b003cfffd00fc0so24164069wma.1 for ; Mon, 02 Jan 2023 08:11:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=I2umSBEKU1jrOTCQbYbaE77i1/wcdwV3wcFFtsOdAgA=; b=K0Mz7MtmcBe5SPITyUynOpL8Bwxtsuj7PNqEvf5Y5tqSRKqS19g67euiPtH5s4WE24 yplTdRexanBDCgI1726wIhgGV4ZrkJCJTFWkAP/jiaL1FHUhhkesuGqQh1x48xbUyg8S wjQCePkwCI0AlpLmRtp4B0JoevW/LF4PiR0QvjXuxkuDjmbgnygz2/Xr+Tc00B782ty7 oedDIIormmO17UkdyzZbTjgr/8dyq58yp9c+J9b85izqbT3d/JAVPxsA0C+p+hAV0t7T 13fGuhuJMC7DOORSAp+loZTovRrgsetomoBwclWWRzWdfmhbZeJdKMNMa1urC7V+75YY ryvg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=I2umSBEKU1jrOTCQbYbaE77i1/wcdwV3wcFFtsOdAgA=; b=b8uJZOdWzgHbQ9br3P1Jlhgj4y++VMvIYuQoVXW9ItS+IL1fo5tWGi9mYt5VaV4zAX fX9oQSFXC/m6wqU85EnF6PAXHaGn1VYCfqU58LOCpfYHhS4M3ZYvqP7htWrH1eTrRjHK Esbm7EHJ4gaqxZZYLLkyexVjbz4Ps47tY+7ZJA7qJLY4wWyFCQ/Fzq5LDhp4Z+bvTQnT lo+Vj/YxDlvJx3TU8xbTQv9Ju+UgmPhzGHbSHXFrEsOJ2OOdNBFS6XJEIStg0bifnN55 EYJqr3oiugtybMA9tKU9fmlmw2ap9H5wBEZOHhSrLoATvOccWbEbbx/xTLMfHAbhXgy/ d5oQ== X-Gm-Message-State: AFqh2krrOeHK+U4BmUuOs0gyI3hWwcUdVBR57eEKATMu4pK/uSdsAPiL Z3lVgmSr3c07WRH2g7CHn7T7r95YZqU= X-Google-Smtp-Source: AMrXdXst+qvS//a+dHeFG+MatIC9d6NTDrjz2ezqJVlLLtk3tnuWXtftAgnGOc63+/RYWfg+zpLlpQ== X-Received: by 2002:a1c:4b04:0:b0:3c6:f0b8:74e6 with SMTP id y4-20020a1c4b04000000b003c6f0b874e6mr29900964wma.4.1672675899980; Mon, 02 Jan 2023 08:11:39 -0800 (PST) Received: from localhost.localdomain ([2a01:4c8:469:341:d1e1:a149:58ed:f096]) by smtp.googlemail.com with ESMTPSA id w23-20020a1cf617000000b003d9b89a39b2sm2923816wmc.10.2023.01.02.08.11.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Jan 2023 08:11:39 -0800 (PST) From: Lorenzo Stoakes To: linux-mm@kvack.org, Andrew Morton , Shuah Khan , linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Vlastimil Babka , Jakub Matena , Matthew Wilcox , Mel Gorman , Michal Hocko , David Hildenbrand , Lorenzo Stoakes Subject: [PATCH v4] selftest/vm: add mremap expand merge offset test Date: Mon, 2 Jan 2023 16:11:26 +0000 Message-Id: <02b117a8ffd52acc01dc66c2fb39754f08d92c0e.1672675824.git.lstoakes@gmail.com> X-Mailer: git-send-email 2.39.0 MIME-Version: 1.0 X-Rspamd-Queue-Id: B52C914000B X-Rspamd-Server: rspam09 X-Rspam-User: X-Stat-Signature: spmf3gsymhzu71pfmftu4spnsa3haan7 X-HE-Tag: 1672675901-784420 X-HE-Meta: U2FsdGVkX1/oZ18+UP8UcwRZUy+B2xgI1782z0CmhjMURPvMxsTsaGmuUZm34bZl7rGjXOIgGjT+noW+Qrj/eBPxpTB0ztS/HahpVPWqXitkrRDHsYFUmY5bBglQ4bsQ4gj/fqIAi+4oenCAfhBycSwFB3XLMrB3miMdnF1ILvK8YFxrATwIakqxxeB75FP2xphkGiti8Sb3FkpLtgRQoZ3gkOTtKKUmmHIJt/pg9vqRjz7Z41kUWwsSuGw/aCGZ/r1FVg+m/vrXTcmY/ra0NDbD9czMRvwkthdxL2LYTj2a1fZn58Sne6W9j9ubAgyJhthRjgjfC8uSXwYIGYWe8CAZ+m6SM9Bq9ydKPEIhm1dq3Svq6wXo1sB3fL/FYXy/OVTqeCKYdEPyhogyswOVatcZ3DDDyggWHtHnMc7FNrcrRUgbbuI29BiCxHzboNfrHNL7CFMEH3Gvkgd/danL4F3CVCpDU3jPJzgpBvV14nAHq9nlsCYVF150ObE7NnVHM+v71KGYxF2ChE6M6U4LmX/PJbIhx2qmBddj5JLpV4zRnX5ARguaOzMXrcTpZrhhJB//g2nNdihW0Z2lztXGtoBq/QfwK3wfBRqGvGrQCf7hgDRGbls7u0yaY3c1wCYIo61qmO56UTNx+HZ93gknL08lkAvEZx8GWH0RBsWcXqBAoP1uMLMvabiTPzdR80n8nKUZZBfwEFh9j1w+nIx4cc9JzETYvftKjvKrhmWrU05ak+Qc8qFGP199BBAfP80mBaY+X4URSgyeDis+/+sGRqhlHSCQXDTk58/60afTUTh0zRPLaAcMt70YC+DVh6QqFkdxFaik/Wxal2t+A/b277vFv89QQ0KOrzXWbhK/668DfloPi+w49hf1r/kE0/fL/0aGbFx1ByxFFr+qhN5WcGNQII4Jhy20cepPu+CZqZyO9zL7QzxeWqjMHg3bU7ZWoNu9HhDTDA359wjdDQQ pEM6QicJ +TIb8oB9NKs3WKndlx+dsY7dhWYYF4SFC56SZUHxiSNsfB8icsqZAfHM6Wtjt3RGluUvYxgnEChWavJ7IkyPWxqo5VSYrnfDDTpSFOTtTIDDtC3yiUbLfHNn5+sMkShipZybf 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: Add a test to assert that we can mremap() and expand a mapping starting from an offset within an existing mapping. We unmap the last page in a 3 page mapping to ensure that the remap should always succeed, before remapping from the 2nd page. This is additionally a regression test for the issue solved in "mm, mremap: fix mremap() expanding vma with addr inside vma" and confirmed to fail prior to the change and pass after it. Finally, this patch updates the existing mremap expand merge test to check error conditions and reduce code duplication between the two tests. Signed-off-by: Lorenzo Stoakes Acked-by: David Hildenbrand --- tools/testing/selftests/vm/mremap_test.c | 117 ++++++++++++++++++----- 1 file changed, 95 insertions(+), 22 deletions(-) diff --git a/tools/testing/selftests/vm/mremap_test.c b/tools/testing/selftests/vm/mremap_test.c index 9496346973d4..a705dfe7b259 100644 --- a/tools/testing/selftests/vm/mremap_test.c +++ b/tools/testing/selftests/vm/mremap_test.c @@ -119,47 +119,109 @@ static unsigned long long get_mmap_min_addr(void) } /* - * This test validates that merge is called when expanding a mapping. - * Mapping containing three pages is created, middle page is unmapped - * and then the mapping containing the first page is expanded so that - * it fills the created hole. The two parts should merge creating - * single mapping with three pages. + * Using /proc/self/maps, assert that the specified address range is contained + * within a single mapping. */ -static void mremap_expand_merge(unsigned long page_size) +static bool is_range_mapped(FILE *maps_fp, void *start, void *end) { - char *test_name = "mremap expand merge"; - FILE *fp; char *line = NULL; size_t len = 0; bool success = false; - char *start = mmap(NULL, 3 * page_size, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - - munmap(start + page_size, page_size); - mremap(start, page_size, 2 * page_size, 0); - fp = fopen("/proc/self/maps", "r"); - if (fp == NULL) { - ksft_test_result_fail("%s\n", test_name); - return; - } + rewind(maps_fp); - while (getline(&line, &len, fp) != -1) { + while (getline(&line, &len, maps_fp) != -1) { char *first = strtok(line, "- "); void *first_val = (void *)strtol(first, NULL, 16); char *second = strtok(NULL, "- "); void *second_val = (void *) strtol(second, NULL, 16); - if (first_val == start && second_val == start + 3 * page_size) { + if (first_val <= start && second_val >= end) { success = true; break; } } + + return success; +} + +/* + * This test validates that merge is called when expanding a mapping. + * Mapping containing three pages is created, middle page is unmapped + * and then the mapping containing the first page is expanded so that + * it fills the created hole. The two parts should merge creating + * single mapping with three pages. + */ +static void mremap_expand_merge(FILE *maps_fp, unsigned long page_size) +{ + char *test_name = "mremap expand merge"; + bool success = false; + char *remap, *start; + + start = mmap(NULL, 3 * page_size, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + + if (start == MAP_FAILED) { + ksft_print_msg("mmap failed: %s\n", strerror(errno)); + goto out; + } + + munmap(start + page_size, page_size); + remap = mremap(start, page_size, 2 * page_size, 0); + if (remap == MAP_FAILED) { + ksft_print_msg("mremap failed: %s\n", strerror(errno)); + munmap(start, page_size); + munmap(start + 2 * page_size, page_size); + goto out; + } + + success = is_range_mapped(maps_fp, start, start + 3 * page_size); + munmap(start, 3 * page_size); + +out: + if (success) + ksft_test_result_pass("%s\n", test_name); + else + ksft_test_result_fail("%s\n", test_name); +} + +/* + * Similar to mremap_expand_merge() except instead of removing the middle page, + * we remove the last then attempt to remap offset from the second page. This + * should result in the mapping being restored to its former state. + */ +static void mremap_expand_merge_offset(FILE *maps_fp, unsigned long page_size) +{ + + char *test_name = "mremap expand merge offset"; + bool success = false; + char *remap, *start; + + start = mmap(NULL, 3 * page_size, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + + if (start == MAP_FAILED) { + ksft_print_msg("mmap failed: %s\n", strerror(errno)); + goto out; + } + + /* Unmap final page to ensure we have space to expand. */ + munmap(start + 2 * page_size, page_size); + remap = mremap(start + page_size, page_size, 2 * page_size, 0); + if (remap == MAP_FAILED) { + ksft_print_msg("mremap failed: %s\n", strerror(errno)); + munmap(start, 2 * page_size); + goto out; + } + + success = is_range_mapped(maps_fp, start, start + 3 * page_size); + munmap(start, 3 * page_size); + +out: if (success) ksft_test_result_pass("%s\n", test_name); else ksft_test_result_fail("%s\n", test_name); - fclose(fp); } /* @@ -385,6 +447,7 @@ int main(int argc, char **argv) struct test perf_test_cases[MAX_PERF_TEST]; int page_size; time_t t; + FILE *maps_fp; pattern_seed = (unsigned int) time(&t); @@ -458,7 +521,17 @@ int main(int argc, char **argv) run_mremap_test_case(test_cases[i], &failures, threshold_mb, pattern_seed); - mremap_expand_merge(page_size); + maps_fp = fopen("/proc/self/maps", "r"); + + if (maps_fp == NULL) { + ksft_print_msg("Failed to read /proc/self/maps: %s\n", strerror(errno)); + exit(KSFT_FAIL); + } + + mremap_expand_merge(maps_fp, page_size); + mremap_expand_merge_offset(maps_fp, page_size); + + fclose(maps_fp); if (run_perf_tests) { ksft_print_msg("\n%s\n",