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 F40B4C83030 for ; Tue, 1 Jul 2025 03:06:21 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 1B11E6B00A3; Mon, 30 Jun 2025 23:06:21 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 161B46B00A4; Mon, 30 Jun 2025 23:06:21 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 09F486B00A6; Mon, 30 Jun 2025 23:06:21 -0400 (EDT) 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 EDF7E6B00A3 for ; Mon, 30 Jun 2025 23:06:20 -0400 (EDT) Received: from smtpin06.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id 48473140260 for ; Tue, 1 Jul 2025 03:06:20 +0000 (UTC) X-FDA: 83614207320.06.BE223C9 Received: from nyc.source.kernel.org (nyc.source.kernel.org [147.75.193.91]) by imf30.hostedemail.com (Postfix) with ESMTP id 97F7D80004 for ; Tue, 1 Jul 2025 03:06:18 +0000 (UTC) Authentication-Results: imf30.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=gIklRhib; spf=pass (imf30.hostedemail.com: domain of sj@kernel.org designates 147.75.193.91 as permitted sender) smtp.mailfrom=sj@kernel.org; dmarc=pass (policy=quarantine) header.from=kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1751339178; 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:in-reply-to:references:references:dkim-signature; bh=Szltd3VLiA4hMH1L+xsO79qS6StrgS6eMU4JU6twnKQ=; b=rwnTMBDvUtTjmLgud7WJM3bQ25Dx9H8Wye7phVlLZDwT6oN85X01QDwMKAiuAhDmJZrlTC 2zga9y6LpIi/ZiUjOPXjLKThgCxGYdjF1tWWRxgmqP4PzoI93fT+k2XMm8n0YxStDoyirf dWIEEFTzmz3TPgQCf6APyPEMimAK+28= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1751339178; a=rsa-sha256; cv=none; b=8WeGf1PHYlNNdqnXViaOwPpT6fp3BZKezueolJcI9KNkUMC67w5eD9t10Aq/0I62UueyXo McUSVvHsciWGfUzRhlEySJWXpGGmrTdyFrFbsjqAfvvB1BJHFXQIDMtUbRdLl9/25CH4Rm WwxdGvUUGJ3pB7W9ZFpWQLxad95KBQc= ARC-Authentication-Results: i=1; imf30.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=gIklRhib; spf=pass (imf30.hostedemail.com: domain of sj@kernel.org designates 147.75.193.91 as permitted sender) smtp.mailfrom=sj@kernel.org; dmarc=pass (policy=quarantine) header.from=kernel.org Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by nyc.source.kernel.org (Postfix) with ESMTP id E56F5A4FB2E; Tue, 1 Jul 2025 03:06:17 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5FD14C4CEE3; Tue, 1 Jul 2025 03:06:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1751339177; bh=+HBR+jnxA9nNgWFa1PCjs1qWdyrmekDk5QwQfoG6iRw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=gIklRhibGuYRMyTLTG5El9hliLy0gZEP35O+8eoTuZfh3YCIBgrnTew7/nFfTWUnZ 0+dRMXaRoCIag1rmOayV3cSis7FsiY4AALejdPVmPyyaUXKkL8mOwFBaw4CQtcv5fL PQPn4VlaYded0K4EQtvV786jidzeIJ6PkeWhz72ZvMxCmYSostINyEdDJWNgMNEOEs 8L0DnVIWjaASZVPZ7MLP/ylKA4Gqaa14IlT8PMbiAE+YYHzdkP1B5foEbaf7tW50lm SuoCikEl/hBVX3jJ+Rw5XL/F0x6CwU8rWc/uQAq3PDjl4CmO4pgPbuql+JrSeQDMu0 3JiXlZThttgEw== From: SeongJae Park To: wang lian Cc: SeongJae Park , david@redhat.com, linux-mm@kvack.org, akpm@linux-foundation.org, lorenzo.stoakes@oracle.com, Liam.Howlett@oracle.com, brauner@kernel.org, gkwang@linx-info.com, jannh@google.com, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, p1ucky0923@gmail.com, ryncsn@gmail.com, shuah@kernel.org, vbabka@suse.cz, zijing.zhang@proton.me Subject: Re: [PATCH v2] selftests/mm: Add process_madvise() tests Date: Mon, 30 Jun 2025 20:06:14 -0700 Message-Id: <20250701030614.68902-1-sj@kernel.org> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250630140957.4000-1-lianux.mm@gmail.com> References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspam-User: X-Rspamd-Server: rspam12 X-Rspamd-Queue-Id: 97F7D80004 X-Stat-Signature: mhm93ba6mwufqksuzym44npeb5zn9rq3 X-HE-Tag: 1751339178-922620 X-HE-Meta: U2FsdGVkX18azbgwkn9jKHaCf2ZmZFZ4dnIWc+b3w1YFTSPcDvjfitgaULU306HY8nFXKLd/bYj4pq4UKiPZ0IvwO20FzvW+R1NSU4BVbKdMjPgHN15ogt7plDEY5WCBV6FEgBDfHc6WHS1+HSjcQhN7sOP/bLgwnf2wQbmXkGKeQZp717Lys0MDteUTqpCERPuup3GBZwICjjy6m3udCCL4u9/4/G+3M5jYRTiDIXzt1UAUd1tKohaA8E0BjK3i0qybzQLGofNpUPTVyQXhTkpNy8QfBJsfAu2iPi6hZJH2fmH3+cA84KOQNZuKGlfLxnAuL4TqkWwwkThP0ue1Hjd3ireP4BUeRFUflh4isQfzrKOnu7euKDU6dHAdrHY9/RFlQdFOlJCKjD61Sktz8uMqbyYQ/4a25dl9DSkqDltbk2OKDgAXTyHnhMHH5e1OP80ucKnhk9P5417MHEKP5tdIS6GYA+G+Ju9UWlnaIiAg2iqtmnSaH+9DLIkgO7REubG7d+/9/D7QM6KCGRiZgcjmqeD/mQYxF+AdGQpb/me4SD/N2HFXe+SvD+vE3LfFElESErUZlbfdfKjwRvnJZk0BAE073T4bhseJGYkJ8rCpE+a9jucChX/CnsE7PLvfDVz98MHy7e5TJS855v+sriulmd8ioJDsjQUe3OtSYpCB0uL05blXY8LyzeEzdPpQdPYTjGebQ0wcrLTa2ymyd+/yJ6GwXJ1/CW32a1bQpryZtKt+fxDp6I3hjXdoYIERUueF6VRLd2Gt2Q4TniERAAq9Ml4H+U74FrJ5OBO3mCrpv8GuatCJQTurisnvBdIvbcEK9Lzx1TwGcC06hLUtb6IIJ5vQWZDHliTPDStDM1zD0ozM810Uo9osAdzyFbEi1/qb0n9iW0igqOHMZjZ1/krrHT/ZmVKcpgKRvzmlMmy0sj+F/vsMrfyha5Pq4JEM6RnaVomIvM/kBdhpEqB fQ5te6Cj hfo+PvBOSswSsPk/awkQhVThic91djVJ2sb6xI+bT3lUrZGr/64eSeWss3GojRUMs79WJox0pZakMNn+Y99cTdKXCewaMhtGFHXk4Eiv4/wXYrYhsyeXWpKDCdFGVCBo3gpXKVrgZJ81CS5Tfx2aPwJgLy3tl1YsVzXHjXS5MNJ9Nr/SH8eg8srKk3R55lkzrmqNxDe3DTxYQ8AtlRVOC+zHNM/7SOCIPT91KAxaLDKIHyMyxWiklpgZhNNvd0vL/5nbSJw+yClxCN/62pSI4rguVzzX5hbBKyLVQQfCPoEPliR3xyj3wTwCfi9vu/emr1QdWq0EM+SxNbidnDzb/PVqykZ1Sp5xVz3QqlbvT2t1v3ZinDPLBaf/gOeauVr6wRYZ/lYUsMVyBmYiSLg2h4YcTJdIjpktK64PA 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 Wang, On Mon, 30 Jun 2025 22:09:57 +0800 wang lian wrote: > This patch adds tests for the process_madvise(), focusing on > verifying behavior under various conditions including valid > usage and error cases. > > Signed-off-by: wang lian > Suggested-by: Lorenzo Stoakes > Suggested-by: David Hildenbrand I left a few trivial comments below, but overall this looks useful to me. Thank you :) Acked-by: SeongJae Park FYI, 'git am' of this patch on latest mm-new fails. Maybe this is not based on the latest mm-new? But, I also found Andrew added this to mm tree: https://lore.kernel.org/20250630230052.AB95CC4CEE3@smtp.kernel.org . Maybe Andrew did rebase on his own? [...] > --- /dev/null > +++ b/tools/testing/selftests/mm/process_madv.c [...] > +/* Try and read from a buffer, return true if no fatal signal. */ > +static bool try_read_buf(char *ptr) > +{ > + return try_access_buf(ptr, false); Seems this is the only caller of try_access_buf(). How about removing 'write' argument of try_access_buf() and its handling? > +} > + > +TEST_F(process_madvise, basic) > +{ > + const unsigned long pagesize = (unsigned long)sysconf(_SC_PAGESIZE); > + const int madvise_pages = 4; > + char *map; > + ssize_t ret; > + struct iovec vec[madvise_pages]; > + > + /* > + * Create a single large mapping. We will pick pages from this > + * mapping to advise on. This ensures we test non-contiguous iovecs. > + */ > + map = mmap(NULL, pagesize * 10, PROT_READ | PROT_WRITE, > + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); > + ASSERT_NE(map, MAP_FAILED); So this will make this test marked as failed, for mmap() failure, which doesn't really mean something in process_madvise() is wrong. What about using ksft_exit_skip() with failure check, instead? > + > + /* Fill the entire region with a known pattern. */ > + memset(map, 'A', pagesize * 10); > + > + /* > + * Setup the iovec to point to 4 non-contiguous pages > + * within the mapping. > + */ > + vec[0].iov_base = &map[0 * pagesize]; > + vec[0].iov_len = pagesize; > + vec[1].iov_base = &map[3 * pagesize]; > + vec[1].iov_len = pagesize; > + vec[2].iov_base = &map[5 * pagesize]; > + vec[2].iov_len = pagesize; > + vec[3].iov_base = &map[8 * pagesize]; > + vec[3].iov_len = pagesize; > + > + ret = sys_process_madvise(PIDFD_SELF, vec, madvise_pages, MADV_DONTNEED, > + 0); > + if (ret == -1 && errno == EPERM) > + ksft_exit_skip( > + "process_madvise() unsupported or permission denied, try running as root.\n"); > + else if (errno == EINVAL) > + ksft_exit_skip( > + "process_madvise() unsupported or parameter invalid, please check arguments.\n"); > + > + /* The call should succeed and report the total bytes processed. */ > + ASSERT_EQ(ret, madvise_pages * pagesize); > + > + /* Check that advised pages are now zero. */ > + for (int i = 0; i < madvise_pages; i++) { > + char *advised_page = (char *)vec[i].iov_base; > + > + /* Access should be successful (kernel provides a new page). */ > + ASSERT_TRUE(try_read_buf(advised_page)); > + /* Content must be 0, not 'A'. */ > + ASSERT_EQ(*advised_page, 0); > + } > + > + /* Check that an un-advised page in between is still 'A'. */ > + char *unadvised_page = &map[1 * pagesize]; > + > + ASSERT_TRUE(try_read_buf(unadvised_page)); > + ASSERT_EQ(*unadvised_page, 'A'); What about using memcpy() and memcmp() for testing full bytes? That could do more complete test, and reduce unnecessary volatile and helper functions? > + > + /* Cleanup. */ > + ASSERT_EQ(munmap(map, pagesize * 10), 0); Again, I think ksft_exit_skip() might be a better approach. > +} > + > +static long get_smaps_anon_huge_pages(pid_t pid, void *addr) > +{ > + char smaps_path[64]; > + char *line = NULL; > + unsigned long start, end; > + long anon_huge_kb; > + size_t len; > + FILE *f; > + bool in_vma; > + > + in_vma = false; > + sprintf(smaps_path, "/proc/%d/smaps", pid); I understand this is just a test code, but... What about using the safer one, snprintf()? > + f = fopen(smaps_path, "r"); > + if (!f) > + return -1; > + > + while (getline(&line, &len, f) != -1) { > + /* Check if the line describes a VMA range */ > + if (sscanf(line, "%lx-%lx", &start, &end) == 2) { > + if ((unsigned long)addr >= start && > + (unsigned long)addr < end) > + in_vma = true; > + else > + in_vma = false; > + continue; > + } > + > + /* If we are in the correct VMA, look for the AnonHugePages field */ > + if (in_vma && > + sscanf(line, "AnonHugePages: %ld kB", &anon_huge_kb) == 1) > + break; > + } > + > + free(line); > + fclose(f); > + > + return (anon_huge_kb > 0) ? (anon_huge_kb * 1024) : 0; > +} [...] > +TEST_HARNESS_MAIN > \ No newline at end of file checkpatch.pl complaints having no newline at the end of the file. > diff --git a/tools/testing/selftests/mm/run_vmtests.sh b/tools/testing/selftests/mm/run_vmtests.sh > index f96d43153fc0..5c28ebcf1ea9 100755 > --- a/tools/testing/selftests/mm/run_vmtests.sh > +++ b/tools/testing/selftests/mm/run_vmtests.sh > @@ -61,6 +61,8 @@ separated by spaces: > ksm tests that require >=2 NUMA nodes > - pkey > memory protection key tests > +- process_madvise Shouldn't this match with the real category name (process_madv) ? > + test process_madvise > - soft_dirty > test soft dirty page bit semantics > - pagemap > @@ -424,6 +426,9 @@ CATEGORY="hmm" run_test bash ./test_hmm.sh smoke > # MADV_GUARD_INSTALL and MADV_GUARD_REMOVE tests > CATEGORY="madv_guard" run_test ./guard-regions > > +# PROCESS_MADVISE TEST > +CATEGORY="process_madv" run_test ./process_madv > + > # MADV_DONTNEED and PROCESS_DONTNEED tests > CATEGORY="madv_dontneed" run_test ./madv_dontneed > > -- > 2.43.0 Thanks, SJ