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 AFA93C4708E for ; Mon, 2 Jan 2023 14:44:47 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 239838E0002; Mon, 2 Jan 2023 09:44:47 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 1E9AF8E0001; Mon, 2 Jan 2023 09:44:47 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 0D9AE8E0002; Mon, 2 Jan 2023 09:44:47 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id F38F28E0001 for ; Mon, 2 Jan 2023 09:44:46 -0500 (EST) Received: from smtpin03.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id ADCEBA9350 for ; Mon, 2 Jan 2023 14:44:46 +0000 (UTC) X-FDA: 80310130572.03.A31E396 Received: from mail-wr1-f48.google.com (mail-wr1-f48.google.com [209.85.221.48]) by imf26.hostedemail.com (Postfix) with ESMTP id 1E794140003 for ; Mon, 2 Jan 2023 14:44:44 +0000 (UTC) Authentication-Results: imf26.hostedemail.com; dkim=pass header.d=gmail.com header.s=20210112 header.b=POcgRsv3; spf=pass (imf26.hostedemail.com: domain of lstoakes@gmail.com designates 209.85.221.48 as permitted sender) smtp.mailfrom=lstoakes@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1672670685; 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=VgFmNRdHygLva/1e819I9RIBayyDHYYRyCiC5tgLkZE=; b=wVqyQTh5A/leOUfqr+FS6MSz/rexW9K5hC/0xgobKtPf86a6U4QmHXxXAv9jATgT4Rk93T R8CAC8DNYkLCgqvJ242MZvLjzXHF6N21CeI9ZqyWahqg0B3kb4D917Vn4QkdkUDyXJwBe/ InqNoF6G0GF0Blcu2gz/dQ5YxE8/Lu8= ARC-Authentication-Results: i=1; imf26.hostedemail.com; dkim=pass header.d=gmail.com header.s=20210112 header.b=POcgRsv3; spf=pass (imf26.hostedemail.com: domain of lstoakes@gmail.com designates 209.85.221.48 as permitted sender) smtp.mailfrom=lstoakes@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1672670685; a=rsa-sha256; cv=none; b=sjEkLusIOCsbS+ujVMDHq+FKXWAtmEbPBjohdjbHsKdtAWuXPGknDNXJ9pI1Af1RxF/BAV 1jwb6pivIdZGd6zE9n3Z2Quetdxe/S4Kz5c/gHuAVyh7gqb9tPmB7LFY+krVRUfYMZKsjU QmLH9kgFMtDeNzpRWUiaq/rS5r8WTNg= Received: by mail-wr1-f48.google.com with SMTP id y8so26420836wrl.13 for ; Mon, 02 Jan 2023 06:44:44 -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=VgFmNRdHygLva/1e819I9RIBayyDHYYRyCiC5tgLkZE=; b=POcgRsv3ouy8PBGVrpluD+aI9uTpA/FDDkJRtLTj5IUTTQXqq1GYRgDnhJyd6bBtEE BZmFDiAanM3PuSd5W5ukfZ88R6b3EuvkQY9HQnKQlQL6cWep47m9mBFuwD7FutlydoJp WABWX9b3rBs12BUU6Ifxx2SIgLl/BAs8BmBMPE3Elu7WcJ4oS4WeVrzArAHu4x4mNFsi 4hyjNVj99QtmWtGeiAqgTiKPk2Pzg2PmsVSSASJb6oD0QEpfonq3maBMJr4MvE4gpfxg fgbpvxMpgtAMCECACEK9951osnI2RLMha6NB0eGXFEPdlW+Ji/O+TtKwyWtFFUWPGQqf DB8A== 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=VgFmNRdHygLva/1e819I9RIBayyDHYYRyCiC5tgLkZE=; b=KZiW6qtCaGNFEFCy9ecZjCP7lapq0sVe4KcKee2AgZ4DDnjYGIn3MTVQ44w2Cv9A1y bszrJy3yUuN++F9nAQheV7eM1CA47rOLkrLSxD6NOt5C1qYpv8UCmPDtXAouC4QghSVP 9y+sE1ywt019biT7Rb5d7Z3rAeokUQpJbcrvUFCNiP+a60M1AYTfxTD6fAyA5E/hxBQ/ TdwRPwRw9M6g4Ubyb/8z58D1W6WTRcCqs3CABU7PuQ4nn+tYpbitOK6rhIawGW3m8Ihg 03rf2CFdAd0KBqWKyz3rK7PKmNa9JisgjB9YIaYe2bQrf26mYEdFx9YIcST58a57MT+x 5NTg== X-Gm-Message-State: AFqh2kqZMdKJFC26s8xFLmF2Qr1zlm6vndBlfCaqTyaly1gaysYqrpoR fevwqhYVLEidSj2jE6wAhB2hmZawOj8= X-Google-Smtp-Source: AMrXdXsLvnP1C5KuZUTiX0RgYNyRX6OcA/vZ359lOBSMfS+hmVc1iGRioX/NzqBGjjbO3GviXU0ULw== X-Received: by 2002:adf:fcc6:0:b0:277:7243:5cef with SMTP id f6-20020adffcc6000000b0027772435cefmr25540430wrs.67.1672670683159; Mon, 02 Jan 2023 06:44:43 -0800 (PST) Received: from localhost.localdomain ([2a01:4c8:469:341:d1e1:a149:58ed:f096]) by smtp.googlemail.com with ESMTPSA id v3-20020a5d4a43000000b0026fc5694a60sm28364338wrs.26.2023.01.02.06.44.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Jan 2023 06:44:42 -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 v2] selftest/vm: add mremap expand merge offset test Date: Mon, 2 Jan 2023 14:44:33 +0000 Message-Id: X-Mailer: git-send-email 2.39.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Stat-Signature: qjx9fzpe6dixbop9cw7n7r65cn1s9udp X-Rspam-User: X-Rspamd-Queue-Id: 1E794140003 X-Rspamd-Server: rspam06 X-HE-Tag: 1672670684-886172 X-HE-Meta: U2FsdGVkX19gi1YXuLMSSvZsL3BaKGdlWdeow68LjdLalmmdFKOQyVx5CFd+nAfZwbt7Df6/e+/A+D3/gvSrjz9T291suovOm/fEEMZpOmf9z1GRMLGLekJ7OA6375qpbsc8vG6rZuJJuCRSAzCMGjr7AUWKshH5VDLTMKO5xpCPz2KYoOWL/t2Wco3+7HGdeIDaYT0MSyaUrZJsh+SGG33CWcQfduoUJ4sDOHRejzRx+GlST//MqJnmElFhcmMohAXhnRSjtqaps/n70lEv8Ey0ibECkDMIb9LFEZKj1ooujzU/+XD9BG6ctbX6yrq9WWi+U8nmdAF6x4oFaecem9YIwdwh8OdpemltMOFR1hkMfC2A/ps4Fi89rXcIy0UV4USzhmSAu+pQT3sVx02Xoxa/hIEmT+fZQP6kwfB0i2BIHXb8h36iBcrm9wJ/wx21LmTnIerrlRfvx9IxXXw4gUQR3gDLb4/36fPDus10OY9KBuv77T0cAmKiX4fW8rWKbW5I3COtMOvVcYTJLmIOcsVFHKjr5JqqSEaE4whfYjv4L5c7jEOfgNWXqQuIxtJkhLFqflLfKhx029SRFvzDVY95i/6O34I2lCZZtrXOuEFgOre0HzfITaHDF9DfrNsLCdwnlN2oqqILG/2Ld2cGSQ2zF7d/9wntBsnRhI/xRTfa7esashLiiLE47pcZy8EufxIF28vttIVWQxt9UNI5/bGppZP+qTjq5t8Qt2DK+9eZ52JpowhVaq/7PekLoridnp8L7tjCehy1/7q1tjRou4SiILp/vAhjVfND5+Qh3mZceMxEFYxrpJEqgOyeFPueqjg75Eu7gDBOlP+jxk8BV51vYbAa9cw8vaSnLHwRE9C8+bkrlhPfnczsqeZBGpSBDaAHgCyQCCDPcEz2j9ABQALih++YiFkRiOSw52JaQTcjJNn1Zfte7BG8c5QCe+NevQn/ourBFaKP6lennTx /T8c5jxc JX9TeYUBePWNINH7Y5fetskTt+bCyaFJUttvWnkRLIBFiU+1jr3QC+mxQKzWrT3hNGKiE9XRl1urPZ8tOdgd1ljeMklE/ob1Xw81ZIVcmtIBsmq2MeGTbt5ZqyId0WupXgOTh 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 --- tools/testing/selftests/vm/mremap_test.c | 115 ++++++++++++++++++----- 1 file changed, 93 insertions(+), 22 deletions(-) diff --git a/tools/testing/selftests/vm/mremap_test.c b/tools/testing/selftests/vm/mremap_test.c index 9496346973d4..8946283b0ba5 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,15 @@ 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)); + } else { + 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", -- 2.39.0