| Seq | Timestamp | Type | Name | Duration |
|---|---|---|---|---|
| 0/0 | 2026/07/24 09:17 | flow | patch-triage |
1mArgs:null Results: {
"EnableConfigs": [
"MEMCG",
"NUMA"
],
"FocusSymbols": [
"user_proactive_reclaim",
"reclaim_store",
"memory_reclaim",
"get_scan_count",
"get_swappiness",
"get_nr_to_scan",
"__node_reclaim"
],
"Reasoning": "The patch fixes a bug in proactive memory reclaim where anonymous memory only reclaim (swappiness=max) could incorrectly fall back to evicting file pages when anonymous pages cannot be reclaimed (e.g. no swap). It modifies core memory management logic in mm/vmscan.c and mm/memcontrol.c. This is a functional change that can be triggered from userspace via cgroup memory.reclaim or sysfs node reclaim attributes.",
"WorthFuzzing": true
} |
| 1/1 | 2026/07/24 09:17 | action | read-patch-diff |
0mArgs:null Results: {
"PatchDiff": "commit 90a4166205d01d2332756d7f2098f1c2095aa942\nAuthor: syz-cluster \u003ctriage@syzkaller.com\u003e\nDate: Fri Jul 24 09:17:46 2026 +0000\n\n syz-cluster: applied patch under review\n\ndiff --git a/mm/vmscan.c b/mm/vmscan.c\nindex 35c3bb15ae96a3..20cb93fd3da824 100644\n--- a/mm/vmscan.c\n+++ b/mm/vmscan.c\n@@ -2501,6 +2501,23 @@ static void get_scan_count(struct lruvec *lruvec, struct scan_control *sc,\n \tenum scan_balance scan_balance;\n \tenum lru_list lru;\n \n+\t/*\n+\t * Proactive reclaim initiated by userspace for anonymous memory only.\n+\t * SWAPPINESS_ANON_ONLY is set only on the proactive reclaim path, so\n+\t * warn if it shows up elsewhere. When anon cannot be reclaimed (e.g.\n+\t * no swap), bail out instead of falling back to evicting file pages,\n+\t * which would violate the anon-only semantics.\n+\t */\n+\tif (swappiness == SWAPPINESS_ANON_ONLY) {\n+\t\tWARN_ON_ONCE(!sc-\u003eproactive);\n+\t\tif (!can_reclaim_anon_pages(memcg, pgdat-\u003enode_id, sc)) {\n+\t\t\tmemset(nr, 0, sizeof(*nr) * NR_LRU_LISTS);\n+\t\t\treturn;\n+\t\t}\n+\t\tscan_balance = SCAN_ANON;\n+\t\tgoto out;\n+\t}\n+\n \t/* If we have no swap space, do not bother scanning anon folios. */\n \tif (!sc-\u003emay_swap || !can_reclaim_anon_pages(memcg, pgdat-\u003enode_id, sc)) {\n \t\tscan_balance = SCAN_FILE;\n@@ -2519,13 +2536,6 @@ static void get_scan_count(struct lruvec *lruvec, struct scan_control *sc,\n \t\tgoto out;\n \t}\n \n-\t/* Proactive reclaim initiated by userspace for anonymous memory only */\n-\tif (swappiness == SWAPPINESS_ANON_ONLY) {\n-\t\tWARN_ON_ONCE(!sc-\u003eproactive);\n-\t\tscan_balance = SCAN_ANON;\n-\t\tgoto out;\n-\t}\n-\n \t/*\n \t * Do not apply any pressure balancing cleverness when the\n \t * system is close to OOM, scan both anon and file equally\n@@ -2698,6 +2708,10 @@ static int get_swappiness(struct lruvec *lruvec, struct scan_control *sc)\n {\n \tstruct mem_cgroup *memcg = lruvec_memcg(lruvec);\n \tstruct pglist_data *pgdat = lruvec_pgdat(lruvec);\n+\tint swappiness = sc_swappiness(sc, memcg);\n+\n+\tif (swappiness == SWAPPINESS_ANON_ONLY)\n+\t\treturn swappiness;\n \n \tif (!sc-\u003emay_swap)\n \t\treturn 0;\n@@ -2706,7 +2720,7 @@ static int get_swappiness(struct lruvec *lruvec, struct scan_control *sc)\n \t mem_cgroup_get_nr_swap_pages(memcg) \u003c MIN_LRU_BATCH)\n \t\treturn 0;\n \n-\treturn sc_swappiness(sc, memcg);\n+\treturn swappiness;\n }\n \n static int get_nr_gens(struct lruvec *lruvec, int type)\n@@ -4911,6 +4925,19 @@ static long get_nr_to_scan(struct lruvec *lruvec, struct scan_control *sc,\n \t\t\t struct mem_cgroup *memcg, int swappiness)\n {\n \tunsigned long nr_to_scan, evictable;\n+\tstruct pglist_data *pgdat = lruvec_pgdat(lruvec);\n+\t/*\n+\t * Proactive reclaim initiated by userspace for anonymous memory only.\n+\t * SWAPPINESS_ANON_ONLY is set only on the proactive reclaim path, so\n+\t * warn if it shows up elsewhere. When anon cannot be reclaimed (e.g.\n+\t * no swap), return 0 instead of falling through and evicting file\n+\t * pages, which would violate the anon-only semantics.\n+\t */\n+\tif (swappiness == SWAPPINESS_ANON_ONLY \u0026\u0026\n+\t !can_reclaim_anon_pages(memcg, pgdat-\u003enode_id, sc)) {\n+\t\tWARN_ON_ONCE(!sc-\u003eproactive);\n+\t\treturn 0;\n+\t}\n \n \tevictable = lruvec_evictable_size(lruvec, swappiness);\n \n@@ -7738,7 +7765,7 @@ static unsigned long node_pagecache_reclaimable(struct pglist_data *pgdat)\n /*\n * Try to free up some pages from this node through reclaim.\n */\n-static unsigned long __node_reclaim(struct pglist_data *pgdat, gfp_t gfp_mask,\n+static unsigned long __node_reclaim(struct pglist_data *pgdat,\n \t\t\t\t unsigned long nr_pages,\n \t\t\t\t struct scan_control *sc)\n {\n@@ -7830,7 +7857,7 @@ int node_reclaim(struct pglist_data *pgdat, gfp_t gfp_mask, unsigned int order)\n \tif (test_and_set_bit_lock(PGDAT_RECLAIM_LOCKED, \u0026pgdat-\u003eflags))\n \t\treturn NODE_RECLAIM_NOSCAN;\n \n-\tret = __node_reclaim(pgdat, gfp_mask, nr_pages, \u0026sc) \u003e= nr_pages;\n+\tret = __node_reclaim(pgdat, nr_pages, \u0026sc) \u003e= nr_pages;\n \tclear_bit_unlock(PGDAT_RECLAIM_LOCKED, \u0026pgdat-\u003eflags);\n \n \tif (ret)\n@@ -7843,7 +7870,7 @@ int node_reclaim(struct pglist_data *pgdat, gfp_t gfp_mask, unsigned int order)\n \n #else\n \n-static unsigned long __node_reclaim(struct pglist_data *pgdat, gfp_t gfp_mask,\n+static unsigned long __node_reclaim(struct pglist_data *pgdat,\n \t\t\t\t unsigned long nr_pages,\n \t\t\t\t struct scan_control *sc)\n {\n@@ -7945,8 +7972,7 @@ int user_proactive_reclaim(char *buf,\n \t\t\t\t\t\t \u0026pgdat-\u003eflags))\n \t\t\t\treturn -EBUSY;\n \n-\t\t\treclaimed = __node_reclaim(pgdat, gfp_mask,\n-\t\t\t\t\t\t batch_size, \u0026sc);\n+\t\t\treclaimed = __node_reclaim(pgdat, batch_size, \u0026sc);\n \t\t\tclear_bit_unlock(PGDAT_RECLAIM_LOCKED, \u0026pgdat-\u003eflags);\n \t\t}\n \n@@ -8013,7 +8039,7 @@ static ssize_t reclaim_store(struct device *dev,\n \tint ret, nid = dev-\u003eid;\n \n \tret = user_proactive_reclaim((char *)buf, NULL, NODE_DATA(nid));\n-\treturn ret ? -EAGAIN : count;\n+\treturn ret ? ret : count;\n }\n \n static DEVICE_ATTR_WO(reclaim);\n"
} |
| 2/1 | 2026/07/24 09:17 | agent | patch-evaluator |
1mModel:best-expensive Args: null Results: {
"EnableConfigs": [
"MEMCG",
"NUMA"
],
"FocusSymbols": [
"user_proactive_reclaim",
"reclaim_store",
"memory_reclaim",
"get_scan_count",
"get_swappiness",
"get_nr_to_scan",
"__node_reclaim"
],
"Reasoning": "The patch fixes a bug in proactive memory reclaim where anonymous memory only reclaim (swappiness=max) could incorrectly fall back to evicting file pages when anonymous pages cannot be reclaimed (e.g. no swap). It modifies core memory management logic in mm/vmscan.c and mm/memcontrol.c. This is a functional change that can be triggered from userspace via cgroup memory.reclaim or sysfs node reclaim attributes.",
"WorthFuzzing": true
}Instruction: You are an expert Linux kernel maintainer. Your job is to review a provided patch series and determine if it makes functional changes to the kernel that should be fuzzed. IMPORTANT: The changes have ALREADY been applied and committed as the HEAD commit in your workspace. Do NOT rely on your internal knowledge of the kernel. You must actively use your code access tools to examine the actual source code and confirm any assumptions. Return WorthFuzzing=false if the patch only contains: - Modifications to Documentation/, Kconfig files, or code comments. - Purely decorative changes, such as logging (e.g., pr_err, printk) or tracepoints. - Changes to numeric constants or macros that do not functionally alter execution flow. - Code paths that are impossible to reach in virtualized environments like GCE or QEMU, even when utilizing software-emulated hardware (e.g., usb gadget, mac80211_hwsim). If it modifies reachable core kernel logic, drivers, or architectures, use your code search tools to verify the code can be executed, then return WorthFuzzing=true. When returning WorthFuzzing=true, you MUST ALSO: 1. Extract any specific kernel functions that should be heavily fuzzed into FocusSymbols. Avoid listing generic hot-path functions to prevent skewed test distributions. 2. Identify any specific CONFIG_ options required to properly test this new/modified feature. Go and look into the Kconfig files and check for ifdefs around the code, do not make assumptions. Do not list too generic configs (we already have them enabled). Only list those that specifically cover the modified code. List them in the EnableConfigs output array, and DO NOT add a '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: For your convenience, here is the diff of the changes:
commit 90a4166205d01d2332756d7f2098f1c2095aa942
Author: syz-cluster <triage@syzkaller.com>
Date: Fri Jul 24 09:17:46 2026 +0000
syz-cluster: applied patch under review
diff --git a/mm/vmscan.c b/mm/vmscan.c
index 35c3bb15ae96a3..20cb93fd3da824 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -2501,6 +2501,23 @@ static void get_scan_count(struct lruvec *lruvec, struct scan_control *sc,
enum scan_balance scan_balance;
enum lru_list lru;
+ /*
+ * Proactive reclaim initiated by userspace for anonymous memory only.
+ * SWAPPINESS_ANON_ONLY is set only on the proactive reclaim path, so
+ * warn if it shows up elsewhere. When anon cannot be reclaimed (e.g.
+ * no swap), bail out instead of falling back to evicting file pages,
+ * which would violate the anon-only semantics.
+ */
+ if (swappiness == SWAPPINESS_ANON_ONLY) {
+ WARN_ON_ONCE(!sc->proactive);
+ if (!can_reclaim_anon_pages(memcg, pgdat->node_id, sc)) {
+ memset(nr, 0, sizeof(*nr) * NR_LRU_LISTS);
+ return;
+ }
+ scan_balance = SCAN_ANON;
+ goto out;
+ }
+
/* If we have no swap space, do not bother scanning anon folios. */
if (!sc->may_swap || !can_reclaim_anon_pages(memcg, pgdat->node_id, sc)) {
scan_balance = SCAN_FILE;
@@ -2519,13 +2536,6 @@ static void get_scan_count(struct lruvec *lruvec, struct scan_control *sc,
goto out;
}
- /* Proactive reclaim initiated by userspace for anonymous memory only */
- if (swappiness == SWAPPINESS_ANON_ONLY) {
- WARN_ON_ONCE(!sc->proactive);
- scan_balance = SCAN_ANON;
- goto out;
- }
-
/*
* Do not apply any pressure balancing cleverness when the
* system is close to OOM, scan both anon and file equally
@@ -2698,6 +2708,10 @@ static int get_swappiness(struct lruvec *lruvec, struct scan_control *sc)
{
struct mem_cgroup *memcg = lruvec_memcg(lruvec);
struct pglist_data *pgdat = lruvec_pgdat(lruvec);
+ int swappiness = sc_swappiness(sc, memcg);
+
+ if (swappiness == SWAPPINESS_ANON_ONLY)
+ return swappiness;
if (!sc->may_swap)
return 0;
@@ -2706,7 +2720,7 @@ static int get_swappiness(struct lruvec *lruvec, struct scan_control *sc)
mem_cgroup_get_nr_swap_pages(memcg) < MIN_LRU_BATCH)
return 0;
- return sc_swappiness(sc, memcg);
+ return swappiness;
}
static int get_nr_gens(struct lruvec *lruvec, int type)
@@ -4911,6 +4925,19 @@ static long get_nr_to_scan(struct lruvec *lruvec, struct scan_control *sc,
struct mem_cgroup *memcg, int swappiness)
{
unsigned long nr_to_scan, evictable;
+ struct pglist_data *pgdat = lruvec_pgdat(lruvec);
+ /*
+ * Proactive reclaim initiated by userspace for anonymous memory only.
+ * SWAPPINESS_ANON_ONLY is set only on the proactive reclaim path, so
+ * warn if it shows up elsewhere. When anon cannot be reclaimed (e.g.
+ * no swap), return 0 instead of falling through and evicting file
+ * pages, which would violate the anon-only semantics.
+ */
+ if (swappiness == SWAPPINESS_ANON_ONLY &&
+ !can_reclaim_anon_pages(memcg, pgdat->node_id, sc)) {
+ WARN_ON_ONCE(!sc->proactive);
+ return 0;
+ }
evictable = lruvec_evictable_size(lruvec, swappiness);
@@ -7738,7 +7765,7 @@ static unsigned long node_pagecache_reclaimable(struct pglist_data *pgdat)
/*
* Try to free up some pages from this node through reclaim.
*/
-static unsigned long __node_reclaim(struct pglist_data *pgdat, gfp_t gfp_mask,
+static unsigned long __node_reclaim(struct pglist_data *pgdat,
unsigned long nr_pages,
struct scan_control *sc)
{
@@ -7830,7 +7857,7 @@ int node_reclaim(struct pglist_data *pgdat, gfp_t gfp_mask, unsigned int order)
if (test_and_set_bit_lock(PGDAT_RECLAIM_LOCKED, &pgdat->flags))
return NODE_RECLAIM_NOSCAN;
- ret = __node_reclaim(pgdat, gfp_mask, nr_pages, &sc) >= nr_pages;
+ ret = __node_reclaim(pgdat, nr_pages, &sc) >= nr_pages;
clear_bit_unlock(PGDAT_RECLAIM_LOCKED, &pgdat->flags);
if (ret)
@@ -7843,7 +7870,7 @@ int node_reclaim(struct pglist_data *pgdat, gfp_t gfp_mask, unsigned int order)
#else
-static unsigned long __node_reclaim(struct pglist_data *pgdat, gfp_t gfp_mask,
+static unsigned long __node_reclaim(struct pglist_data *pgdat,
unsigned long nr_pages,
struct scan_control *sc)
{
@@ -7945,8 +7972,7 @@ int user_proactive_reclaim(char *buf,
&pgdat->flags))
return -EBUSY;
- reclaimed = __node_reclaim(pgdat, gfp_mask,
- batch_size, &sc);
+ reclaimed = __node_reclaim(pgdat, batch_size, &sc);
clear_bit_unlock(PGDAT_RECLAIM_LOCKED, &pgdat->flags);
}
@@ -8013,7 +8039,7 @@ static ssize_t reclaim_store(struct device *dev,
int ret, nid = dev->id;
ret = user_proactive_reclaim((char *)buf, NULL, NODE_DATA(nid));
- return ret ? -EAGAIN : count;
+ return ret ? ret : count;
}
static DEVICE_ATTR_WO(reclaim);
|
| 3/2 | 2026/07/24 09:17 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 3535 output: 21 thoughts: 264 Thoughts: **Analyzing the VMScan Patch: A Deep Dive** Okay, so this patch is digging into `mm/vmscan.c`, which immediately tells me we're dealing with the heart of memory management in the kernel – specifically the virtual memory scanner. This looks to be addressing a nuanced issue around proactive reclaim behavior with `SWAPPINESS_ANON_ONLY`. My initial understanding is that it's fixing a scenario where, under specific conditions (like a lack of available swap space), the system might inappropriately start evicting file pages when it's supposed to *only* focus on anonymous (anon) pages. This is something I've seen before; it's a classic case of subtle interaction between different reclaim strategies. The patch touches a cluster of functions: `get_scan_count`, `get_swappiness`, `get_nr_to_scan`, `__node_reclaim`, `user_proactive_reclaim`, and `reclaim_store`. The modifications to `__node_reclaim` look straightforward; removing an unused `gfp_mask` is generally a sign of good hygiene and reduction of code clutter. Nothing immediately alarming there. The tweak to `reclaim_store` to return `ret` instead of `-EAGAIN` when `user_proactive_reclaim` fails warrants further investigation. This suggests a change in error handling or a shift in how failure states are communicated. We need to understand the implications, particularly how the caller will interpret the change in return value. Now, let's trace the calls. I'm going to quickly check where `user_proactive_reclaim` and `reclaim_store` are actually invoked. I remember that `user_proactive_reclaim` is called from both `reclaim_store` and `memory_reclaim` -- good to know. The fact that `reclaim_store` is a sysfs attribute on a node device is important; this tells me it's a user-space interface for triggering reclaim on a specific NUMA node. And `memory_reclaim` strongly suggests that it's a cgroup attribute. Both give important hints. Now I'll scan the source code directly to confirm this understanding and to understand how these elements fit into the broader kernel reclaim process. I'll focus on how the control flow changes with this fix. |
| 4/2 | 2026/07/24 09:17 | tool | grepper |
0mArgs:{
"Expression": "user_proactive_reclaim"
}Results: {
"Output": "mm/internal.h=624=extern void reclaim_throttle(pg_data_t *pgdat, enum vmscan_throttle_state reason);\nmm/internal.h:625:int user_proactive_reclaim(char *buf,\nmm/internal.h-626-\t\t\t struct mem_cgroup *memcg, pg_data_t *pgdat);\n--\nmm/memcontrol.c=4989=static ssize_t memory_reclaim(struct kernfs_open_file *of, char *buf,\n--\nmm/memcontrol.c-4994-\nmm/memcontrol.c:4995:\tret = user_proactive_reclaim(buf, memcg, NULL);\nmm/memcontrol.c-4996-\tif (ret)\n--\nmm/vmscan.c=7887=static const match_table_t tokens = {\n--\nmm/vmscan.c-7892-\nmm/vmscan.c:7893:int user_proactive_reclaim(char *buf,\nmm/vmscan.c-7894-\t\t\t struct mem_cgroup *memcg, pg_data_t *pgdat)\n--\nmm/vmscan.c=8035=static ssize_t reclaim_store(struct device *dev,\n--\nmm/vmscan.c-8040-\nmm/vmscan.c:8041:\tret = user_proactive_reclaim((char *)buf, NULL, NODE_DATA(nid));\nmm/vmscan.c-8042-\treturn ret ? ret : count;\n"
} |
| 5/2 | 2026/07/24 09:17 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 4720 output: 18 thoughts: 135 Thoughts: **My Initial Assessment of the `user_proactive_reclaim` Function** Okay, so I've got this new function, `user_proactive_reclaim`, and it's looking like it can be accessed through the cgroup's `memory.reclaim` interface and the `reclaim` sysfs node. My gut tells me this could be a point of interest for security vulnerabilities, especially since the patch modifies the core memory management logic within `vmscan`. I'm already thinking this is functional and absolutely worth a dedicated fuzzing campaign. To dig deeper, the key symbols that immediately grab my attention are `user_proactive_reclaim` itself, of course, along with `reclaim_store`, which likely handles the interface into that function, and `memory_reclaim` within `mm/memcontrol.c`. I need to understand how these elements interrelate. Furthermore, I need to understand how the scan limits are imposed and configured, so `get_scan_count`, `get_swappiness`, and `get_nr_to_scan` will need scrutiny to understand the limits imposed. I should also make sure to check if `CONFIG_MEMCG` is required for `memory_reclaim` to function properly. That dependency could dictate how broadly applicable this vulnerability is. |
| 6/2 | 2026/07/24 09:18 | tool | grepper |
0mArgs:{
"Expression": "memory_reclaim"
}Results: {
"Output": "arch/x86/include/asm/kvm-x86-ops.h=135=KVM_X86_OP_OPTIONAL(vm_move_enc_context_from)\narch/x86/include/asm/kvm-x86-ops.h:136:KVM_X86_OP_OPTIONAL(guest_memory_reclaimed)\narch/x86/include/asm/kvm-x86-ops.h-137-KVM_X86_OP(get_feature_msr)\n--\narch/x86/include/asm/kvm_host.h=1785=struct kvm_x86_ops {\n--\narch/x86/include/asm/kvm_host.h-1986-\tint (*vm_move_enc_context_from)(struct kvm *kvm, unsigned int source_fd);\narch/x86/include/asm/kvm_host.h:1987:\tvoid (*guest_memory_reclaimed)(struct kvm *kvm);\narch/x86/include/asm/kvm_host.h-1988-\n--\narch/x86/kvm/svm/sev.c=3259=static void sev_flush_encrypted_page(struct kvm_vcpu *vcpu, void *va)\n--\narch/x86/kvm/svm/sev.c-3294-\narch/x86/kvm/svm/sev.c:3295:void sev_guest_memory_reclaimed(struct kvm *kvm)\narch/x86/kvm/svm/sev.c-3296-{\n--\narch/x86/kvm/svm/svm.c=5330=struct kvm_x86_ops svm_x86_ops __initdata = {\n--\narch/x86/kvm/svm/svm.c-5451-\t.mem_enc_unregister_region = sev_mem_enc_unregister_region,\narch/x86/kvm/svm/svm.c:5452:\t.guest_memory_reclaimed = sev_guest_memory_reclaimed,\narch/x86/kvm/svm/svm.c-5453-\n--\narch/x86/kvm/svm/svm.h=987=int sev_vm_move_enc_context_from(struct kvm *kvm, unsigned int source_fd);\narch/x86/kvm/svm/svm.h:988:void sev_guest_memory_reclaimed(struct kvm *kvm);\narch/x86/kvm/svm/svm.h-989-int sev_handle_vmgexit(struct kvm_vcpu *vcpu);\n--\narch/x86/kvm/x86.c=11073=static void vcpu_load_eoi_exitmap(struct kvm_vcpu *vcpu)\n--\narch/x86/kvm/x86.c-11092-\narch/x86/kvm/x86.c:11093:void kvm_arch_guest_memory_reclaimed(struct kvm *kvm)\narch/x86/kvm/x86.c-11094-{\narch/x86/kvm/x86.c:11095:\tkvm_x86_call(guest_memory_reclaimed)(kvm);\narch/x86/kvm/x86.c-11096-}\n--\ndrivers/firmware/arm_ffa/driver.c=800=static int ffa_memory_ops(u32 func_id, struct ffa_mem_ops_args *args)\n--\ndrivers/firmware/arm_ffa/driver.c-824-\ndrivers/firmware/arm_ffa/driver.c:825:static int ffa_memory_reclaim(u64 g_handle, u32 flags)\ndrivers/firmware/arm_ffa/driver.c-826-{\n--\ndrivers/firmware/arm_ffa/driver.c=1623=static const struct ffa_mem_ops ffa_drv_mem_ops = {\ndrivers/firmware/arm_ffa/driver.c:1624:\t.memory_reclaim = ffa_memory_reclaim,\ndrivers/firmware/arm_ffa/driver.c-1625-\t.memory_share = ffa_memory_share,\n--\ndrivers/tee/optee/ffa_abi.c=270=static int optee_ffa_shm_register(struct tee_context *ctx, struct tee_shm *shm,\n--\ndrivers/tee/optee/ffa_abi.c-304-\tif (rc) {\ndrivers/tee/optee/ffa_abi.c:305:\t\tmem_ops-\u003ememory_reclaim(args.g_handle, 0);\ndrivers/tee/optee/ffa_abi.c-306-\t\treturn rc;\n--\ndrivers/tee/optee/ffa_abi.c=314=static int optee_ffa_shm_unregister(struct tee_context *ctx,\n--\ndrivers/tee/optee/ffa_abi.c-335-\ndrivers/tee/optee/ffa_abi.c:336:\trc = mem_ops-\u003ememory_reclaim(global_handle, 0);\ndrivers/tee/optee/ffa_abi.c-337-\tif (rc)\n--\ndrivers/tee/optee/ffa_abi.c=343=static int optee_ffa_shm_unregister_supp(struct tee_context *ctx,\n--\ndrivers/tee/optee/ffa_abi.c-358-\tmem_ops = optee-\u003effa.ffa_dev-\u003eops-\u003emem_ops;\ndrivers/tee/optee/ffa_abi.c:359:\trc = mem_ops-\u003ememory_reclaim(global_handle, 0);\ndrivers/tee/optee/ffa_abi.c-360-\tif (rc)\n--\ndrivers/tee/optee/ffa_abi.c=682=static int optee_ffa_lend_protmem(struct optee *optee, struct tee_shm *protmem,\n--\ndrivers/tee/optee/ffa_abi.c-737-err_reclaim:\ndrivers/tee/optee/ffa_abi.c:738:\tmem_ops-\u003ememory_reclaim(args.g_handle, 0);\ndrivers/tee/optee/ffa_abi.c-739-\treturn rc;\n--\ndrivers/tee/optee/ffa_abi.c=742=static int optee_ffa_reclaim_protmem(struct optee *optee,\n--\ndrivers/tee/optee/ffa_abi.c-762-\ndrivers/tee/optee/ffa_abi.c:763:\trc = mem_ops-\u003ememory_reclaim(global_handle, 0);\ndrivers/tee/optee/ffa_abi.c-764-\tif (rc)\n--\ndrivers/tee/tstee/core.c=242=static int tstee_shm_register(struct tee_context *ctx, struct tee_shm *shm,\n--\ndrivers/tee/tstee/core.c-289-\tif (rc) {\ndrivers/tee/tstee/core.c:290:\t\t(void)ffa_dev-\u003eops-\u003emem_ops-\u003ememory_reclaim(shm-\u003esec_world_id,\ndrivers/tee/tstee/core.c-291-\t\t\t\t\t\t\t 0);\n--\ndrivers/tee/tstee/core.c-299-\t\t\tffa_args[TS_RPC_RETRIEVE_MEM_RPC_STATUS]);\ndrivers/tee/tstee/core.c:300:\t\tffa_dev-\u003eops-\u003emem_ops-\u003ememory_reclaim(shm-\u003esec_world_id, 0);\ndrivers/tee/tstee/core.c-301-\t\treturn -EINVAL;\n--\ndrivers/tee/tstee/core.c=307=static int tstee_shm_unregister(struct tee_context *ctx, struct tee_shm *shm)\n--\ndrivers/tee/tstee/core.c-334-\ndrivers/tee/tstee/core.c:335:\trc = ffa_dev-\u003eops-\u003emem_ops-\u003ememory_reclaim(shm-\u003esec_world_id, 0);\ndrivers/tee/tstee/core.c-336-\n--\ninclude/linux/arm_ffa.h=485=struct ffa_mem_ops {\ninclude/linux/arm_ffa.h:486:\tint (*memory_reclaim)(u64 g_handle, u32 flags);\ninclude/linux/arm_ffa.h-487-\tint (*memory_share)(struct ffa_mem_ops_args *args);\n--\ninclude/linux/kvm_host.h=2454=static inline bool kvm_arch_no_poll(struct kvm_vcpu *vcpu)\n--\ninclude/linux/kvm_host.h-2459-\ninclude/linux/kvm_host.h:2460:void kvm_arch_guest_memory_reclaimed(struct kvm *kvm);\ninclude/linux/kvm_host.h-2461-\n--\nmm/memcontrol.c=4967=static ssize_t memory_oom_group_write(struct kernfs_open_file *of,\n--\nmm/memcontrol.c-4988-\nmm/memcontrol.c:4989:static ssize_t memory_reclaim(struct kernfs_open_file *of, char *buf,\nmm/memcontrol.c-4990-\t\t\t size_t nbytes, loff_t off)\n--\nmm/memcontrol.c=5002=static struct cftype memory_files[] = {\n--\nmm/memcontrol.c-5070-\t\t.flags = CFTYPE_NS_DELEGATABLE,\nmm/memcontrol.c:5071:\t\t.write = memory_reclaim,\nmm/memcontrol.c-5072-\t},\n--\nsound/soc/intel/avs/messages.c=391=int avs_ipc_get_fw_config(struct avs_dev *adev, struct avs_fw_cfg *cfg)\n--\nsound/soc/intel/avs/messages.c-418-\t\tcase AVS_FW_CFG_MEMORY_RECLAIMED:\nsound/soc/intel/avs/messages.c:419:\t\t\tcfg-\u003ememory_reclaimed = *tlv-\u003evalue;\nsound/soc/intel/avs/messages.c-420-\t\t\tbreak;\n--\nsound/soc/intel/avs/messages.h=460=struct avs_fw_cfg {\nsound/soc/intel/avs/messages.h-461-\tstruct avs_fw_version fw_version;\nsound/soc/intel/avs/messages.h:462:\tu32 memory_reclaimed;\nsound/soc/intel/avs/messages.h-463-\tu32 slow_clock_freq_hz;\n--\nvirt/kvm/kvm_main.c=155=static DEFINE_PER_CPU(cpumask_var_t, cpu_kick_mask);\nvirt/kvm/kvm_main.c-156-\nvirt/kvm/kvm_main.c:157:__weak void kvm_arch_guest_memory_reclaimed(struct kvm *kvm)\nvirt/kvm/kvm_main.c-158-{\n--\nvirt/kvm/kvm_main.c=341=static void kvm_flush_shadow_all(struct kvm *kvm)\n--\nvirt/kvm/kvm_main.c-343-\tkvm_arch_flush_shadow_all(kvm);\nvirt/kvm/kvm_main.c:344:\tkvm_arch_guest_memory_reclaimed(kvm);\nvirt/kvm/kvm_main.c-345-}\n--\nvirt/kvm/kvm_main.c=721=static int kvm_mmu_notifier_invalidate_range_start(struct mmu_notifier *mn,\n--\nvirt/kvm/kvm_main.c-765-\tif (kvm_handle_hva_range(kvm, \u0026hva_range).found_memslot)\nvirt/kvm/kvm_main.c:766:\t\tkvm_arch_guest_memory_reclaimed(kvm);\nvirt/kvm/kvm_main.c-767-\n--\nvirt/kvm/kvm_main.c=1798=static void kvm_invalidate_memslot(struct kvm *kvm,\n--\nvirt/kvm/kvm_main.c-1824-\tkvm_arch_flush_shadow_memslot(kvm, old);\nvirt/kvm/kvm_main.c:1825:\tkvm_arch_guest_memory_reclaimed(kvm);\nvirt/kvm/kvm_main.c-1826-\n"
} |
| 7/2 | 2026/07/24 09:18 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 8470 output: 30 thoughts: 32 Thoughts: Okay, here's my take on those thoughts, tailored for an expert audience: **Memory Reclaim and Control Groups: A Quick Check** Alright, *memory_reclaim*. That's a core function, usually tucked away in the heart of the memory management subsystem. Specifically, it's defined in `mm/memcontrol.c`. Now, my initial thought is: what's the connection to control groups (cgroups)? `memory_reclaim` is critical for managing memory pressures across the system, and cgroups, of course, provide fine-grained control over resource allocation, including memory. So, is `CONFIG_MEMCG` directly involved here? I'm betting there's a dependency, given the file location, but let's confirm. |
| 8/2 | 2026/07/24 09:18 | tool | grepper |
0mArgs:{
"Expression": "memory_reclaim",
"PathPrefix": "mm/memcontrol.c"
}Results: {
"Output": "mm/memcontrol.c=4967=static ssize_t memory_oom_group_write(struct kernfs_open_file *of,\n--\nmm/memcontrol.c-4988-\nmm/memcontrol.c:4989:static ssize_t memory_reclaim(struct kernfs_open_file *of, char *buf,\nmm/memcontrol.c-4990-\t\t\t size_t nbytes, loff_t off)\n--\nmm/memcontrol.c=5002=static struct cftype memory_files[] = {\n--\nmm/memcontrol.c-5070-\t\t.flags = CFTYPE_NS_DELEGATABLE,\nmm/memcontrol.c:5071:\t\t.write = memory_reclaim,\nmm/memcontrol.c-5072-\t},\n"
} |
| 9/2 | 2026/07/24 09:18 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 8911 output: 27 thoughts: 17 Thoughts: Here's a summary of my thought process: **Investigating Conditional Compilation of `mm/memcontrol.c`** Alright, let's get down to brass tacks. I need to quickly determine whether the `mm/memcontrol.c` file is being compiled conditionally within this particular kernel build. I know the general location, so now I need to figure out if there's a configuration flag or a specific `ifdef` block that controls its inclusion. I'll need to rapidly examine the relevant build configuration files or potentially the Kbuild system to assess its dependency. Essentially, is this module always compiled, or does it depend on certain kernel features being enabled? My goal is to determine the compile-time behaviour quickly. |
| 10/2 | 2026/07/24 09:18 | tool | grepper |
0mArgs:{
"Expression": "memcontrol.o",
"PathPrefix": "mm/Makefile"
}Results: {
"Output": "mm/Makefile=27=KCOV_INSTRUMENT_kmemleak.o := n\nmm/Makefile:28:KCOV_INSTRUMENT_memcontrol.o := n\nmm/Makefile-29-KCOV_INSTRUMENT_memcontrol-v1.o := n\n--\nmm/Makefile=104=obj-$(CONFIG_MEMCG_V1) += memcontrol-v1.o\nmm/Makefile:105:obj-$(CONFIG_MEMCG) += memcontrol.o vmpressure.o\nmm/Makefile-106-ifdef CONFIG_BPF_SYSCALL\nmm/Makefile:107:obj-$(CONFIG_MEMCG) += bpf_memcontrol.o\nmm/Makefile-108-endif\n"
} |
| 11/2 | 2026/07/24 09:18 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 9297 output: 30 thoughts: 30 Thoughts: Okay, here's my interpretation of those thoughts, tailored for an expert audience, and delivered as a first-person account: **Memory Control Groups and Reclaim** Right, so, first and foremost, I'm absolutely certain that `CONFIG_MEMCG` needs to be enabled. No question about it. It's the foundation we're working from, and without it, we're not even having this conversation. But that brings me to the core concern. I'm wondering about `reclaim_store` in `mm/vmscan.c`. How's that interacting with the memory control group setup? Specifically, I need to understand if the memory reclaim logic is correctly accounting for and respecting the limits enforced by the memory cgroups. Is it properly associating reclaimed pages with the correct cgroup? Are there any potential leaks or bypasses? It's that subtle intersection of the reclaim strategies and the cgroup accounting that always keeps me on my toes. It’s the kind of area where seemingly minor oversights can lead to pretty significant problems down the line, and I need to make sure we're not inadvertently undermining the whole point of `memcg`. |
| 12/2 | 2026/07/24 09:18 | tool | grepper |
0mArgs:{
"Expression": "reclaim_store",
"PathPrefix": "mm/vmscan.c"
}Results: {
"Output": "mm/vmscan.c=8032=EXPORT_SYMBOL_GPL(check_move_unevictable_folios);\n--\nmm/vmscan.c-8034-#if defined(CONFIG_SYSFS) \u0026\u0026 defined(CONFIG_NUMA)\nmm/vmscan.c:8035:static ssize_t reclaim_store(struct device *dev,\nmm/vmscan.c-8036-\t\t\t struct device_attribute *attr,\n"
} |
| 13/2 | 2026/07/24 09:18 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 9723 output: 33 thoughts: 59 Thoughts: **My Configuration Verification** Okay, so I'm looking at this and it's clear: this functionality hinges on having `CONFIG_SYSFS` and `CONFIG_NUMA` enabled. That's a solid starting point for investigation and potential deployment. I'll make a mental note that enabling `CONFIG_MEMCG` along with `CONFIG_NUMA` would be a good strategy to pursue. They seem like logical companions. Next, I need to confirm the implementation. I'll jump into `mm/vmscan.c` and specifically check the `user_proactive_reclaim` function. I'll need to see precisely how it interacts with the configurations to understand the behavior. |
| 14/2 | 2026/07/24 09:18 | tool | grepper |
0mArgs:{
"Expression": "user_proactive_reclaim",
"PathPrefix": "mm/vmscan.c"
}Results: {
"Output": "mm/vmscan.c=7887=static const match_table_t tokens = {\n--\nmm/vmscan.c-7892-\nmm/vmscan.c:7893:int user_proactive_reclaim(char *buf,\nmm/vmscan.c-7894-\t\t\t struct mem_cgroup *memcg, pg_data_t *pgdat)\n--\nmm/vmscan.c=8035=static ssize_t reclaim_store(struct device *dev,\n--\nmm/vmscan.c-8040-\nmm/vmscan.c:8041:\tret = user_proactive_reclaim((char *)buf, NULL, NODE_DATA(nid));\nmm/vmscan.c-8042-\treturn ret ? ret : count;\n"
} |
| 15/2 | 2026/07/24 09:18 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 10172 output: 32 thoughts: 13 Thoughts: Okay, here's my interpretation of that thought process, tailored for an expert audience, and written in the first person: **Conditional Compilation Conundrums** Alright, so I'm digging into this `user_proactive_reclaim` function, and the immediate question that pops into my head is: *Is it compiled conditionally?* I need to understand if this is something that’s always present in the build, or if its inclusion is dependent on some preprocessor flag, configuration setting, or even a specific target platform. The implications are huge, you know. If it *is* conditional, I need to know the conditions. That will inform whether I need to worry about the side effects when looking at the whole system behavior. A conditionally compiled function impacts the range of execution. I need to figure out where that conditional compilation resides, and the conditions under which it compiles. |
| 16/2 | 2026/07/24 09:18 | tool | grepper |
0mArgs:{
"Expression": "user_proactive_reclaim",
"PathPrefix": "mm/internal.h"
}Results: {
"Output": "mm/internal.h=624=extern void reclaim_throttle(pg_data_t *pgdat, enum vmscan_throttle_state reason);\nmm/internal.h:625:int user_proactive_reclaim(char *buf,\nmm/internal.h-626-\t\t\t struct mem_cgroup *memcg, pg_data_t *pgdat);\n"
} |
| 17/2 | 2026/07/24 09:18 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 10503 output: 35 thoughts: 30 Thoughts: Okay, here's my summary, taking the perspective of someone deeply familiar with kernel development and memory management, focusing on the specific thought process presented: **Checking for Proactive Reclaim Guards** Right, let's get down to brass tacks. I'm thinking, "Let's make sure we haven't got any conditional compilation guarding the 'user_proactive_reclaim' mechanism in 'mm/vmscan.c'." I need to quickly verify if there are any `#ifdef` directives surrounding that feature. It's crucial, obviously, because any conditional compilation there would totally change how it behaves in different build configurations, and I need to keep that behavior in mind. Gotta make sure it's consistently enabled or disabled as I expect. It's a quick check but a fundamental one before I dig deeper into anything related to memory reclaim. |
| 18/2 | 2026/07/24 09:18 | tool | read-file |
0mArgs:{
"File": "mm/vmscan.c",
"FirstLine": 7880,
"LineCount": 50
}Results: {
"Contents": "7880:\t#endif\n7881:\t\n7882:\tenum {\n7883:\t\tMEMORY_RECLAIM_SWAPPINESS = 0,\n7884:\t\tMEMORY_RECLAIM_SWAPPINESS_MAX,\n7885:\t\tMEMORY_RECLAIM_NULL,\n7886:\t};\n7887:\tstatic const match_table_t tokens = {\n7888:\t\t{ MEMORY_RECLAIM_SWAPPINESS, \"swappiness=%d\"},\n7889:\t\t{ MEMORY_RECLAIM_SWAPPINESS_MAX, \"swappiness=max\"},\n7890:\t\t{ MEMORY_RECLAIM_NULL, NULL },\n7891:\t};\n7892:\t\n7893:\tint user_proactive_reclaim(char *buf,\n7894:\t\t\t\t struct mem_cgroup *memcg, pg_data_t *pgdat)\n7895:\t{\n7896:\t\tunsigned int nr_retries = MAX_RECLAIM_RETRIES;\n7897:\t\tunsigned long nr_to_reclaim, nr_reclaimed = 0;\n7898:\t\tint swappiness = -1;\n7899:\t\tchar *old_buf, *start;\n7900:\t\tsubstring_t args[MAX_OPT_ARGS];\n7901:\t\tgfp_t gfp_mask = GFP_KERNEL;\n7902:\t\n7903:\t\tif (!buf || (!memcg \u0026\u0026 !pgdat) || (memcg \u0026\u0026 pgdat))\n7904:\t\t\treturn -EINVAL;\n7905:\t\n7906:\t\tbuf = strstrip(buf);\n7907:\t\n7908:\t\told_buf = buf;\n7909:\t\tnr_to_reclaim = memparse(buf, \u0026buf) / PAGE_SIZE;\n7910:\t\tif (buf == old_buf)\n7911:\t\t\treturn -EINVAL;\n7912:\t\n7913:\t\tbuf = strstrip(buf);\n7914:\t\n7915:\t\twhile ((start = strsep(\u0026buf, \" \")) != NULL) {\n7916:\t\t\tif (!strlen(start))\n7917:\t\t\t\tcontinue;\n7918:\t\t\tswitch (match_token(start, tokens, args)) {\n7919:\t\t\tcase MEMORY_RECLAIM_SWAPPINESS:\n7920:\t\t\t\tif (match_int(\u0026args[0], \u0026swappiness))\n7921:\t\t\t\t\treturn -EINVAL;\n7922:\t\t\t\tif (swappiness \u003c MIN_SWAPPINESS ||\n7923:\t\t\t\t swappiness \u003e MAX_SWAPPINESS)\n7924:\t\t\t\t\treturn -EINVAL;\n7925:\t\t\t\tbreak;\n7926:\t\t\tcase MEMORY_RECLAIM_SWAPPINESS_MAX:\n7927:\t\t\t\tswappiness = SWAPPINESS_ANON_ONLY;\n7928:\t\t\t\tbreak;\n7929:\t\t\tdefault:\n"
} |
| 19/2 | 2026/07/24 09:18 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 11516 output: 31 thoughts: 167 Thoughts: **Analyzing Memory Reclaim Mechanisms** Okay, let's break this down. It seems I'm dealing with several functions related to memory reclaim. The critical first observation is that `user_proactive_reclaim` isn't guarded by any `#ifdef` directives. That's immediately interesting, because it suggests a more direct control or impact. Conversely, `reclaim_store` is conditionally compiled under the `CONFIG_SYSFS` and `CONFIG_NUMA` flags. This indicates its functionality is tied to the presence of a sysfs interface and NUMA architecture, which suggests this is somehow involved with the presentation of memory reclaim statistics, or perhaps even some control mechanism. And finally, `memory_reclaim` is located in `mm/memcontrol.c` and is conditionalized by `CONFIG_MEMCG`. So, the primary configuration options that are relevant here are `MEMCG` (for control groups, which I'm familiar with) and `NUMA` (Non-Uniform Memory Access). Now, to get a better handle on the scope, I want to zero in on the functions I need to keep in focus: `user_proactive_reclaim`, `reclaim_store`, `memory_reclaim`, `get_scan_count`, `get_swappiness`, and `get_nr_to_scan`. These are clearly the core components of interest. I'll need to understand their relationships and how they interact to understand how the changes affect the system. Before I go further, though, I'll quickly check for any other functions that might have been modified in conjunction with the primary ones. Ah, yes, `__node_reclaim` has also been modified. This implies that the changes might affect the node-level reclaim as well. This additional data point is extremely important. It means I have to look beyond a single function, the modifications might be system-wide. |
| 20/2 | 2026/07/24 09:18 | tool | grepper |
0mArgs:{
"Expression": "__node_reclaim",
"PathPrefix": "mm/vmscan.c"
}Results: {
"Output": "mm/vmscan.c=7736=static unsigned long node_pagecache_reclaimable(struct pglist_data *pgdat)\n--\nmm/vmscan.c-7767- */\nmm/vmscan.c:7768:static unsigned long __node_reclaim(struct pglist_data *pgdat,\nmm/vmscan.c-7769-\t\t\t\t unsigned long nr_pages,\n--\nmm/vmscan.c=7811=int node_reclaim(struct pglist_data *pgdat, gfp_t gfp_mask, unsigned int order)\n--\nmm/vmscan.c-7859-\nmm/vmscan.c:7860:\tret = __node_reclaim(pgdat, nr_pages, \u0026sc) \u003e= nr_pages;\nmm/vmscan.c-7861-\tclear_bit_unlock(PGDAT_RECLAIM_LOCKED, \u0026pgdat-\u003eflags);\n--\nmm/vmscan.c-7872-\nmm/vmscan.c:7873:static unsigned long __node_reclaim(struct pglist_data *pgdat,\nmm/vmscan.c-7874-\t\t\t\t unsigned long nr_pages,\n--\nmm/vmscan.c=7893=int user_proactive_reclaim(char *buf,\n--\nmm/vmscan.c-7974-\nmm/vmscan.c:7975:\t\t\treclaimed = __node_reclaim(pgdat, batch_size, \u0026sc);\nmm/vmscan.c-7976-\t\t\tclear_bit_unlock(PGDAT_RECLAIM_LOCKED, \u0026pgdat-\u003eflags);\n"
} |
| 21/2 | 2026/07/24 09:18 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 12537 output: 189 thoughts: 294 Thoughts: **Analyzing the Scope of a Memory Reclaim Patch** Okay, so the code definitely touches `__node_reclaim`. That's a key starting point. I need to understand the full implications. Looking at the focus symbols, I see: * `user_proactive_reclaim` * `reclaim_store` * `memory_reclaim` * `get_scan_count` * `get_swappiness` * `get_nr_to_scan` * `__node_reclaim` Wait a minute, `get_scan_count`, `get_swappiness`, and `get_nr_to_scan`... those are static functions defined within `mm/vmscan.c`. They're integral parts of the page reclaim logic, which means this patch is digging deep into the core scanning functionality. And, of course, `__node_reclaim` itself is also static. I need to make sure I don't miss anything. Okay, let's double-check `memory_reclaim`. Ah, yes, it's static too, but found in `mm/memcontrol.c`. This suggests a broader impact, likely involving memory control groups, which I suspected anyway. This patch is tied to the `MEMCG` and `NUMA` configurations, which reinforces that it’s modifying interactions between the memory management and NUMA architectures. The core issue seems to be a bug in proactive memory reclaim: under specific scenarios (swappiness set to max with no swap available), it was wrongly evicting file pages when it should have been solely focusing on anonymous pages. It's touching some major code paths in `mm/vmscan.c` and `mm/memcontrol.c`, meaning this is a functional change, and can even be triggered from userspace using cgroup `memory.reclaim` or sysfs node `reclaim` attributes. I think I've got a handle on the scope. Time to run `set-results` tool now. |
| 22/2 | 2026/07/24 09:18 | tool | set-results |
0mArgs:{
"EnableConfigs": [
"MEMCG",
"NUMA"
],
"FocusSymbols": [
"user_proactive_reclaim",
"reclaim_store",
"memory_reclaim",
"get_scan_count",
"get_swappiness",
"get_nr_to_scan",
"__node_reclaim"
],
"Reasoning": "The patch fixes a bug in proactive memory reclaim where anonymous memory only reclaim (swappiness=max) could incorrectly fall back to evicting file pages when anonymous pages cannot be reclaimed (e.g. no swap). It modifies core memory management logic in mm/vmscan.c and mm/memcontrol.c. This is a functional change that can be triggered from userspace via cgroup memory.reclaim or sysfs node reclaim attributes.",
"WorthFuzzing": true
}Results: {
"EnableConfigs": [
"MEMCG",
"NUMA"
],
"FocusSymbols": [
"user_proactive_reclaim",
"reclaim_store",
"memory_reclaim",
"get_scan_count",
"get_swappiness",
"get_nr_to_scan",
"__node_reclaim"
],
"Reasoning": "The patch fixes a bug in proactive memory reclaim where anonymous memory only reclaim (swappiness=max) could incorrectly fall back to evicting file pages when anonymous pages cannot be reclaimed (e.g. no swap). It modifies core memory management logic in mm/vmscan.c and mm/memcontrol.c. This is a functional change that can be triggered from userspace via cgroup memory.reclaim or sysfs node reclaim attributes.",
"WorthFuzzing": true
} |
| Total Calls | Total Tokens | Avg Tokens | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|
| Total Calls | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|