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 8040EC52D7C for ; Wed, 21 Aug 2024 15:56:45 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id DE2516B0137; Wed, 21 Aug 2024 11:56:44 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id D6BD26B0138; Wed, 21 Aug 2024 11:56:44 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id BE5636B0139; Wed, 21 Aug 2024 11:56:44 -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 9D27D6B0137 for ; Wed, 21 Aug 2024 11:56:44 -0400 (EDT) Received: from smtpin01.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 5F0A31A0DC6 for ; Wed, 21 Aug 2024 15:56:44 +0000 (UTC) X-FDA: 82476705528.01.0E43407 Received: from mail-oa1-f45.google.com (mail-oa1-f45.google.com [209.85.160.45]) by imf09.hostedemail.com (Postfix) with ESMTP id 6D7AA14002E for ; Wed, 21 Aug 2024 15:56:42 +0000 (UTC) Authentication-Results: imf09.hostedemail.com; dkim=pass header.d=chromium.org header.s=google header.b=oM7guNdR; spf=pass (imf09.hostedemail.com: domain of jeffxu@chromium.org designates 209.85.160.45 as permitted sender) smtp.mailfrom=jeffxu@chromium.org; dmarc=pass (policy=none) header.from=chromium.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1724255722; 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:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=K4R0EpO3n6kf/aoNBWtHJ6eqC3Vmvm7kimMhDLs6BFo=; b=QMbtBNOIXKjtat9zDIlWTsV4Ry2wp1Jw7PE9hs/zpqfsIPIlqx/+Nr1INH0qdMbvsgGI3q 2RFvrIEG6Ce88JGU1skDsSDIk2X37cYv2qfz34DUQyjwKIhirK/oYA8tHbus2votygKTOb W+4oN54Ej2SMrwnCFSlxCZY7kHTBH6A= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1724255722; a=rsa-sha256; cv=none; b=Q0l1RerPQgfeFgexSTi9EYiVC/4yBwyWsVl21OjNgWgUa5YmXNb3aqa3LXhME5rh2fhgor W92t3psKyJvk+81yzA9gbWKzNTtM/HZhXH2UPNbxwy6dv0pvpsE0crGCFkwdDG+t/mYNNT gCLcUhNlZ+JLYl4YVjUvZiZimrDQg3c= ARC-Authentication-Results: i=1; imf09.hostedemail.com; dkim=pass header.d=chromium.org header.s=google header.b=oM7guNdR; spf=pass (imf09.hostedemail.com: domain of jeffxu@chromium.org designates 209.85.160.45 as permitted sender) smtp.mailfrom=jeffxu@chromium.org; dmarc=pass (policy=none) header.from=chromium.org Received: by mail-oa1-f45.google.com with SMTP id 586e51a60fabf-27080f38697so87708fac.0 for ; Wed, 21 Aug 2024 08:56:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1724255801; x=1724860601; darn=kvack.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=K4R0EpO3n6kf/aoNBWtHJ6eqC3Vmvm7kimMhDLs6BFo=; b=oM7guNdR8t7lju3apK4YI4ENlSIjYiqc5ySh3Y6UpqlaxJ+QzkddgK/qcMCpPRdXLL A5JE/ldD1CytYTZgYC1+lm61JVRmy1XsCquPcbRB79rveY/rWMMr8zX8krNYIRiEZben xIeU6Hh/liulUaajiar13uG0NM/UnHI1tcbEQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1724255801; x=1724860601; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=K4R0EpO3n6kf/aoNBWtHJ6eqC3Vmvm7kimMhDLs6BFo=; b=LLQSh0+EW9Uo8sMecLZuynFPQkaPmXSvyPFLFgeuR/DITWhABjCseZHRBLh1sHx2iR 9vEVOp/J+YC3gUklKGyKaF2fzKX62DmLNQqR+jvsdpX0MJe0ijdea5pIuMLqH7aSu6zG 5YPGQJONJtYHw1xKiMldWiriMbjWCakwq5oCkqwpcLTEWCVmEjm2WOEYaCn3LUGBIJ8L 1BkjgZdXdbGQvuscDIN/K6suXpTVuxhvrP3L2n3cya0jdvKyR0IIscNtOJ0yM/n6UtVU O4KfXRJWxlhLW5HR8P4wtkOG93XP7yARfJ73XwbgvLQl2CQ/4WvndqlPgBDNMP0zMbFj OqJA== X-Forwarded-Encrypted: i=1; AJvYcCXVxQS52SneNSmiKqJZYNOmikdVfekIFY3ql417e2A01a974CEJ3aqeeAGph1AcDimmQVuZJt5JZQ==@kvack.org X-Gm-Message-State: AOJu0YybVeW2KMsQcpax6YPUtK3QV/zzq2Hag4EJJ9+Cqao9n4PnwX1k NQmkLyZg7Rhpx8Wf9lN39wcUh6lTpK1RaTlSMrMyniUQ9PaFkTqlG1+0wTVmvggett0rOOEJJuW kmXCsd3xJJBlYjSc699rGAkmJ+06iWpblsjjD X-Google-Smtp-Source: AGHT+IHQrNsaqsPrV0SsczE2097vU/k5NSjxN5oNDCms/3WeUiXNWcDhOSFOSGYJUmNzaJQxram2qpwb0saZ4t1xuko= X-Received: by 2002:a05:6870:5491:b0:260:e907:4646 with SMTP id 586e51a60fabf-2737ef08cfamr1786607fac.4.1724255801237; Wed, 21 Aug 2024 08:56:41 -0700 (PDT) MIME-Version: 1.0 References: <20240817-mseal-depessimize-v3-0-d8d2e037df30@gmail.com> <20240817-mseal-depessimize-v3-7-d8d2e037df30@gmail.com> In-Reply-To: <20240817-mseal-depessimize-v3-7-d8d2e037df30@gmail.com> From: Jeff Xu Date: Wed, 21 Aug 2024 08:56:28 -0700 Message-ID: Subject: Re: [PATCH v3 7/7] selftests/mm: add more mseal traversal tests To: Pedro Falcato Cc: Andrew Morton , "Liam R. Howlett" , Vlastimil Babka , Lorenzo Stoakes , Shuah Khan , linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, oliver.sang@intel.com, torvalds@linux-foundation.org, Michael Ellerman , Kees Cook Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Stat-Signature: nfujwitk4zdbs51e17ry8a877mz3s399 X-Rspamd-Queue-Id: 6D7AA14002E X-Rspam-User: X-Rspamd-Server: rspam08 X-HE-Tag: 1724255802-548829 X-HE-Meta: U2FsdGVkX186I8iOopa/tyK/DlQcnqN+hPJj1bxqSW5LXlxZLxHH33IuhA2DyEgyFJM5RNXikIJ9HBKN5hQzj+PXIliKqx7PLRTophgBibCIgb2hqmNIviYj0uLDWuUWKYzOJwAM5huOUwmExME5kpRZ0uvYiAxbW5AjWLLAqKIL4UHY/EqUEMHcV113n6yq0J3qUKNqjrv8N20rCG8z9H5a7gYp2YS/WK8wMBdAU6lRnEuBoK8n3tNzYQ28MgH1RDgsceaNir1hVCHsLXNjDgWAvtmSR7jH3D7pOCBLKnENwFSw2i4MovJfUC1UhRY/QySi8LT00c9q8zBA7WKtL2v2wXWAz0CKfFtjEI82WuDZW247bI+alTbhyQNjrFmtEQJegaILVk0mH7uWzygQILdf+GFiT4IXZowMiyhO2VbftdoMLqw9lmXdZ371fnX/uRhZUFxCmSi/kukVF2/S6yjpIi7bwj7qzvLuMFFvsqy1wMV6tGa0NwfbZ/C6tSDC/7rUB0nwt4bT/o6WTa5e2UBOcg/5J/nZlMqj5RlTcZ8x/TEbM62oHhHDpzoN0NRl5EyOGOuMaeWUb5NMY3095uDBAMV2oqqnpDKQ+6RoFX04C9tzhWy49DUzq75XjBc1IvvfTLMRj6eN0YV80n8mNxFxfdGCAJ1HsZ0K7fyaa/R346U+xfk3soVssRZQACvAf0Jp8vHcX1LyHl4XbmdcxLOEef+5A9WM/eBQGF5BBXdXCc+GpJJ5dgMg2zHs/hMbI8BccEFAMb6A9rZejWoIZ0TzPUzQ5JOf1uQwls/BgrnHqPtFn9QONBc9LAVNP2tbJBjhne/ihJkTLJzb1JuyR3FCqnQN3qzAVtEirR00H11Lr3dPgm1YcOU7siuMDYkSmZADoOY75hLq4upDfnJEXUuDEIjszjLQBAGLSMxqhaRJrXwlkyKtRx3Hj1en/XC9GqC+T67Gja/SOftLrNq Ogj5scSu Z2JYus9ITrsUA923XnA+fT1LgGo0tPWgpi4KqFAOrrPxPDiQKyPM9DWvo34UHb+rk3oPuQdhyHi4JplHmgGo4mDc7pKiFyw+N17AKKDFtVaJpYW+ZtBrxPVITft7RpT3m5qu1Jy2dZ05nT86mbhUVT0+0DbyB/4AWGDeeHR8lp7HTWVxPHTsRx8Z+qh1vJtUIK3TBmJ5spDzvzTAcWDSJdyIu+obeqTTWWfvjqtE5+2hRwWBoUgM+N4ppzNuNnPImBE21tSx7WW3YPgdp2Hiict829zXUMKr8PpWvcgk9cngBs8axPQp7WSb/oGP8a5Y9inxr2ry/KlX72Bs= 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: List-Subscribe: List-Unsubscribe: Hi Pedro On Fri, Aug 16, 2024 at 5:18=E2=80=AFPM Pedro Falcato wrote: > > Add more mseal traversal tests across VMAs, where we could possibly > screw up sealing checks. These test more across-vma traversal for > mprotect, munmap and madvise. Particularly, we test for the case where a > regular VMA is followed by a sealed VMA. > > Signed-off-by: Pedro Falcato > --- > tools/testing/selftests/mm/mseal_test.c | 111 ++++++++++++++++++++++++++= +++++- > 1 file changed, 110 insertions(+), 1 deletion(-) > > diff --git a/tools/testing/selftests/mm/mseal_test.c b/tools/testing/self= tests/mm/mseal_test.c > index 259bef4945e9..0d4d40fb0f88 100644 > --- a/tools/testing/selftests/mm/mseal_test.c > +++ b/tools/testing/selftests/mm/mseal_test.c > @@ -766,6 +766,42 @@ static void test_seal_mprotect_partial_mprotect(bool= seal) > REPORT_TEST_PASS(); > } > > +static void test_seal_mprotect_partial_mprotect_tail(bool seal) > +{ > + void *ptr; > + unsigned long page_size =3D getpagesize(); > + unsigned long size =3D 2 * page_size; > + int ret; > + int prot; > + > + /* > + * Check if a partial mseal (that results in two vmas) works corr= ectly. > + * It might mprotect the first, but it'll never touch the second = (msealed) vma. > + */ > + > + setup_single_address(size, &ptr); > + FAIL_TEST_IF_FALSE(ptr !=3D (void *)-1); > + > + if (seal) { > + ret =3D sys_mseal(ptr + page_size, size); you are allocating 2 pages , and I assume you are sealing the second page, so the size should be page_size. ret =3D sys_mseal(ptr + page_size, page_size); > + FAIL_TEST_IF_FALSE(!ret); > + } > + > + ret =3D sys_mprotect(ptr, size, PROT_EXEC); > + if (seal) > + FAIL_TEST_IF_FALSE(ret < 0); > + else > + FAIL_TEST_IF_FALSE(!ret); > + > + if (seal) { > + FAIL_TEST_IF_FALSE(get_vma_size(ptr + page_size, &prot) >= 0); > + FAIL_TEST_IF_FALSE(prot =3D=3D 0x4); To test partial mprotect, the test needs to add the check for the first page to be changed, Also to avoid the merge, a PROT_NONE page can to be added in front. > + } > + > + REPORT_TEST_PASS(); > +} > + > + > static void test_seal_mprotect_two_vma_with_gap(bool seal) > { > void *ptr; > @@ -983,6 +1019,41 @@ static void test_seal_munmap_vma_with_gap(bool seal= ) > REPORT_TEST_PASS(); > } > > +static void test_seal_munmap_partial_across_vmas(bool seal) > +{ > + void *ptr; > + unsigned long page_size =3D getpagesize(); > + unsigned long size =3D 2 * page_size; > + int ret; > + int prot; > + > + /* > + * Check if a partial mseal (that results in two vmas) works corr= ectly. > + * It might unmap the first, but it'll never unmap the second (ms= ealed) vma. > + */ > + > + setup_single_address(size, &ptr); > + FAIL_TEST_IF_FALSE(ptr !=3D (void *)-1); > + > + if (seal) { > + ret =3D sys_mseal(ptr + page_size, size); ret =3D sys_mseal(ptr + page_size, page_size); > + FAIL_TEST_IF_FALSE(!ret); > + } > + > + ret =3D sys_munmap(ptr, size); > + if (seal) > + FAIL_TEST_IF_FALSE(ret < 0); > + else > + FAIL_TEST_IF_FALSE(!ret); > + > + if (seal) { > + FAIL_TEST_IF_FALSE(get_vma_size(ptr + page_size, &prot) >= 0); > + FAIL_TEST_IF_FALSE(prot =3D=3D 0x4); To test partial unmap, the test needs to add the check for the first page to be freed, Also to avoid the merge, a PROT_NONE page needs to be in front. The test_seal_munmap_partial_across_vmas shows the behavior difference with in-loop approach and out-loop approach. Previously, both VMAs will not be freed, now the first VMA will be freed, and the second VMA (sealed) won't. This brings to the line you previously mentioned: [1] and I quote: "munmap is atomic and always has been. It's required by POSIX." So this is no longer true for the current series. Linux doesn't need to be POSIX compliant, from previous conversation on this topic with Linus [2], so I'm open to that. If this is accepted by Linus, it would be better to add comments on munmap code or tests, for future readers (in case they are curious about reasoning. ) [1] https://lore.kernel.org/linux-mm/CAKbZUD3_3KN4fAyQsD+=3Dp3PV8svAvVyS278= umX40Ehsa+zkz3w@mail.gmail.com/ [2] https://lore.kernel.org/linux-mm/CAHk-=3DwgDv5vPx2xoxNQh+kbvLsskWubGGGK= 69cqF_i4FkM-GCw@mail.gmail.com/ > + } > + > + REPORT_TEST_PASS(); > +} > + > static void test_munmap_start_freed(bool seal) > { > void *ptr; > @@ -1735,6 +1806,37 @@ static void test_seal_discard_ro_anon(bool seal) > REPORT_TEST_PASS(); > } > > +static void test_seal_discard_across_vmas(bool seal) > +{ > + void *ptr; > + unsigned long page_size =3D getpagesize(); > + unsigned long size =3D 2 * page_size; > + int ret; > + > + setup_single_address(size, &ptr); > + FAIL_TEST_IF_FALSE(ptr !=3D (void *)-1); > + > + if (seal) { > + ret =3D seal_single_address(ptr + page_size, page_size); > + FAIL_TEST_IF_FALSE(!ret); > + } > + > + ret =3D sys_madvise(ptr, size, MADV_DONTNEED); > + if (seal) > + FAIL_TEST_IF_FALSE(ret < 0); > + else > + FAIL_TEST_IF_FALSE(!ret); > + > + ret =3D sys_munmap(ptr, size); > + if (seal) > + FAIL_TEST_IF_FALSE(ret < 0); > + else > + FAIL_TEST_IF_FALSE(!ret); > + > + REPORT_TEST_PASS(); > +} > + > + > static void test_seal_madvise_nodiscard(bool seal) > { > void *ptr; > @@ -1779,7 +1881,7 @@ int main(int argc, char **argv) > if (!pkey_supported()) > ksft_print_msg("PKEY not supported\n"); > > - ksft_set_plan(82); > + ksft_set_plan(88); > > test_seal_addseal(); > test_seal_unmapped_start(); > @@ -1825,12 +1927,17 @@ int main(int argc, char **argv) > test_seal_mprotect_split(false); > test_seal_mprotect_split(true); > > + test_seal_mprotect_partial_mprotect_tail(false); > + test_seal_mprotect_partial_mprotect_tail(true); > + > test_seal_munmap(false); > test_seal_munmap(true); > test_seal_munmap_two_vma(false); > test_seal_munmap_two_vma(true); > test_seal_munmap_vma_with_gap(false); > test_seal_munmap_vma_with_gap(true); > + test_seal_munmap_partial_across_vmas(false); > + test_seal_munmap_partial_across_vmas(true); > > test_munmap_start_freed(false); > test_munmap_start_freed(true); > @@ -1862,6 +1969,8 @@ int main(int argc, char **argv) > test_seal_madvise_nodiscard(true); > test_seal_discard_ro_anon(false); > test_seal_discard_ro_anon(true); > + test_seal_discard_across_vmas(false); > + test_seal_discard_across_vmas(true); > test_seal_discard_ro_anon_on_rw(false); > test_seal_discard_ro_anon_on_rw(true); > test_seal_discard_ro_anon_on_shared(false); > > -- > 2.46.0 > >