| Seq | Timestamp | Type | Name | Duration |
|---|---|---|---|---|
| 0/0 | 2026/10/27 09:53 | flow | patch-triage |
0mArgs:null Results: {
"EnableConfigs": null,
"FocusSymbols": [],
"KMSANReasoning": "",
"NeedsKMSAN": false,
"Reasoning": "The patch only adds a boot command-line parameter ('kcore=') to enable or disable /proc/kcore at boot time. The modified code consists entirely of documentation and __init / __initdata boot-time code (parse_kcore and an early check in proc_kcore_init), which executes once during boot and is discarded from memory before userspace starts. None of the modified code is reachable or fuzzable at runtime by syzkaller.",
"WorthFuzzing": false
} |
| 1/1 | 2026/10/27 09:53 | action | read-patch-diff |
0mArgs:null Results: {
"PatchDiff": "commit 704189f1dce644b0e51332a112095a5a6a49280c\nAuthor: syz-cluster \u003ctriage@syzkaller.com\u003e\nDate: Tue Oct 27 09:53:44 2026 +0000\n\n syz-cluster: applied patch under review\n\ndiff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt\nindex e75344f4e0cdef..d8acce2878ab92 100644\n--- a/Documentation/admin-guide/kernel-parameters.txt\n+++ b/Documentation/admin-guide/kernel-parameters.txt\n@@ -2915,6 +2915,12 @@ Kernel parameters\n \t\t\tparameter KASAN will print report only for the first\n \t\t\tinvalid access.\n \n+\tkcore=\t\t[KNL,EARLY]\n+\t\t\tEnable or disable /proc/kcore on kernels built with\n+\t\t\tCONFIG_PROC_KCORE=y.\n+\t\t\tFormat: \u003cbool\u003e\n+\t\t\tDefault: on\n+\n \tkeep_bootcon\t[KNL,EARLY]\n \t\t\tDo not unregister boot console at start. This is only\n \t\t\tuseful for debugging when something happens in the window\ndiff --git a/fs/proc/kcore.c b/fs/proc/kcore.c\nindex 390547b992acd9..6a29a3e0ed92e8 100644\n--- a/fs/proc/kcore.c\n+++ b/fs/proc/kcore.c\n@@ -69,6 +69,7 @@ static size_t kcore_notes_len;\n static size_t kcore_data_offset;\n DEFINE_STATIC_PERCPU_RWSEM(kclist_lock);\n static int kcore_need_update = 1;\n+static bool kcore_enabled __initdata = true;\n \n /*\n * Returns \u003e 0 for RAM pages, 0 for non-RAM pages, \u003c 0 on error\n@@ -720,8 +721,19 @@ static void __init add_modules_range(void)\n }\n #endif\n \n+static int __init parse_kcore(char *str)\n+{\n+\treturn kstrtobool(str, \u0026kcore_enabled);\n+}\n+early_param(\"kcore\", parse_kcore);\n+\n static int __init proc_kcore_init(void)\n {\n+\tif (!kcore_enabled) {\n+\t\tpr_info(\"/proc/kcore disabled on command line\\n\");\n+\t\treturn 0;\n+\t}\n+\n \tproc_root_kcore = proc_create(\"kcore\", S_IRUSR, NULL, \u0026kcore_proc_ops);\n \tif (!proc_root_kcore) {\n \t\tpr_err(\"couldn't create /proc/kcore\\n\");\n"
} |
| 2/1 | 2026/10/27 09:53 | agent | patch-evaluator |
0mModel:core Args: null Results: {
"EnableConfigs": null,
"FocusSymbols": [],
"Reasoning": "The patch only adds a boot command-line parameter ('kcore=') to enable or disable /proc/kcore at boot time. The modified code consists entirely of documentation and __init / __initdata boot-time code (parse_kcore and an early check in proc_kcore_init), which executes once during boot and is discarded from memory before userspace starts. None of the modified code is reachable or fuzzable at runtime by syzkaller.",
"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 704189f1dce644b0e51332a112095a5a6a49280c
Author: syz-cluster <triage@syzkaller.com>
Date: Tue Oct 27 09:53:44 2026 +0000
syz-cluster: applied patch under review
diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index e75344f4e0cdef..d8acce2878ab92 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -2915,6 +2915,12 @@ Kernel parameters
parameter KASAN will print report only for the first
invalid access.
+ kcore= [KNL,EARLY]
+ Enable or disable /proc/kcore on kernels built with
+ CONFIG_PROC_KCORE=y.
+ Format: <bool>
+ Default: on
+
keep_bootcon [KNL,EARLY]
Do not unregister boot console at start. This is only
useful for debugging when something happens in the window
diff --git a/fs/proc/kcore.c b/fs/proc/kcore.c
index 390547b992acd9..6a29a3e0ed92e8 100644
--- a/fs/proc/kcore.c
+++ b/fs/proc/kcore.c
@@ -69,6 +69,7 @@ static size_t kcore_notes_len;
static size_t kcore_data_offset;
DEFINE_STATIC_PERCPU_RWSEM(kclist_lock);
static int kcore_need_update = 1;
+static bool kcore_enabled __initdata = true;
/*
* Returns > 0 for RAM pages, 0 for non-RAM pages, < 0 on error
@@ -720,8 +721,19 @@ static void __init add_modules_range(void)
}
#endif
+static int __init parse_kcore(char *str)
+{
+ return kstrtobool(str, &kcore_enabled);
+}
+early_param("kcore", parse_kcore);
+
static int __init proc_kcore_init(void)
{
+ if (!kcore_enabled) {
+ pr_info("/proc/kcore disabled on command line\n");
+ return 0;
+ }
+
proc_root_kcore = proc_create("kcore", S_IRUSR, NULL, &kcore_proc_ops);
if (!proc_root_kcore) {
pr_err("couldn't create /proc/kcore\n");
|
| 3/2 | 2026/10/27 09:53 | llm | patch-evaluator |
0mModel:gemini-3.8-flash Args: null Results: null Tokens: input: 3440 output: 36 thoughts: 303 Thoughts: **Analyzing the Kcore Patch Series** Okay, so the user wants me to evaluate this patch series against the amd64 architecture, applied on the current `HEAD` commit. Let's dig in. I see two files have been modified. First, `Documentation/admin-guide/kernel-parameters.txt` has been updated to include documentation for a new kernel parameter: `kcore=`. I'll want to review that documentation carefully to understand the intended functionality and any associated implications. The core of the change seems to be in `fs/proc/kcore.c`. Looking at the diff, it introduces a `kcore_enabled` variable, initialized to `true`, and associated parsing function `parse_kcore` that hooks into the `early_param` mechanism. This is a common pattern for allowing the kernel to take command line arguments early in the boot process. It looks like it enables or disables the functionality controlled by the patch. The `proc_kcore_init` function now checks this `kcore_enabled` variable. If disabled, a message is printed and the initialization process is skipped. I'll quickly check the surrounding code in `fs/proc/kcore.c` around lines 715-740 using my internal tools (`read-file`) to understand the surrounding context of these changes. I'll need to understand how the `kcore_need_update` variable is used, and how this new `kcore_enabled` variable integrates into the broader `kcore` system. This initial look suggests this is about enabling/disabling the `/proc/kcore` file via a kernel parameter. I expect to see an immediate impact on boot behavior with the added command line flag. |
| 4/2 | 2026/10/27 09:53 | tool | read-file |
0mArgs:{
"File": "fs/proc/kcore.c",
"FirstLine": 715,
"LineCount": 40
}Results: {
"Contents": " 715:\t\t\t\tMODULES_END - MODULES_VADDR, KCORE_VMALLOC);\n 716:\t\t}\n 717:\t}\n 718:\t#else\n 719:\tstatic void __init add_modules_range(void)\n 720:\t{\n 721:\t}\n 722:\t#endif\n 723:\t\n 724:\tstatic int __init parse_kcore(char *str)\n 725:\t{\n 726:\t\treturn kstrtobool(str, \u0026kcore_enabled);\n 727:\t}\n 728:\tearly_param(\"kcore\", parse_kcore);\n 729:\t\n 730:\tstatic int __init proc_kcore_init(void)\n 731:\t{\n 732:\t\tif (!kcore_enabled) {\n 733:\t\t\tpr_info(\"/proc/kcore disabled on command line\\n\");\n 734:\t\t\treturn 0;\n 735:\t\t}\n 736:\t\n 737:\t\tproc_root_kcore = proc_create(\"kcore\", S_IRUSR, NULL, \u0026kcore_proc_ops);\n 738:\t\tif (!proc_root_kcore) {\n 739:\t\t\tpr_err(\"couldn't create /proc/kcore\\n\");\n 740:\t\t\treturn 0; /* Always returns 0. */\n 741:\t\t}\n 742:\t\t/* Store text area if it's special */\n 743:\t\tproc_kcore_text_init();\n 744:\t\t/* Store vmalloc area */\n 745:\t\tkclist_add(\u0026kcore_vmalloc, (void *)VMALLOC_START,\n 746:\t\t\tVMALLOC_END - VMALLOC_START, KCORE_VMALLOC);\n 747:\t\tadd_modules_range();\n 748:\t\t/* Store direct-map area from physical memory map */\n 749:\t\tkcore_update_ram();\n 750:\t\thotplug_memory_notifier(kcore_callback, DEFAULT_CALLBACK_PRI);\n 751:\t\n 752:\t\treturn 0;\n 753:\t}\n 754:\tfs_initcall(proc_kcore_init);\n"
} |
| 5/2 | 2026/10/27 09:53 | llm | patch-evaluator |
0mModel:gemini-3.8-flash Args: null Results: null Tokens: input: 4745 output: 18 thoughts: 414 Thoughts: **Analyzing the Patch for Syzkaller Fuzzability** Okay, let's break this down. My initial instinct is to assess if this patch introduces any runtime fuzzability for syzkaller. The patch introduces a `kcore=<bool>` boot parameter and, critically, conditional initialization of `/proc/kcore`. If disabled, `proc_kcore_init` short-circuits. My first thought is always to check the syzkaller guidelines, specifically the reachability principle. *Can* this code even execute in a standard virtualized environment under test? The answer has to be "no". `parse_kcore` and `proc_kcore_init` are both marked `__init`. They're executed only during the very early boot process, specifically at kernel initialization via the command-line parsing phase (for `parse_kcore`) or when the filesystem is being initialized (for `proc_kcore_init`). This means these functions have long since disappeared into the ether by the time syzkaller is running and generating syscalls. `free_initmem()` has, surely, been called. Syzkaller's entire operational model is based on generating syscalls *after* the system is up and running. It doesn't reboot the VM with different boot command-line parameters for each test case or attempt to fuzz `__init` code via syscalls. Of course, I need to be *absolutely* sure. Just to be safe, I'll review the git log or the diff itself. There's always a chance something was missed in the initial review, that something subtly runtime-related was impacted that might make this code indirectly reachable. |
| 6/2 | 2026/10/27 09:54 | tool | grepper |
0mArgs:{
"Expression": "kcore_enabled"
}Results: {
"Output": "fs/proc/kcore.c=71=static int kcore_need_update = 1;\nfs/proc/kcore.c:72:static bool kcore_enabled __initdata = true;\nfs/proc/kcore.c-73-\n--\nfs/proc/kcore.c=724=static int __init parse_kcore(char *str)\nfs/proc/kcore.c-725-{\nfs/proc/kcore.c:726:\treturn kstrtobool(str, \u0026kcore_enabled);\nfs/proc/kcore.c-727-}\n--\nfs/proc/kcore.c=730=static int __init proc_kcore_init(void)\nfs/proc/kcore.c-731-{\nfs/proc/kcore.c:732:\tif (!kcore_enabled) {\nfs/proc/kcore.c-733-\t\tpr_info(\"/proc/kcore disabled on command line\\n\");\n"
} |
| 7/2 | 2026/10/27 09:54 | llm | patch-evaluator |
0mModel:gemini-3.8-flash Args: null Results: null Tokens: input: 5783 output: 126 thoughts: 1041 Thoughts: **Analysis of the `kcore` Patch's Fuzzing Worth**
Okay, let's break this down systematically. I see that `kcore_enabled` is declared as `__initdata`, and `parse_kcore` is `__init` along with `early_param`. `proc_kcore_init` is also marked as `__init` and `fs_initcall`. The key takeaway here is that *absolutely no runtime code* is actually modified. When the kernel finishes booting, `free_initmem()` reclaims all the `__init` and `__initdata` sections of memory. By the time syzkaller, or any userspace activity, begins, the functions `parse_kcore`, the variable `kcore_enabled`, and the initialization function `proc_kcore_init` no longer exist in memory. They are gone. There is simply no way for a syscall or any kind of userspace interaction to touch `parse_kcore` or `proc_kcore_init`. Furthermore, syzkaller is not capable of fuzzing boot-time `early_param` parsing.
Now, let's check against the negative criteria.
Looking at Section 2: "WHEN TO RETURN WorthFuzzing=false (NEGATIVE CRITERIA)", I have to verify that all the changes fall into the "NOT WorthFuzzing" categories:
* **Non-kernel and non-executable changes:** The documentation change definitely fits.
* **Structurally unreachable hardware:** This doesn't apply.
* **Unreachable execution paths:** And here we go! Early boot initialization code is inherently unreachable by a syzkaller fuzzing run. It runs before syzkaller even starts.
Section 1 reinforces this "REACHABILITY IS THE PRIMARY GATE": Fuzzing can only discover bugs in code that can actually execute in standard virtualized environments. Since the modified code is structurally unreachable at runtime, it's a "MUST NOT be fuzzed" situation, regardless of its complexity or assertions. Section 2 even directly mentions *early boot* initialization being unreachable. The `__init`, and `early_param` code only gets executed during the kernel boot process, and *before* userspace starts, which is precisely when syzkaller runs. Syzkaller cannot pass boot arguments, or invoke `__init` code.
Let's do a double check here to make sure: Is there any difference in runtime behavior when `kcore=on` which is the default?
With the default, `kcore_enabled` is true.
Inside of `proc_kcore_init`, because `if (!kcore_enabled)` will be false, it proceeds as it would otherwise to `proc_root_kcore = proc_create(...)`. This means the rest of the code in `fs/proc/kcore.c` (reading from /proc/kcore, open, release) is exactly the same as before. The patch adds only Documentation, `kcore_enabled` (`__initdata`), `parse_kcore` with `early_param`, and then the single conditional `if (!kcore_enabled) { ... return 0; }` in `__init proc_kcore_init(void)`.
In conclusion: all the code I can see here falls squarely into the `__init` and `__initdata` boot-time initialization category and the documentation category. The added `kcore=` parameter is an *early* boot option. This code is unreachable during runtime fuzzing by syzkaller.
Therefore:
* **WorthFuzzing: false**
* **FocusSymbols: \[ ]**
* **EnableConfigs: \[ ]**
* **Reasoning:** The patch adds documentation and modifies early boot initialization code (`__init` and `__initdata` in `fs/proc/kcore.c`) to add a `kcore=` early boot command-line parameter. This initialization code runs once during kernel boot before the start of userspace, and is then discarded. It is therefore unreachable and cannot be exercised by syzkaller during runtime syscall fuzzing.
Now, I'm going to call `set-results`.
|
| 8/2 | 2026/10/27 09:54 | tool | set-results |
0mArgs:{
"EnableConfigs": [],
"FocusSymbols": [],
"Reasoning": "The patch only adds a boot command-line parameter ('kcore=') to enable or disable /proc/kcore at boot time. The modified code consists entirely of documentation and __init / __initdata boot-time code (parse_kcore and an early check in proc_kcore_init), which executes once during boot and is discarded from memory before userspace starts. None of the modified code is reachable or fuzzable at runtime by syzkaller.",
"WorthFuzzing": false
}Results: {
"EnableConfigs": null,
"FocusSymbols": [],
"Reasoning": "The patch only adds a boot command-line parameter ('kcore=') to enable or disable /proc/kcore at boot time. The modified code consists entirely of documentation and __init / __initdata boot-time code (parse_kcore and an early check in proc_kcore_init), which executes once during boot and is discarded from memory before userspace starts. None of the modified code is reachable or fuzzable at runtime by syzkaller.",
"WorthFuzzing": false
} |
| 9/1 | 2026/10/27 09:54 | 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) |
|---|