| Seq | Timestamp | Type | Name | Duration |
|---|---|---|---|---|
| 0/0 | 2026/09/03 13:07 | flow | patch-triage |
0mArgs:null Results: {
"EnableConfigs": null,
"FocusSymbols": [],
"KMSANReasoning": "",
"NeedsKMSAN": false,
"Reasoning": "The patch exclusively modifies user-space selftests in tools/testing/selftests/mm/ and does not affect the compiled kernel image or kernel modules.",
"WorthFuzzing": false
} |
| 1/1 | 2026/09/03 13:07 | action | read-patch-diff |
0mArgs:null Results: {
"PatchDiff": "commit 92d92523024acc881bba81c1fe71960a16aed24c\nAuthor: syz-cluster \u003ctriage@syzkaller.com\u003e\nDate: Thu Sep 3 13:07:35 2026 +0000\n\n syz-cluster: applied patch under review\n\ndiff --git a/tools/testing/selftests/mm/hugepage_settings.c b/tools/testing/selftests/mm/hugepage_settings.c\nindex d7917dce3abac..584054736ce99 100644\n--- a/tools/testing/selftests/mm/hugepage_settings.c\n+++ b/tools/testing/selftests/mm/hugepage_settings.c\n@@ -449,6 +449,15 @@ unsigned long hugetlb_free_pages(unsigned long size)\n \treturn read_num(path);\n }\n \n+unsigned long hugetlb_nr_resv_pages(unsigned long size)\n+{\n+\tchar path[PATH_MAX];\n+\n+\thugetlb_sysfs_path(path, sizeof(path), size, \"resv_hugepages\");\n+\n+\treturn read_num(path);\n+}\n+\n static bool __hugetlb_setup(unsigned long size, unsigned long nr)\n {\n \tunsigned long free = hugetlb_free_pages(size);\ndiff --git a/tools/testing/selftests/mm/hugepage_settings.h b/tools/testing/selftests/mm/hugepage_settings.h\nindex 726c73c43c05b..548e9d288d1d1 100644\n--- a/tools/testing/selftests/mm/hugepage_settings.h\n+++ b/tools/testing/selftests/mm/hugepage_settings.h\n@@ -98,6 +98,7 @@ unsigned long default_huge_page_size(void);\n unsigned long hugetlb_nr_pages(unsigned long size);\n void hugetlb_set_nr_pages(unsigned long size, unsigned long nr);\n unsigned long hugetlb_free_pages(unsigned long size);\n+unsigned long hugetlb_nr_resv_pages(unsigned long size);\n \n static inline void hugetlb_save_settings(void)\n {\ndiff --git a/tools/testing/selftests/mm/hugetlb_madv_vs_map.c b/tools/testing/selftests/mm/hugetlb_madv_vs_map.c\nindex f94549efcc6ff..c944d99d55233 100644\n--- a/tools/testing/selftests/mm/hugetlb_madv_vs_map.c\n+++ b/tools/testing/selftests/mm/hugetlb_madv_vs_map.c\n@@ -3,25 +3,16 @@\n * A test case that must run on a system with one and only one huge page available.\n *\t# echo 1 \u003e /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages\n *\n- * During setup, the test allocates the only available page, and starts three threads:\n- * - thread1:\n- *\t* madvise(MADV_DONTNEED) on the allocated huge page\n- * - thread 2:\n- *\t* Write to the allocated huge page\n- * - thread 3:\n- *\t* Try to allocated an extra huge page (which must not available)\n- *\n- * The test fails if thread3 is able to allocate a page.\n- *\n- * Touching the first page after thread3's allocation will raise a SIGBUS\n- *\n * Author: Breno Leitao \u003cleitao@debian.org\u003e\n */\n+#include \u003climits.h\u003e\n #include \u003cpthread.h\u003e\n+#include \u003csignal.h\u003e\n #include \u003cstdio.h\u003e\n #include \u003cstdlib.h\u003e\n #include \u003csys/mman.h\u003e\n #include \u003csys/types.h\u003e\n+#include \u003csys/wait.h\u003e\n #include \u003cunistd.h\u003e\n \n #include \"vm_util.h\"\n@@ -74,7 +65,22 @@ void *map_extra(void *unused)\n \treturn NULL;\n }\n \n-int main(void)\n+/* During setup in main, the only available page was allocated. This test then\n+ * starts three threads:\n+ *\n+ * - thread1:\n+ *\t* madvise(MADV_DONTNEED) on the allocated huge page\n+ * - thread 2:\n+ *\t* Write to the allocated huge page\n+ * - thread 3:\n+ *\t* Try to allocated an extra huge page (which must not available)\n+ *\n+ * The test fails if thread3 is able to allocate a page.\n+ *\n+ * Touching the first page after thread3's allocation will raise a SIGBUS\n+ */\n+\n+void test_madv_vs_map(void)\n {\n \tpthread_t thread1, thread2, thread3;\n \tvoid *ret;\n@@ -85,13 +91,6 @@ int main(void)\n \t */\n \tint max = 10;\n \n-\tksft_print_header();\n-\tksft_set_plan(1);\n-\n-\tif (!hugetlb_setup_default_exact(1))\n-\t\tksft_exit_skip(\"This test needs one and only one page to execute. Got %lu\\n\",\n-\t\t\t hugetlb_free_default_pages());\n-\n \tmmap_size = default_huge_page_size();\n \n \twhile (max--) {\n@@ -100,7 +99,7 @@ int main(void)\n \t\t\t\t-1, 0);\n \n \t\tif ((unsigned long)huge_ptr == -1)\n-\t\t\tksft_exit_fail_msg(\"Failed to allocate huge page\\n\");\n+\t\t\tksft_exit_fail_perror(\"Failed to allocate huge page\\n\");\n \n \t\tpthread_create(\u0026thread1, NULL, madv, NULL);\n \t\tpthread_create(\u0026thread2, NULL, touch, NULL);\n@@ -120,5 +119,113 @@ int main(void)\n \t}\n \n \tksft_test_result_pass(\"No unexpected huge page allocations\\n\");\n+}\n+\n+/* We create a child process, then unmap the page in the parent while the child\n+ * waits and verify that there is no underflow of the reserved count.\n+ */\n+\n+void test_underflow(void)\n+{\n+\tpid_t pid;\n+\tint pipe_fds[2];\n+\tunsigned long nr_reserved = 0;\n+\n+\thuge_ptr = mmap(NULL, mmap_size, PROT_READ | PROT_WRITE,\n+\t\t\tMAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, -1, 0);\n+\n+\tif ((unsigned long)huge_ptr == -1)\n+\t\tksft_exit_fail_perror(\"Failed to allocate huge page\\n\");\n+\n+\tnr_reserved = hugetlb_nr_resv_pages(default_huge_page_size());\n+\tif (nr_reserved != 1)\n+\t\tksft_exit_fail_msg(\"Unexpected number of reserved pages: %lu, expected 1\\n\",\n+\t\t\t\t nr_reserved);\n+\n+\t/* Force the fault to ensure the reservation is consumed */\n+\t*huge_ptr = 0;\n+\tnr_reserved = hugetlb_nr_resv_pages(default_huge_page_size());\n+\tif (nr_reserved != 0)\n+\t\tksft_exit_fail_msg(\"Unexpected number of reserved pages: %lu, expected 0\\n\",\n+\t\t\t\t nr_reserved);\n+\n+\tif (pipe(pipe_fds) != 0)\n+\t\tksft_exit_fail_perror(\"pipe failed\");\n+\n+\tpid = fork();\n+\tif (pid \u003c 0)\n+\t\tksft_exit_fail_perror(\"fork failed\");\n+\n+\tif (pid == 0) {\n+\t\t/* Child: Simply wait for the parent */\n+\t\tchar b;\n+\n+\t\tclose(pipe_fds[1]);\n+\t\tif (read(pipe_fds[0], \u0026b, 1) \u003c 0)\n+\t\t\tksft_perror(\"child read failed\");\n+\t\t/* Let the parent do the cleanup */\n+\t\t_exit(0);\n+\t}\n+\n+\t/* Parent */\n+\tclose(pipe_fds[0]);\n+\n+\t/* First unmap, this will close the vma */\n+\tif (munmap(huge_ptr, mmap_size) != 0) {\n+\t\tksft_perror(\"munmap failed\");\n+\t\tgoto err_cleanup;\n+\t}\n+\n+\tnr_reserved = hugetlb_nr_resv_pages(default_huge_page_size());\n+\tif (nr_reserved == ULONG_MAX) {\n+\t\tksft_test_result_fail(\"After the munmap, HugePages_Rsvd underflowed!\\n\");\n+\t\tgoto err_cleanup;\n+\t}\n+\tif (nr_reserved == 0) {\n+\t\tksft_test_result_pass(\"Underflow not present!\\n\");\n+\t} else {\n+\t\tksft_test_result_fail(\"Unexpected HugePages_Rsvd=%ld after munmap, should be 0 or -1. Repeat the test\\n\",\n+\t\t\t\t nr_reserved);\n+\t\tgoto err_cleanup;\n+\t}\n+\t/* Make the child exit, this should restore HugePages_Rsvd to 0 */\n+\tif (write(pipe_fds[1], \u0026nr_reserved, 1) \u003c 0) {\n+\t\t/* If write failed, the child is likely already gone */\n+\t\tksft_exit_fail_perror(\"write failed\");\n+\t}\n+\tclose(pipe_fds[1]);\n+\tif (waitpid(pid, NULL, 0) \u003c= 0) {\n+\t\tksft_exit_fail_msg(\"waitpid failed\");\n+\t}\n+\n+\tnr_reserved = hugetlb_nr_resv_pages(default_huge_page_size());\n+\tif (nr_reserved == 0) {\n+\t\tksft_test_result_pass(\"After the child dies, HugePages_Rsvd is properly set to 0\\n\");\n+\t} else {\n+\t\tksft_exit_fail_msg(\"Unexpected HugePages_Rsvd=%ld after the child termination munmap, should be 0 or -1. Repeat the test\\n\",\n+\t\t\t\t nr_reserved);\n+\t}\n+\treturn;\n+err_cleanup:\n+\tif (write(pipe_fds[1], \u0026nr_reserved, 1) \u003c 0) {\n+\t\tksft_exit_fail_perror(\"write failed\");\n+\t}\n+\tif (waitpid(pid, NULL, 0) \u003c= 0) {\n+\t\tksft_exit_fail_perror(\"waitpid failed\");\n+\t}\n+}\n+\n+int main(void)\n+{\n+\tksft_print_header();\n+\tksft_set_plan(3);\n+\n+\tif (!hugetlb_setup_default_exact(1))\n+\t\tksft_exit_skip(\"This test needs one and only one page to execute. Got %lu\\n\",\n+\t\t\t hugetlb_free_default_pages());\n+\n+\ttest_madv_vs_map();\n+\ttest_underflow();\n+\n \tksft_finished();\n }\n"
} |
| 2/1 | 2026/09/03 13:07 | agent | patch-evaluator |
0mModel:core Args: null Results: {
"EnableConfigs": null,
"FocusSymbols": [],
"Reasoning": "The patch exclusively modifies user-space selftests in tools/testing/selftests/mm/ and does not affect the compiled kernel image or kernel modules.",
"WorthFuzzing": false
}Instruction: You are an expert Linux kernel maintainer and security engineer.
Your job is to review a provided patch series and evaluate whether it warrants fuzzing with syzkaller.
IMPORTANT: The changes have ALREADY been applied and committed as the HEAD commit in
your workspace. Do NOT rely on internal assumptions. You must actively use your code access
tools to inspect the actual source code, callers, and surrounding context.
================================================================================
1. CORE TRIAGE PHILOSOPHY
================================================================================
The goal of patch fuzzing is to discover crashes, regressions, exposed latent bugs,
and newly triggered assertions introduced by the patch series.
- REACHABILITY IS THE PRIMARY GATE:
Fuzzing can only discover bugs in code that can actually execute in standard virtualized
environments (GCE or QEMU, utilizing software-emulated devices like USB gadgets, netdev, tun/tap).
If the modified code is structurally unreachable (see Section 2), it MUST NOT be fuzzed,
regardless of whether it adds assertions or complex logic.
- DO NOT BLINDLY TRUST "NO FUNCTIONAL CHANGE" (NFCI) OR "REFACTORING" CLAIMS:
Patch authors routinely label changes as "cleanups", "refactorings", or state
"No functional change intended". Do NOT take these claims at face value.
Code refactorings that rearrange logic, introduce helper functions, or alter state management
in core subsystems frequently introduce subtle semantic shifts or uncover latent kernel bugs.
If reachable executable code is modified or refactored, it MUST be fuzzed.
- NEW OR MODIFIED ASSERTIONS IN REACHABLE CODE MUST BE FUZZED:
When a patch introduces or modifies runtime checks or assertions (e.g., WARN_ON*, VM_WARN_ON*,
BUG_ON*, lockdep_assert*) in reachable code paths, it enforces new or stricter invariants.
Even if the author believes the invariant always holds, fuzzing is essential to verify whether
an unusual sequence of operations can violate it.
================================================================================
2. WHEN TO RETURN WorthFuzzing=false (NEGATIVE CRITERIA)
================================================================================
Return WorthFuzzing=false ONLY IF all modified code falls strictly into one or more of these categories:
- Non-kernel and non-executable changes:
* Modifications to Documentation/, comments, or spelling fixes.
* User-space directories, self-tests, samples, or scripts (e.g., tools/, samples/, scripts/, usr/)
that do not affect the compiled kernel image (vmlinux) or kernel modules.
* Purely decorative logging (e.g., message strings in pr_err, printk, dev_info) or tracepoints
that do not alter control flow or data structures.
* Build system or Kconfig changes that do not alter compiled C logic.
- Structurally unreachable hardware:
* Vendor-specific PCIe switches, SmartNICs, or GPU drivers (e.g., mlxsw, pds_core, qed,
ionic, amdgpu) requiring physical ASIC/PCIe cards not emulated in standard QEMU.
- Unreachable execution paths:
* Driver teardown callbacks (.remove, .shutdown, pci_unregister_driver) executed only during
physical PCI hot-unplug or manual sysfs driver unbinding.
* Code paths exclusive to architectures other than the target architecture.
================================================================================
3. WHEN TO RETURN WorthFuzzing=true (POSITIVE CRITERIA)
================================================================================
Return WorthFuzzing=true whenever the patch touches reachable executable code, including:
- Core Subsystems:
* Any logic modifications in memory management (mm/), synchronization/locking (kernel/locking/),
BPF, scheduler, core networking, VFS, or syscall handling.
- Refactorings and Code Cleanups:
* Any restructuring of reachable data structures, helper abstractions, or algorithm flows.
- Runtime Assertions and Defensive Checks:
* Any introduction or alteration of assertions (WARN_ON*, VM_WARN_ON*, BUG_ON*, etc.) in reachable paths.
- Reachable Drivers and Protocols:
* Drivers accessible via virtual buses (virtio, USB gadget, loopback, netlink, binder, sockets, etc.).
================================================================================
4. EXTRACTING FocusSymbols (PREVENTING DILUTION)
================================================================================
When WorthFuzzing=true, you must extract specific kernel functions into FocusSymbols to guide the fuzzer:
- AVOID UBIQUITOUS LIFECYCLE HOT-PATHS:
Do NOT list generic, ubiquitous functions called by almost every program in the corpus
(including, but not limited to: general memory allocators and deallocators, page fault
and trap handlers, or core synchronization primitives; this is not an exhaustive list).
Listing ubiquitous functions causes the fuzzer to classify thousands of unrelated tests as "focused",
which severely dilutes fuzzing effort away from the actual changes.
- TARGET SPECIFIC FEATURE LOGIC AND ENTRYPOINTS:
List functions that specifically implement the logic being added or altered, or direct API entrypoints
for the subsystem feature under review.
- HANDLING STATIC INLINE FUNCTIONS IN HEADERS (.h):
Compiler-inlined static functions (such as static inlines in mm/*.h or include/linux/*.h) lack
distinct symbol addresses in vmlinux and cannot be targeted directly by symbol coverage filters.
If the changes are primarily in static inline helpers, identify non-static, feature-specific caller
functions in .c files that exercise them (avoiding ubiquitous lifecycle wrappers).
================================================================================
5. IDENTIFYING EnableConfigs
================================================================================
Identify any specific CONFIG_ options required to properly compile and reach the modified code:
- Inspect Kconfig files and #ifdef guards; do not make assumptions.
- Check "depends on" lines in Kconfig to include any non-standard parent subsystem configs needed.
- Strip any 'CONFIG_' prefix (e.g., return "NET_IPV4" instead of "CONFIG_NET_IPV4").
Prefer calling several tools at the same time to save round-trips.
Use set-results tool to provide results of the analysis.
It must be called exactly once before the final reply.
Ignore results of this tool.
Prompt: Target architecture: amd64
For your convenience, here is the diff of the changes:
commit 92d92523024acc881bba81c1fe71960a16aed24c
Author: syz-cluster <triage@syzkaller.com>
Date: Thu Sep 3 13:07:35 2026 +0000
syz-cluster: applied patch under review
diff --git a/tools/testing/selftests/mm/hugepage_settings.c b/tools/testing/selftests/mm/hugepage_settings.c
index d7917dce3abac..584054736ce99 100644
--- a/tools/testing/selftests/mm/hugepage_settings.c
+++ b/tools/testing/selftests/mm/hugepage_settings.c
@@ -449,6 +449,15 @@ unsigned long hugetlb_free_pages(unsigned long size)
return read_num(path);
}
+unsigned long hugetlb_nr_resv_pages(unsigned long size)
+{
+ char path[PATH_MAX];
+
+ hugetlb_sysfs_path(path, sizeof(path), size, "resv_hugepages");
+
+ return read_num(path);
+}
+
static bool __hugetlb_setup(unsigned long size, unsigned long nr)
{
unsigned long free = hugetlb_free_pages(size);
diff --git a/tools/testing/selftests/mm/hugepage_settings.h b/tools/testing/selftests/mm/hugepage_settings.h
index 726c73c43c05b..548e9d288d1d1 100644
--- a/tools/testing/selftests/mm/hugepage_settings.h
+++ b/tools/testing/selftests/mm/hugepage_settings.h
@@ -98,6 +98,7 @@ unsigned long default_huge_page_size(void);
unsigned long hugetlb_nr_pages(unsigned long size);
void hugetlb_set_nr_pages(unsigned long size, unsigned long nr);
unsigned long hugetlb_free_pages(unsigned long size);
+unsigned long hugetlb_nr_resv_pages(unsigned long size);
static inline void hugetlb_save_settings(void)
{
diff --git a/tools/testing/selftests/mm/hugetlb_madv_vs_map.c b/tools/testing/selftests/mm/hugetlb_madv_vs_map.c
index f94549efcc6ff..c944d99d55233 100644
--- a/tools/testing/selftests/mm/hugetlb_madv_vs_map.c
+++ b/tools/testing/selftests/mm/hugetlb_madv_vs_map.c
@@ -3,25 +3,16 @@
* A test case that must run on a system with one and only one huge page available.
* # echo 1 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
*
- * During setup, the test allocates the only available page, and starts three threads:
- * - thread1:
- * * madvise(MADV_DONTNEED) on the allocated huge page
- * - thread 2:
- * * Write to the allocated huge page
- * - thread 3:
- * * Try to allocated an extra huge page (which must not available)
- *
- * The test fails if thread3 is able to allocate a page.
- *
- * Touching the first page after thread3's allocation will raise a SIGBUS
- *
* Author: Breno Leitao <leitao@debian.org>
*/
+#include <limits.h>
#include <pthread.h>
+#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/types.h>
+#include <sys/wait.h>
#include <unistd.h>
#include "vm_util.h"
@@ -74,7 +65,22 @@ void *map_extra(void *unused)
return NULL;
}
-int main(void)
+/* During setup in main, the only available page was allocated. This test then
+ * starts three threads:
+ *
+ * - thread1:
+ * * madvise(MADV_DONTNEED) on the allocated huge page
+ * - thread 2:
+ * * Write to the allocated huge page
+ * - thread 3:
+ * * Try to allocated an extra huge page (which must not available)
+ *
+ * The test fails if thread3 is able to allocate a page.
+ *
+ * Touching the first page after thread3's allocation will raise a SIGBUS
+ */
+
+void test_madv_vs_map(void)
{
pthread_t thread1, thread2, thread3;
void *ret;
@@ -85,13 +91,6 @@ int main(void)
*/
int max = 10;
- ksft_print_header();
- ksft_set_plan(1);
-
- if (!hugetlb_setup_default_exact(1))
- ksft_exit_skip("This test needs one and only one page to execute. Got %lu\n",
- hugetlb_free_default_pages());
-
mmap_size = default_huge_page_size();
while (max--) {
@@ -100,7 +99,7 @@ int main(void)
-1, 0);
if ((unsigned long)huge_ptr == -1)
- ksft_exit_fail_msg("Failed to allocate huge page\n");
+ ksft_exit_fail_perror("Failed to allocate huge page\n");
pthread_create(&thread1, NULL, madv, NULL);
pthread_create(&thread2, NULL, touch, NULL);
@@ -120,5 +119,113 @@ int main(void)
}
ksft_test_result_pass("No unexpected huge page allocations\n");
+}
+
+/* We create a child process, then unmap the page in the parent while the child
+ * waits and verify that there is no underflow of the reserved count.
+ */
+
+void test_underflow(void)
+{
+ pid_t pid;
+ int pipe_fds[2];
+ unsigned long nr_reserved = 0;
+
+ huge_ptr = mmap(NULL, mmap_size, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, -1, 0);
+
+ if ((unsigned long)huge_ptr == -1)
+ ksft_exit_fail_perror("Failed to allocate huge page\n");
+
+ nr_reserved = hugetlb_nr_resv_pages(default_huge_page_size());
+ if (nr_reserved != 1)
+ ksft_exit_fail_msg("Unexpected number of reserved pages: %lu, expected 1\n",
+ nr_reserved);
+
+ /* Force the fault to ensure the reservation is consumed */
+ *huge_ptr = 0;
+ nr_reserved = hugetlb_nr_resv_pages(default_huge_page_size());
+ if (nr_reserved != 0)
+ ksft_exit_fail_msg("Unexpected number of reserved pages: %lu, expected 0\n",
+ nr_reserved);
+
+ if (pipe(pipe_fds) != 0)
+ ksft_exit_fail_perror("pipe failed");
+
+ pid = fork();
+ if (pid < 0)
+ ksft_exit_fail_perror("fork failed");
+
+ if (pid == 0) {
+ /* Child: Simply wait for the parent */
+ char b;
+
+ close(pipe_fds[1]);
+ if (read(pipe_fds[0], &b, 1) < 0)
+ ksft_perror("child read failed");
+ /* Let the parent do the cleanup */
+ _exit(0);
+ }
+
+ /* Parent */
+ close(pipe_fds[0]);
+
+ /* First unmap, this will close the vma */
+ if (munmap(huge_ptr, mmap_size) != 0) {
+ ksft_perror("munmap failed");
+ goto err_cleanup;
+ }
+
+ nr_reserved = hugetlb_nr_resv_pages(default_huge_page_size());
+ if (nr_reserved == ULONG_MAX) {
+ ksft_test_result_fail("After the munmap, HugePages_Rsvd underflowed!\n");
+ goto err_cleanup;
+ }
+ if (nr_reserved == 0) {
+ ksft_test_result_pass("Underflow not present!\n");
+ } else {
+ ksft_test_result_fail("Unexpected HugePages_Rsvd=%ld after munmap, should be 0 or -1. Repeat the test\n",
+ nr_reserved);
+ goto err_cleanup;
+ }
+ /* Make the child exit, this should restore HugePages_Rsvd to 0 */
+ if (write(pipe_fds[1], &nr_reserved, 1) < 0) {
+ /* If write failed, the child is likely already gone */
+ ksft_exit_fail_perror("write failed");
+ }
+ close(pipe_fds[1]);
+ if (waitpid(pid, NULL, 0) <= 0) {
+ ksft_exit_fail_msg("waitpid failed");
+ }
+
+ nr_reserved = hugetlb_nr_resv_pages(default_huge_page_size());
+ if (nr_reserved == 0) {
+ ksft_test_result_pass("After the child dies, HugePages_Rsvd is properly set to 0\n");
+ } else {
+ ksft_exit_fail_msg("Unexpected HugePages_Rsvd=%ld after the child termination munmap, should be 0 or -1. Repeat the test\n",
+ nr_reserved);
+ }
+ return;
+err_cleanup:
+ if (write(pipe_fds[1], &nr_reserved, 1) < 0) {
+ ksft_exit_fail_perror("write failed");
+ }
+ if (waitpid(pid, NULL, 0) <= 0) {
+ ksft_exit_fail_perror("waitpid failed");
+ }
+}
+
+int main(void)
+{
+ ksft_print_header();
+ ksft_set_plan(3);
+
+ if (!hugetlb_setup_default_exact(1))
+ ksft_exit_skip("This test needs one and only one page to execute. Got %lu\n",
+ hugetlb_free_default_pages());
+
+ test_madv_vs_map();
+ test_underflow();
+
ksft_finished();
}
|
| 3/2 | 2026/09/03 13:07 | llm | patch-evaluator |
0mModel:gemini-3.7-flash Args: null Results: null Tokens: input: 5438 output: 64 thoughts: 384 Thoughts: **Analyzing the Patch for Fuzzing Worthiness** Okay, let's break this down. First, I need to understand what this patch is actually touching. Looking at the diff, it's pretty clear: this is all confined to `tools/testing/selftests/mm/`. Specifically, `hugepage_settings.c`, `hugepage_settings.h`, and `hugetlb_madv_vs_map.c`. Now, the crucial question: does this warrant fuzzing? Time to consult the `WorthFuzzing` guidelines. Section 2 spells it out: *when* to say "no." It's pretty straightforward, thankfully. "Return WorthFuzzing=false ONLY IF..." and then the negative criteria. Aha, this falls squarely into the "User-space directories, self-tests... that do not affect the compiled kernel image..." category. `tools/testing/selftests/mm/` is *exactly* that. These are user-space tests, not kernel components. Just to be absolutely sure, let's double-check: are *any* kernel files being modified? Nope, just those selftest files. No kernel code here. Therefore, the verdict is clear: `WorthFuzzing` must be `false`. Now, I need to formulate the `set-results` call. It's a simple one this time: * `WorthFuzzing`: `false` * `FocusSymbols`: `[]` (empty list, as expected) * `EnableConfigs`: `[]` (also empty) * `Reasoning`: "The patch modifies only user-space selftests under tools/testing/selftests/mm/ and does not affect the compiled kernel image (vmlinux) or kernel modules." And that's that. Time to invoke `set-results`. |
| 4/2 | 2026/09/03 13:07 | tool | set-results |
0mArgs:{
"EnableConfigs": [],
"FocusSymbols": [],
"Reasoning": "The patch exclusively modifies user-space selftests in tools/testing/selftests/mm/ and does not affect the compiled kernel image or kernel modules.",
"WorthFuzzing": false
}Results: {
"EnableConfigs": null,
"FocusSymbols": [],
"Reasoning": "The patch exclusively modifies user-space selftests in tools/testing/selftests/mm/ and does not affect the compiled kernel image or kernel modules.",
"WorthFuzzing": false
} |
| 5/1 | 2026/09/03 13:07 | action | If |
0mArgs:{
"WorthFuzzing": false
}Results: null |
| Total Calls | Total Tokens | Avg Tokens | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|
| Total Calls | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|