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 12ACCC54E67 for ; Tue, 26 Mar 2024 15:00:34 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id A3BC36B009F; Tue, 26 Mar 2024 11:00:33 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 9EC926B00A1; Tue, 26 Mar 2024 11:00:33 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 8B3C56B00A2; Tue, 26 Mar 2024 11:00:33 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id 797366B009F for ; Tue, 26 Mar 2024 11:00:33 -0400 (EDT) Received: from smtpin17.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id 2B49E140C9A for ; Tue, 26 Mar 2024 15:00:33 +0000 (UTC) X-FDA: 81939501546.17.423301B Received: from sin.source.kernel.org (sin.source.kernel.org [145.40.73.55]) by imf23.hostedemail.com (Postfix) with ESMTP id EC5F214002C for ; Tue, 26 Mar 2024 15:00:28 +0000 (UTC) Authentication-Results: imf23.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b="CSwP/DAX"; spf=pass (imf23.hostedemail.com: domain of rppt@kernel.org designates 145.40.73.55 as permitted sender) smtp.mailfrom=rppt@kernel.org; dmarc=pass (policy=none) header.from=kernel.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1711465229; a=rsa-sha256; cv=none; b=wBbrN9eGf8gFzI0fkAVIuMDOqfn0J2vc/hACgcHT7uOEqx9H7yvseO+tRSkLel3jQF2iCb Shkv1XpBrQHwsJjI6zbzWYQxmMmpurgcjY6M8x6DdbO4uwWHXfALD0uusZj1tGwp20DKl/ Fhi9QMhad+83ZgXJRX8ZzbqdEjV3ePo= ARC-Authentication-Results: i=1; imf23.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b="CSwP/DAX"; spf=pass (imf23.hostedemail.com: domain of rppt@kernel.org designates 145.40.73.55 as permitted sender) smtp.mailfrom=rppt@kernel.org; dmarc=pass (policy=none) header.from=kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1711465229; 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=Bnf3/UiOR9u7yFbQz1hNGYp3OLeDJSbtMk287dO/xtY=; b=DZ66oGrKDhHMYnhsBwnHb3Gzbt5vPfWDfyrZtopf00f5ro69aQguBplgD0X9ApVnO4W/sz 1xGz4ndZquA6PlvxTunfg0GhNcK3Ym+iFoBoYJDN30akTnG6SblWPbTY/0L3eQ8a4f4xMe S/2Gck8pTjLAezX1hCUQjhQdEiDRh3Q= Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sin.source.kernel.org (Postfix) with ESMTP id 8CC62CE20F9; Tue, 26 Mar 2024 15:00:24 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 026E4C433F1; Tue, 26 Mar 2024 15:00:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1711465223; bh=NWbxOEw32c7m5KBW5C04/sGYmqDjmEadCfWD+rXLsWU=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=CSwP/DAXV65DXTPyu4DbSIjzfFmKFpOQ0ooVrMNJi02COJmchgWbkoRqO1hQJ803e QrnnsdUpuSkja32LkDerY8/sLzLZ493JVtC0tBeQu6zQAnVNlf8Hx9ykRk0yIR5qAJ WIdRAsB1/Qy663eah3ER78mIx5trYRcqPku/s3bMM6DnlDrP6FuTJzu2mrlUWByVrp fMGk/+EsXqyS/GoIVZzkrRk+9LI2bhhp5YF/vjwmIw2WRPgGGUMzIc1FDdxJ52NJbT C9NVQpnpQ8cdjnc0B6kh2mKR8pQUtUaagv2sfM+FZh0KH6LRGGGug36xtvMUWA8L+M KZeXT9xvKSBSw== Date: Tue, 26 Mar 2024 16:59:41 +0200 From: Mike Rapoport To: David Hildenbrand Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org, Andrew Morton , Miklos Szeredi , Lorenzo Stoakes , xingwei lee , yue sun Subject: Re: [PATCH v2 2/3] selftests/memfd_secret: add vmsplice() test Message-ID: References: <20240326143210.291116-1-david@redhat.com> <20240326143210.291116-3-david@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20240326143210.291116-3-david@redhat.com> X-Rspamd-Server: rspam08 X-Rspamd-Queue-Id: EC5F214002C X-Stat-Signature: rjgr1f639kyzh6zcezax3dy4jwp8q34g X-Rspam-User: X-HE-Tag: 1711465228-818614 X-HE-Meta: U2FsdGVkX1/Ht5xgXdEhKAPPqzV8lY5vs2k1o/EoQYszrxrm3Uk6Iv7EuYj847IAU8Hl/zSMHR3drEfMy79zyFV/tv52k++w4qk2/sZjzwwneyCpB4MTmoJdRKkIgPyQZZtE+3y3zYJPqdJM52nGTCiHMZ50NQrKbBFsJ3AXl5uUKXpb4WlqGhx+r2Zh9jILUvlAGdeuOId/ioSEgYNPCVvYhBY5D9V4/OtBrE6Rf5+ClMtvWIhXreBoxZaKamGSnUndLmc9qo946EH+iYxsqJPqOmtAYaAnn1avFsCoJMATEUDMik35EamrZqelB41oCo3pxoy14khS6GFdEHbwG1i+2pRKcchr+svKSqYh0AhnK+i3Hchokw6WU993m7asR9rF06frHPy3V1OV2x5qS3zsq09mSAf2G6VxLZ26W2wBbjTvXu9H9PEFUDFgOu7F/AgQVlRkBwZB70RU8WakFtFrwVuSehIuPKKN67mMMaZwbhg8l98t1PYpRlrAwWq8P+6GmWZ0YVsJpLDUOhzyACfetRjhYBwXZRs51PuQoQ29Q9fmguUg4DM1zrdd/GtkvDy2IeR6TLjUhSq9EzVJdg+yzGB6jJmRKiUx964ewnm6zqVif5YE1XPc1n6Qi98aUqGWOOwLkU24Qbo4HMu/fl+olHczQAs5s/MK6p0iN8E4rOdJwK6EVgv0zPVeCsUZmFKzODlDfp39nMqb8yi6ovL8ocqIPw8LnQeOsHjbwf8FYuRV14Qp9IV7vuepVVgtCjyV6TuhAzZM5qVkCb/4UaubHehd/rhSR6pSmcUZ38L+5fOsJokkS4JRiTa9lld3EiHm2mSZGQ8lWul/pvNDq+wF87/GR2xxPtDv5YlSuynROQC4m0QiJNdwJuh+52go4vqhpi0FNB+HdjftdLRDDBps0Nz8tqcizC9UKMy0hkIe00KP61SjgmQbLhmzBPm/kU0qitaxTsmQwbUc7XE 1TfacW9U /uusG9NMQzIFGbJkELqVls1oRdGavp6LXFBZuh/i9fyJu9H4f4QuMDDjkZogLFkJ1oymclBrNF9xR2J6tT5f+vvo+sLBipyr91moDiIxXpGZ9ccQCJ6g2zodBG5iSe8qGvMy2YVe+Qu2d32FVZEn4tdGg0wJHUM5THdZnKOhYAxFsw++eQY7CS8X6onDfoOvV8B79fFakBtYwpBAJpZ6vz9rIO3DkmNtFzrJunT8gVBUT+ehq0Hg/ohnTZD5PvMm7RfYtcUWYoOPHbydIYtoVDkVlRlVrwEpJWGefsnui5kgG9+16KO5QC9Dq7s0lyWIVpZjAfPoVVKBubeG8IUKbg1vwew== 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: On Tue, Mar 26, 2024 at 03:32:09PM +0100, David Hildenbrand wrote: > Let's add a simple reproducer for a scenario where GUP-fast could succeed > on secretmem folios, making vmsplice() succeed instead of failing. The > reproducer is based on a reproducer [1] by Miklos Szeredi. > > We want to perform two tests: vmsplice() when a fresh page was just > faulted in, and vmsplice() on an existing page after munmap() that > would drain certain LRU caches/batches in the kernel. > > In an ideal world, we could use fallocate(FALLOC_FL_PUNCH_HOLE) / > MADV_REMOVE to remove any existing page. As that is currently not > possible, run the test before any other tests that would allocate memory > in the secretmem fd. > > Perform the ftruncate() only once, and check the return value. > > [1] https://lkml.kernel.org/r/CAJfpegt3UCsMmxd0taOY11Uaw5U=eS1fE5dn0wZX3HF0oy8-oQ@mail.gmail.com > > Signed-off-by: David Hildenbrand Reviewed-by: Mike Rapoport (IBM) > --- > tools/testing/selftests/mm/memfd_secret.c | 51 ++++++++++++++++++++++- > 1 file changed, 49 insertions(+), 2 deletions(-) > > diff --git a/tools/testing/selftests/mm/memfd_secret.c b/tools/testing/selftests/mm/memfd_secret.c > index 9b298f6a04b3..9a0597310a76 100644 > --- a/tools/testing/selftests/mm/memfd_secret.c > +++ b/tools/testing/selftests/mm/memfd_secret.c > @@ -20,6 +20,7 @@ > #include > #include > #include > +#include > > #include "../kselftest.h" > > @@ -83,6 +84,45 @@ static void test_mlock_limit(int fd) > pass("mlock limit is respected\n"); > } > > +static void test_vmsplice(int fd, const char *desc) > +{ > + ssize_t transferred; > + struct iovec iov; > + int pipefd[2]; > + char *mem; > + > + if (pipe(pipefd)) { > + fail("pipe failed: %s\n", strerror(errno)); > + return; > + } > + > + mem = mmap(NULL, page_size, prot, mode, fd, 0); > + if (mem == MAP_FAILED) { > + fail("Unable to mmap secret memory\n"); > + goto close_pipe; > + } > + > + /* > + * vmsplice() may use GUP-fast, which must also fail. Prefault the > + * page table, so GUP-fast could find it. > + */ > + memset(mem, PATTERN, page_size); > + > + iov.iov_base = mem; > + iov.iov_len = page_size; > + transferred = vmsplice(pipefd[1], &iov, 1, 0); > + > + if (transferred < 0 && errno == EFAULT) > + pass("vmsplice is blocked as expected with %s\n", desc); > + else > + fail("vmsplice: unexpected memory access with %s\n", desc); > + > + munmap(mem, page_size); > +close_pipe: > + close(pipefd[0]); > + close(pipefd[1]); > +} > + > static void try_process_vm_read(int fd, int pipefd[2]) > { > struct iovec liov, riov; > @@ -187,7 +227,6 @@ static void test_remote_access(int fd, const char *name, > return; > } > > - ftruncate(fd, page_size); > memset(mem, PATTERN, page_size); > > if (write(pipefd[1], &mem, sizeof(mem)) < 0) { > @@ -258,7 +297,7 @@ static void prepare(void) > strerror(errno)); > } > > -#define NUM_TESTS 4 > +#define NUM_TESTS 6 > > int main(int argc, char *argv[]) > { > @@ -277,9 +316,17 @@ int main(int argc, char *argv[]) > ksft_exit_fail_msg("memfd_secret failed: %s\n", > strerror(errno)); > } > + if (ftruncate(fd, page_size)) > + ksft_exit_fail_msg("ftruncate failed: %s\n", strerror(errno)); > > test_mlock_limit(fd); > test_file_apis(fd); > + /* > + * We have to run the first vmsplice test before any secretmem page was > + * allocated for this fd. > + */ > + test_vmsplice(fd, "fresh page"); > + test_vmsplice(fd, "existing page"); > test_process_vm_read(fd); > test_ptrace(fd); > > -- > 2.43.2 > -- Sincerely yours, Mike.