AI Trajectory


Trajectory: (Expand/Collapse All)
Seq Timestamp Type Name Duration
0/0 2026/07/24 14:15 flow patch-triage
0m Args:
null

Results:
{
  "EnableConfigs": [
    "BPF_SYSCALL",
    "INET",
    "NET"
  ],
  "FocusSymbols": [
    "bpf_sk_lookup_full_sk",
    "bpf_sk_release",
    "sk_select_reuseport",
    "sock_map_lookup",
    "sock_hash_lookup"
  ],
  "Reasoning": "The patch modifies socket reference counting logic in BPF socket lookup helpers (e.g., bpf_sk_lookup_full_sk, bpf_sk_release) and sockmap lookup functions (sock_map_lookup, sock_hash_lookup). It ensures that a reference is always taken for sockets returned by lookups and properly released. This is a functional change in core BPF networking logic that can be reached via BPF programs calling these helpers or interacting with sockmaps.",
  "WorthFuzzing": true
}

1/1 2026/07/24 14:15 action read-patch-diff
0m Args:
null

Results:
{
  "PatchDiff": "commit 454e567e0c1a626fa82580dde5d594e87550ed21\nAuthor: syz-cluster \u003ctriage@syzkaller.com\u003e\nDate:   Fri Jul 24 14:15:22 2026 +0000\n\n    syz-cluster: applied patch under review\n\ndiff --git a/net/core/filter.c b/net/core/filter.c\nindex b446aa8be5c375..4bc0b59668fae5 100644\n--- a/net/core/filter.c\n+++ b/net/core/filter.c\n@@ -7027,6 +7027,13 @@ static struct sock *sk_lookup(struct net *net, struct bpf_sock_tuple *tuple,\n \t\tWARN_ONCE(1, \"Found non-RCU, unreferenced socket!\");\n \t\tsk = NULL;\n \t}\n+\n+\t/* Always take a reference, even if the lookup skipped one;\n+\t * bpf_sk_release() always puts one.\n+\t */\n+\tif (sk \u0026\u0026 !refcounted \u0026\u0026 !refcount_inc_not_zero(\u0026sk-\u003esk_refcnt))\n+\t\tsk = NULL;\n+\n \treturn sk;\n }\n \n@@ -7074,6 +7081,31 @@ __bpf_skc_lookup(struct sk_buff *skb, struct bpf_sock_tuple *tuple, u32 len,\n \treturn sk;\n }\n \n+static struct sock *\n+bpf_sk_lookup_full_sk(struct sock *sk)\n+{\n+\tstruct sock *sk2 = sk_to_full_sk(sk);\n+\n+\t/* sk_to_full_sk() may return sk-\u003ersk_listener, make sure the original\n+\t * sk sock refcnt is decremented to prevent a request_sock leak.\n+\t */\n+\tif (sk2 != sk) {\n+\t\tsock_gen_put(sk);\n+\t\tif (unlikely(sk2 \u0026\u0026 !sock_flag(sk2, SOCK_RCU_FREE))) {\n+\t\t\tWARN_ONCE(1, \"Found non-RCU, unreferenced socket!\");\n+\t\t\treturn NULL;\n+\t\t}\n+\t\t/* sk2 is RCU-free, but take a reference anyway;\n+\t\t * bpf_sk_release() puts.\n+\t\t */\n+\t\tif (sk2 \u0026\u0026 !refcount_inc_not_zero(\u0026sk2-\u003esk_refcnt))\n+\t\t\tsk2 = NULL;\n+\t\tsk = sk2;\n+\t}\n+\n+\treturn sk;\n+}\n+\n static struct sock *\n __bpf_sk_lookup(struct sk_buff *skb, struct bpf_sock_tuple *tuple, u32 len,\n \t\tstruct net *caller_net, u32 ifindex, u8 proto, u64 netns_id,\n@@ -7083,22 +7115,8 @@ __bpf_sk_lookup(struct sk_buff *skb, struct bpf_sock_tuple *tuple, u32 len,\n \t\t\t\t\t   ifindex, proto, netns_id, flags,\n \t\t\t\t\t   sdif);\n \n-\tif (sk) {\n-\t\tstruct sock *sk2 = sk_to_full_sk(sk);\n-\n-\t\t/* sk_to_full_sk() may return (sk)-\u003ersk_listener, so make sure the original sk\n-\t\t * sock refcnt is decremented to prevent a request_sock leak.\n-\t\t */\n-\t\tif (sk2 != sk) {\n-\t\t\tsock_gen_put(sk);\n-\t\t\t/* Ensure there is no need to bump sk2 refcnt */\n-\t\t\tif (unlikely(sk2 \u0026\u0026 !sock_flag(sk2, SOCK_RCU_FREE))) {\n-\t\t\t\tWARN_ONCE(1, \"Found non-RCU, unreferenced socket!\");\n-\t\t\t\treturn NULL;\n-\t\t\t}\n-\t\t\tsk = sk2;\n-\t\t}\n-\t}\n+\tif (sk)\n+\t\tsk = bpf_sk_lookup_full_sk(sk);\n \n \treturn sk;\n }\n@@ -7129,22 +7147,8 @@ bpf_sk_lookup(struct sk_buff *skb, struct bpf_sock_tuple *tuple, u32 len,\n \tstruct sock *sk = bpf_skc_lookup(skb, tuple, len, proto, netns_id,\n \t\t\t\t\t flags);\n \n-\tif (sk) {\n-\t\tstruct sock *sk2 = sk_to_full_sk(sk);\n-\n-\t\t/* sk_to_full_sk() may return (sk)-\u003ersk_listener, so make sure the original sk\n-\t\t * sock refcnt is decremented to prevent a request_sock leak.\n-\t\t */\n-\t\tif (sk2 != sk) {\n-\t\t\tsock_gen_put(sk);\n-\t\t\t/* Ensure there is no need to bump sk2 refcnt */\n-\t\t\tif (unlikely(sk2 \u0026\u0026 !sock_flag(sk2, SOCK_RCU_FREE))) {\n-\t\t\t\tWARN_ONCE(1, \"Found non-RCU, unreferenced socket!\");\n-\t\t\t\treturn NULL;\n-\t\t\t}\n-\t\t\tsk = sk2;\n-\t\t}\n-\t}\n+\tif (sk)\n+\t\tsk = bpf_sk_lookup_full_sk(sk);\n \n \treturn sk;\n }\n@@ -7280,7 +7284,7 @@ static const struct bpf_func_proto bpf_tc_sk_lookup_udp_proto = {\n \n BPF_CALL_1(bpf_sk_release, struct sock *, sk)\n {\n-\tif (sk \u0026\u0026 sk_is_refcounted(sk))\n+\tif (sk)\n \t\tsock_gen_put(sk);\n \treturn 0;\n }\n@@ -11572,11 +11576,13 @@ BPF_CALL_4(sk_select_reuseport, struct sk_reuseport_kern *, reuse_kern,\n \tbool is_sockarray = map-\u003emap_type == BPF_MAP_TYPE_REUSEPORT_SOCKARRAY;\n \tstruct sock_reuseport *reuse;\n \tstruct sock *selected_sk;\n-\tint err;\n+\tint err = 0;\n \n \tselected_sk = map-\u003eops-\u003emap_lookup_elem(map, key);\n \tif (!selected_sk)\n \t\treturn -ENOENT;\n+\tif (!is_sockarray)\n+\t\tsock_put(selected_sk);\n \n \treuse = rcu_dereference(selected_sk-\u003esk_reuseport_cb);\n \tif (!reuse) {\n@@ -11606,13 +11612,7 @@ BPF_CALL_4(sk_select_reuseport, struct sk_reuseport_kern *, reuse_kern,\n \t}\n \n \treuse_kern-\u003eselected_sk = selected_sk;\n-\n-\treturn 0;\n error:\n-\t/* Lookup in sock_map can return TCP ESTABLISHED sockets. */\n-\tif (sk_is_refcounted(selected_sk))\n-\t\tsock_put(selected_sk);\n-\n \treturn err;\n }\n \ndiff --git a/net/core/sock_map.c b/net/core/sock_map.c\nindex 9efbd8ca7db832..ae18dc4d60f915 100644\n--- a/net/core/sock_map.c\n+++ b/net/core/sock_map.c\n@@ -390,10 +390,8 @@ static void *sock_map_lookup(struct bpf_map *map, void *key)\n \tstruct sock *sk;\n \n \tsk = __sock_map_lookup_elem(map, *(u32 *)key);\n-\tif (!sk)\n-\t\treturn NULL;\n-\tif (sk_is_refcounted(sk) \u0026\u0026 !refcount_inc_not_zero(\u0026sk-\u003esk_refcnt))\n-\t\treturn NULL;\n+\tif (sk)\n+\t\tsock_hold(sk);\n \treturn sk;\n }\n \n@@ -1216,10 +1214,8 @@ static void *sock_hash_lookup(struct bpf_map *map, void *key)\n \tstruct sock *sk;\n \n \tsk = __sock_hash_lookup_elem(map, key);\n-\tif (!sk)\n-\t\treturn NULL;\n-\tif (sk_is_refcounted(sk) \u0026\u0026 !refcount_inc_not_zero(\u0026sk-\u003esk_refcnt))\n-\t\treturn NULL;\n+\tif (sk)\n+\t\tsock_hold(sk);\n \treturn sk;\n }\n \n"
}

2/1 2026/07/24 14:15 agent patch-evaluator
0m Model:
best-expensive

Args:
null

Results:
{
  "EnableConfigs": [
    "BPF_SYSCALL",
    "INET",
    "NET"
  ],
  "FocusSymbols": [
    "bpf_sk_lookup_full_sk",
    "bpf_sk_release",
    "sk_select_reuseport",
    "sock_map_lookup",
    "sock_hash_lookup"
  ],
  "Reasoning": "The patch modifies socket reference counting logic in BPF socket lookup helpers (e.g., bpf_sk_lookup_full_sk, bpf_sk_release) and sockmap lookup functions (sock_map_lookup, sock_hash_lookup). It ensures that a reference is always taken for sockets returned by lookups and properly released. This is a functional change in core BPF networking logic that can be reached via BPF programs calling these helpers or interacting with sockmaps.",
  "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 454e567e0c1a626fa82580dde5d594e87550ed21
Author: syz-cluster <triage@syzkaller.com>
Date:   Fri Jul 24 14:15:22 2026 +0000

    syz-cluster: applied patch under review

diff --git a/net/core/filter.c b/net/core/filter.c
index b446aa8be5c375..4bc0b59668fae5 100644
--- a/net/core/filter.c
+++ b/net/core/filter.c
@@ -7027,6 +7027,13 @@ static struct sock *sk_lookup(struct net *net, struct bpf_sock_tuple *tuple,
 		WARN_ONCE(1, "Found non-RCU, unreferenced socket!");
 		sk = NULL;
 	}
+
+	/* Always take a reference, even if the lookup skipped one;
+	 * bpf_sk_release() always puts one.
+	 */
+	if (sk && !refcounted && !refcount_inc_not_zero(&sk->sk_refcnt))
+		sk = NULL;
+
 	return sk;
 }
 
@@ -7074,6 +7081,31 @@ __bpf_skc_lookup(struct sk_buff *skb, struct bpf_sock_tuple *tuple, u32 len,
 	return sk;
 }
 
+static struct sock *
+bpf_sk_lookup_full_sk(struct sock *sk)
+{
+	struct sock *sk2 = sk_to_full_sk(sk);
+
+	/* sk_to_full_sk() may return sk->rsk_listener, make sure the original
+	 * sk sock refcnt is decremented to prevent a request_sock leak.
+	 */
+	if (sk2 != sk) {
+		sock_gen_put(sk);
+		if (unlikely(sk2 && !sock_flag(sk2, SOCK_RCU_FREE))) {
+			WARN_ONCE(1, "Found non-RCU, unreferenced socket!");
+			return NULL;
+		}
+		/* sk2 is RCU-free, but take a reference anyway;
+		 * bpf_sk_release() puts.
+		 */
+		if (sk2 && !refcount_inc_not_zero(&sk2->sk_refcnt))
+			sk2 = NULL;
+		sk = sk2;
+	}
+
+	return sk;
+}
+
 static struct sock *
 __bpf_sk_lookup(struct sk_buff *skb, struct bpf_sock_tuple *tuple, u32 len,
 		struct net *caller_net, u32 ifindex, u8 proto, u64 netns_id,
@@ -7083,22 +7115,8 @@ __bpf_sk_lookup(struct sk_buff *skb, struct bpf_sock_tuple *tuple, u32 len,
 					   ifindex, proto, netns_id, flags,
 					   sdif);
 
-	if (sk) {
-		struct sock *sk2 = sk_to_full_sk(sk);
-
-		/* sk_to_full_sk() may return (sk)->rsk_listener, so make sure the original sk
-		 * sock refcnt is decremented to prevent a request_sock leak.
-		 */
-		if (sk2 != sk) {
-			sock_gen_put(sk);
-			/* Ensure there is no need to bump sk2 refcnt */
-			if (unlikely(sk2 && !sock_flag(sk2, SOCK_RCU_FREE))) {
-				WARN_ONCE(1, "Found non-RCU, unreferenced socket!");
-				return NULL;
-			}
-			sk = sk2;
-		}
-	}
+	if (sk)
+		sk = bpf_sk_lookup_full_sk(sk);
 
 	return sk;
 }
@@ -7129,22 +7147,8 @@ bpf_sk_lookup(struct sk_buff *skb, struct bpf_sock_tuple *tuple, u32 len,
 	struct sock *sk = bpf_skc_lookup(skb, tuple, len, proto, netns_id,
 					 flags);
 
-	if (sk) {
-		struct sock *sk2 = sk_to_full_sk(sk);
-
-		/* sk_to_full_sk() may return (sk)->rsk_listener, so make sure the original sk
-		 * sock refcnt is decremented to prevent a request_sock leak.
-		 */
-		if (sk2 != sk) {
-			sock_gen_put(sk);
-			/* Ensure there is no need to bump sk2 refcnt */
-			if (unlikely(sk2 && !sock_flag(sk2, SOCK_RCU_FREE))) {
-				WARN_ONCE(1, "Found non-RCU, unreferenced socket!");
-				return NULL;
-			}
-			sk = sk2;
-		}
-	}
+	if (sk)
+		sk = bpf_sk_lookup_full_sk(sk);
 
 	return sk;
 }
@@ -7280,7 +7284,7 @@ static const struct bpf_func_proto bpf_tc_sk_lookup_udp_proto = {
 
 BPF_CALL_1(bpf_sk_release, struct sock *, sk)
 {
-	if (sk && sk_is_refcounted(sk))
+	if (sk)
 		sock_gen_put(sk);
 	return 0;
 }
@@ -11572,11 +11576,13 @@ BPF_CALL_4(sk_select_reuseport, struct sk_reuseport_kern *, reuse_kern,
 	bool is_sockarray = map->map_type == BPF_MAP_TYPE_REUSEPORT_SOCKARRAY;
 	struct sock_reuseport *reuse;
 	struct sock *selected_sk;
-	int err;
+	int err = 0;
 
 	selected_sk = map->ops->map_lookup_elem(map, key);
 	if (!selected_sk)
 		return -ENOENT;
+	if (!is_sockarray)
+		sock_put(selected_sk);
 
 	reuse = rcu_dereference(selected_sk->sk_reuseport_cb);
 	if (!reuse) {
@@ -11606,13 +11612,7 @@ BPF_CALL_4(sk_select_reuseport, struct sk_reuseport_kern *, reuse_kern,
 	}
 
 	reuse_kern->selected_sk = selected_sk;
-
-	return 0;
 error:
-	/* Lookup in sock_map can return TCP ESTABLISHED sockets. */
-	if (sk_is_refcounted(selected_sk))
-		sock_put(selected_sk);
-
 	return err;
 }
 
diff --git a/net/core/sock_map.c b/net/core/sock_map.c
index 9efbd8ca7db832..ae18dc4d60f915 100644
--- a/net/core/sock_map.c
+++ b/net/core/sock_map.c
@@ -390,10 +390,8 @@ static void *sock_map_lookup(struct bpf_map *map, void *key)
 	struct sock *sk;
 
 	sk = __sock_map_lookup_elem(map, *(u32 *)key);
-	if (!sk)
-		return NULL;
-	if (sk_is_refcounted(sk) && !refcount_inc_not_zero(&sk->sk_refcnt))
-		return NULL;
+	if (sk)
+		sock_hold(sk);
 	return sk;
 }
 
@@ -1216,10 +1214,8 @@ static void *sock_hash_lookup(struct bpf_map *map, void *key)
 	struct sock *sk;
 
 	sk = __sock_hash_lookup_elem(map, key);
-	if (!sk)
-		return NULL;
-	if (sk_is_refcounted(sk) && !refcount_inc_not_zero(&sk->sk_refcnt))
-		return NULL;
+	if (sk)
+		sock_hold(sk);
 	return sk;
 }
 

3/2 2026/07/24 14:15 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 3749
							output: 30
							thoughts: 408
						

Thoughts:
**Analyzing the BPF Socket Reference Management Patch**

Okay, so I'm looking at a patch that's fundamentally altering how socket references are handled within the BPF socket lookup functions. This affects `net/core/filter.c` and `net/core/sock_map.c`, right at the heart of BPF networking logic. The key seems to be a consistent approach to reference counting.

Essentially, the patch forces a reference to be taken on *every* socket returned by `sk_lookup` and `bpf_sk_lookup_full_sk`, and `bpf_sk_release` always *releases* that reference without any conditional checks anymore. This is a subtle but potentially impactful change. Then there are other changes which always call `sock_hold(sk)` on `sock_map_lookup` and `sock_hash_lookup`, and doesn't check `sk_is_refcounted(sk)`.

Function-wise, I need to focus on these specific BPF-related entry points: `sk_lookup`, `bpf_sk_lookup_full_sk`, `__bpf_sk_lookup`, `bpf_sk_lookup`, `bpf_sk_release`, `sk_select_reuseport`, `sock_map_lookup`, and `sock_hash_lookup`. These are all crucial for how sockets are found and managed within the BPF framework.

I need to confirm the relevant configuration options. `CONFIG_BPF_SYSCALL` and `CONFIG_NET` are obvious, and I suspect `CONFIG_BPF_SOCK_ADDR` or something similar, likely in the `net/core/filter.c` and `net/core/sock_map.c` files themselves, are key to understanding the context. I'll need to use my usual tools to pinpoint the exact configuration options.

Overall, this looks like a functional change that aims to solidify the reference counting strategy, potentially improving stability or preventing subtle resource leaks within the BPF socket management. I'll dig into the code more thoroughly to see the direct impact and rationale for these changes.



4/2 2026/07/24 14:15 tool grepper
0m Args:
{
  "Expression": "sk_lookup",
  "PathPrefix": "net/core/filter.c"
}

Results:
{
  "Output": "net/core/filter.c=6979=static const struct bpf_func_proto bpf_lwt_seg6_adjust_srh_proto = {\n--\nnet/core/filter.c-6989-#ifdef CONFIG_INET\nnet/core/filter.c:6990:static struct sock *sk_lookup(struct net *net, struct bpf_sock_tuple *tuple,\nnet/core/filter.c-6991-\t\t\t      int dif, int sdif, u8 family, u8 proto)\n--\nnet/core/filter.c=7044=__bpf_skc_lookup(struct sk_buff *skb, struct bpf_sock_tuple *tuple, u32 len,\n--\nnet/core/filter.c-7070-\t\tnet = caller_net;\nnet/core/filter.c:7071:\t\tsk = sk_lookup(net, tuple, ifindex, sdif, family, proto);\nnet/core/filter.c-7072-\t} else {\n--\nnet/core/filter.c-7075-\t\t\tgoto out;\nnet/core/filter.c:7076:\t\tsk = sk_lookup(net, tuple, ifindex, sdif, family, proto);\nnet/core/filter.c-7077-\t\tput_net(net);\n--\nnet/core/filter.c=7084=static struct sock *\nnet/core/filter.c:7085:bpf_sk_lookup_full_sk(struct sock *sk)\nnet/core/filter.c-7086-{\n--\nnet/core/filter.c=7109=static struct sock *\nnet/core/filter.c:7110:__bpf_sk_lookup(struct sk_buff *skb, struct bpf_sock_tuple *tuple, u32 len,\nnet/core/filter.c-7111-\t\tstruct net *caller_net, u32 ifindex, u8 proto, u64 netns_id,\n--\nnet/core/filter.c-7118-\tif (sk)\nnet/core/filter.c:7119:\t\tsk = bpf_sk_lookup_full_sk(sk);\nnet/core/filter.c-7120-\n--\nnet/core/filter.c=7143=static struct sock *\nnet/core/filter.c:7144:bpf_sk_lookup(struct sk_buff *skb, struct bpf_sock_tuple *tuple, u32 len,\nnet/core/filter.c-7145-\t      u8 proto, u64 netns_id, u64 flags)\n--\nnet/core/filter.c-7150-\tif (sk)\nnet/core/filter.c:7151:\t\tsk = bpf_sk_lookup_full_sk(sk);\nnet/core/filter.c-7152-\n--\nnet/core/filter.c=7163=static const struct bpf_func_proto bpf_skc_lookup_tcp_proto = {\n--\nnet/core/filter.c-7174-\nnet/core/filter.c:7175:BPF_CALL_5(bpf_sk_lookup_tcp, struct sk_buff *, skb,\nnet/core/filter.c-7176-\t   struct bpf_sock_tuple *, tuple, u32, len, u64, netns_id, u64, flags)\nnet/core/filter.c-7177-{\nnet/core/filter.c:7178:\treturn (unsigned long)bpf_sk_lookup(skb, tuple, len, IPPROTO_TCP,\nnet/core/filter.c-7179-\t\t\t\t\t    netns_id, flags);\n--\nnet/core/filter.c-7181-\nnet/core/filter.c:7182:static const struct bpf_func_proto bpf_sk_lookup_tcp_proto = {\nnet/core/filter.c:7183:\t.func\t\t= bpf_sk_lookup_tcp,\nnet/core/filter.c-7184-\t.gpl_only\t= false,\n--\nnet/core/filter.c-7193-\nnet/core/filter.c:7194:BPF_CALL_5(bpf_sk_lookup_udp, struct sk_buff *, skb,\nnet/core/filter.c-7195-\t   struct bpf_sock_tuple *, tuple, u32, len, u64, netns_id, u64, flags)\nnet/core/filter.c-7196-{\nnet/core/filter.c:7197:\treturn (unsigned long)bpf_sk_lookup(skb, tuple, len, IPPROTO_UDP,\nnet/core/filter.c-7198-\t\t\t\t\t    netns_id, flags);\n--\nnet/core/filter.c-7200-\nnet/core/filter.c:7201:static const struct bpf_func_proto bpf_sk_lookup_udp_proto = {\nnet/core/filter.c:7202:\t.func\t\t= bpf_sk_lookup_udp,\nnet/core/filter.c-7203-\t.gpl_only\t= false,\n--\nnet/core/filter.c=7225=static const struct bpf_func_proto bpf_tc_skc_lookup_tcp_proto = {\n--\nnet/core/filter.c-7236-\nnet/core/filter.c:7237:BPF_CALL_5(bpf_tc_sk_lookup_tcp, struct sk_buff *, skb,\nnet/core/filter.c-7238-\t   struct bpf_sock_tuple *, tuple, u32, len, u64, netns_id, u64, flags)\n--\nnet/core/filter.c-7243-\nnet/core/filter.c:7244:\treturn (unsigned long)__bpf_sk_lookup(skb, tuple, len, caller_net,\nnet/core/filter.c-7245-\t\t\t\t\t      ifindex, IPPROTO_TCP, netns_id,\n--\nnet/core/filter.c-7248-\nnet/core/filter.c:7249:static const struct bpf_func_proto bpf_tc_sk_lookup_tcp_proto = {\nnet/core/filter.c:7250:\t.func\t\t= bpf_tc_sk_lookup_tcp,\nnet/core/filter.c-7251-\t.gpl_only\t= false,\n--\nnet/core/filter.c-7260-\nnet/core/filter.c:7261:BPF_CALL_5(bpf_tc_sk_lookup_udp, struct sk_buff *, skb,\nnet/core/filter.c-7262-\t   struct bpf_sock_tuple *, tuple, u32, len, u64, netns_id, u64, flags)\n--\nnet/core/filter.c-7267-\nnet/core/filter.c:7268:\treturn (unsigned long)__bpf_sk_lookup(skb, tuple, len, caller_net,\nnet/core/filter.c-7269-\t\t\t\t\t      ifindex, IPPROTO_UDP, netns_id,\n--\nnet/core/filter.c-7272-\nnet/core/filter.c:7273:static const struct bpf_func_proto bpf_tc_sk_lookup_udp_proto = {\nnet/core/filter.c:7274:\t.func\t\t= bpf_tc_sk_lookup_udp,\nnet/core/filter.c-7275-\t.gpl_only\t= false,\n--\nnet/core/filter.c=7292=static const struct bpf_func_proto bpf_sk_release_proto = {\n--\nnet/core/filter.c-7298-\nnet/core/filter.c:7299:BPF_CALL_5(bpf_xdp_sk_lookup_udp, struct xdp_buff *, ctx,\nnet/core/filter.c-7300-\t   struct bpf_sock_tuple *, tuple, u32, len, u32, netns_id, u64, flags)\n--\nnet/core/filter.c-7305-\nnet/core/filter.c:7306:\treturn (unsigned long)__bpf_sk_lookup(NULL, tuple, len, caller_net,\nnet/core/filter.c-7307-\t\t\t\t\t      ifindex, IPPROTO_UDP, netns_id,\n--\nnet/core/filter.c-7310-\nnet/core/filter.c:7311:static const struct bpf_func_proto bpf_xdp_sk_lookup_udp_proto = {\nnet/core/filter.c:7312:\t.func           = bpf_xdp_sk_lookup_udp,\nnet/core/filter.c-7313-\t.gpl_only       = false,\n--\nnet/core/filter.c=7335=static const struct bpf_func_proto bpf_xdp_skc_lookup_tcp_proto = {\n--\nnet/core/filter.c-7346-\nnet/core/filter.c:7347:BPF_CALL_5(bpf_xdp_sk_lookup_tcp, struct xdp_buff *, ctx,\nnet/core/filter.c-7348-\t   struct bpf_sock_tuple *, tuple, u32, len, u32, netns_id, u64, flags)\n--\nnet/core/filter.c-7353-\nnet/core/filter.c:7354:\treturn (unsigned long)__bpf_sk_lookup(NULL, tuple, len, caller_net,\nnet/core/filter.c-7355-\t\t\t\t\t      ifindex, IPPROTO_TCP, netns_id,\n--\nnet/core/filter.c-7358-\nnet/core/filter.c:7359:static const struct bpf_func_proto bpf_xdp_sk_lookup_tcp_proto = {\nnet/core/filter.c:7360:\t.func           = bpf_xdp_sk_lookup_tcp,\nnet/core/filter.c-7361-\t.gpl_only       = false,\n--\nnet/core/filter.c=7380=static const struct bpf_func_proto bpf_sock_addr_skc_lookup_tcp_proto = {\n--\nnet/core/filter.c-7390-\nnet/core/filter.c:7391:BPF_CALL_5(bpf_sock_addr_sk_lookup_tcp, struct bpf_sock_addr_kern *, ctx,\nnet/core/filter.c-7392-\t   struct bpf_sock_tuple *, tuple, u32, len, u64, netns_id, u64, flags)\nnet/core/filter.c-7393-{\nnet/core/filter.c:7394:\treturn (unsigned long)__bpf_sk_lookup(NULL, tuple, len,\nnet/core/filter.c-7395-\t\t\t\t\t      sock_net(ctx-\u003esk), 0, IPPROTO_TCP,\n--\nnet/core/filter.c-7398-\nnet/core/filter.c:7399:static const struct bpf_func_proto bpf_sock_addr_sk_lookup_tcp_proto = {\nnet/core/filter.c:7400:\t.func\t\t= bpf_sock_addr_sk_lookup_tcp,\nnet/core/filter.c-7401-\t.gpl_only\t= false,\n--\nnet/core/filter.c-7409-\nnet/core/filter.c:7410:BPF_CALL_5(bpf_sock_addr_sk_lookup_udp, struct bpf_sock_addr_kern *, ctx,\nnet/core/filter.c-7411-\t   struct bpf_sock_tuple *, tuple, u32, len, u64, netns_id, u64, flags)\nnet/core/filter.c-7412-{\nnet/core/filter.c:7413:\treturn (unsigned long)__bpf_sk_lookup(NULL, tuple, len,\nnet/core/filter.c-7414-\t\t\t\t\t      sock_net(ctx-\u003esk), 0, IPPROTO_UDP,\n--\nnet/core/filter.c-7417-\nnet/core/filter.c:7418:static const struct bpf_func_proto bpf_sock_addr_sk_lookup_udp_proto = {\nnet/core/filter.c:7419:\t.func\t\t= bpf_sock_addr_sk_lookup_udp,\nnet/core/filter.c-7420-\t.gpl_only\t= false,\n--\nnet/core/filter.c=8300=sock_addr_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)\n--\nnet/core/filter.c-8323-#ifdef CONFIG_INET\nnet/core/filter.c:8324:\tcase BPF_FUNC_sk_lookup_tcp:\nnet/core/filter.c:8325:\t\treturn \u0026bpf_sock_addr_sk_lookup_tcp_proto;\nnet/core/filter.c:8326:\tcase BPF_FUNC_sk_lookup_udp:\nnet/core/filter.c:8327:\t\treturn \u0026bpf_sock_addr_sk_lookup_udp_proto;\nnet/core/filter.c-8328-\tcase BPF_FUNC_sk_release:\n--\nnet/core/filter.c=8413=cg_skb_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)\n--\nnet/core/filter.c-8440-#ifdef CONFIG_INET\nnet/core/filter.c:8441:\tcase BPF_FUNC_sk_lookup_tcp:\nnet/core/filter.c:8442:\t\treturn \u0026bpf_sk_lookup_tcp_proto;\nnet/core/filter.c:8443:\tcase BPF_FUNC_sk_lookup_udp:\nnet/core/filter.c:8444:\t\treturn \u0026bpf_sk_lookup_udp_proto;\nnet/core/filter.c-8445-\tcase BPF_FUNC_sk_release:\n--\nnet/core/filter.c=8462=tc_cls_act_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)\n--\nnet/core/filter.c-8559-#ifdef CONFIG_INET\nnet/core/filter.c:8560:\tcase BPF_FUNC_sk_lookup_tcp:\nnet/core/filter.c:8561:\t\treturn \u0026bpf_tc_sk_lookup_tcp_proto;\nnet/core/filter.c:8562:\tcase BPF_FUNC_sk_lookup_udp:\nnet/core/filter.c:8563:\t\treturn \u0026bpf_tc_sk_lookup_udp_proto;\nnet/core/filter.c-8564-\tcase BPF_FUNC_sk_release:\n--\nnet/core/filter.c=8599=xdp_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)\n--\nnet/core/filter.c-8628-#ifdef CONFIG_INET\nnet/core/filter.c:8629:\tcase BPF_FUNC_sk_lookup_udp:\nnet/core/filter.c:8630:\t\treturn \u0026bpf_xdp_sk_lookup_udp_proto;\nnet/core/filter.c:8631:\tcase BPF_FUNC_sk_lookup_tcp:\nnet/core/filter.c:8632:\t\treturn \u0026bpf_xdp_sk_lookup_tcp_proto;\nnet/core/filter.c-8633-\tcase BPF_FUNC_sk_release:\n--\nnet/core/filter.c=8756=sk_skb_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)\n--\nnet/core/filter.c-8781-#ifdef CONFIG_INET\nnet/core/filter.c:8782:\tcase BPF_FUNC_sk_lookup_tcp:\nnet/core/filter.c:8783:\t\treturn \u0026bpf_sk_lookup_tcp_proto;\nnet/core/filter.c:8784:\tcase BPF_FUNC_sk_lookup_udp:\nnet/core/filter.c:8785:\t\treturn \u0026bpf_sk_lookup_udp_proto;\nnet/core/filter.c-8786-\tcase BPF_FUNC_sk_release:\n--\nnet/core/filter.c=11808=const struct bpf_prog_ops sk_reuseport_prog_ops = {\n--\nnet/core/filter.c-11810-\nnet/core/filter.c:11811:DEFINE_STATIC_KEY_FALSE(bpf_sk_lookup_enabled);\nnet/core/filter.c:11812:EXPORT_SYMBOL(bpf_sk_lookup_enabled);\nnet/core/filter.c-11813-\nnet/core/filter.c:11814:BPF_CALL_3(bpf_sk_lookup_assign, struct bpf_sk_lookup_kern *, ctx,\nnet/core/filter.c-11815-\t   struct sock *, sk, u64, flags)\n--\nnet/core/filter.c-11842-\nnet/core/filter.c:11843:static const struct bpf_func_proto bpf_sk_lookup_assign_proto = {\nnet/core/filter.c:11844:\t.func\t\t= bpf_sk_lookup_assign,\nnet/core/filter.c-11845-\t.gpl_only\t= false,\n--\nnet/core/filter.c=11852=static const struct bpf_func_proto *\nnet/core/filter.c:11853:sk_lookup_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)\nnet/core/filter.c-11854-{\n--\nnet/core/filter.c-11858-\tcase BPF_FUNC_sk_assign:\nnet/core/filter.c:11859:\t\treturn \u0026bpf_sk_lookup_assign_proto;\nnet/core/filter.c-11860-\tcase BPF_FUNC_sk_release:\n--\nnet/core/filter.c-11866-\nnet/core/filter.c:11867:static bool sk_lookup_is_valid_access(int off, int size,\nnet/core/filter.c-11868-\t\t\t\t      enum bpf_access_type type,\n--\nnet/core/filter.c-11871-{\nnet/core/filter.c:11872:\tif (off \u003c 0 || off \u003e= sizeof(struct bpf_sk_lookup))\nnet/core/filter.c-11873-\t\treturn false;\n--\nnet/core/filter.c-11879-\tswitch (off) {\nnet/core/filter.c:11880:\tcase bpf_ctx_range_ptr(struct bpf_sk_lookup, sk):\nnet/core/filter.c-11881-\t\tinfo-\u003ereg_type = PTR_TO_SOCKET_OR_NULL;\n--\nnet/core/filter.c-11883-\nnet/core/filter.c:11884:\tcase bpf_ctx_range(struct bpf_sk_lookup, family):\nnet/core/filter.c:11885:\tcase bpf_ctx_range(struct bpf_sk_lookup, protocol):\nnet/core/filter.c:11886:\tcase bpf_ctx_range(struct bpf_sk_lookup, remote_ip4):\nnet/core/filter.c:11887:\tcase bpf_ctx_range(struct bpf_sk_lookup, local_ip4):\nnet/core/filter.c:11888:\tcase bpf_ctx_range_till(struct bpf_sk_lookup, remote_ip6[0], remote_ip6[3]):\nnet/core/filter.c:11889:\tcase bpf_ctx_range_till(struct bpf_sk_lookup, local_ip6[0], local_ip6[3]):\nnet/core/filter.c:11890:\tcase bpf_ctx_range(struct bpf_sk_lookup, local_port):\nnet/core/filter.c:11891:\tcase bpf_ctx_range(struct bpf_sk_lookup, ingress_ifindex):\nnet/core/filter.c-11892-\t\tbpf_ctx_record_field_size(info, sizeof(__u32));\n--\nnet/core/filter.c-11894-\nnet/core/filter.c:11895:\tcase bpf_ctx_range(struct bpf_sk_lookup, remote_port):\nnet/core/filter.c-11896-\t\t/* Allow 4-byte access to 2-byte field for backward compatibility */\n--\nnet/core/filter.c-11901-\nnet/core/filter.c:11902:\tcase offsetofend(struct bpf_sk_lookup, remote_port) ...\nnet/core/filter.c:11903:\t     offsetof(struct bpf_sk_lookup, local_ip4) - 1:\nnet/core/filter.c-11904-\t\t/* Allow access to zero padding for backward compatibility */\n--\nnet/core/filter.c-11912-\nnet/core/filter.c:11913:static u32 sk_lookup_convert_ctx_access(enum bpf_access_type type,\nnet/core/filter.c-11914-\t\t\t\t\tconst struct bpf_insn *si,\n--\nnet/core/filter.c-11921-\tswitch (si-\u003eoff) {\nnet/core/filter.c:11922:\tcase offsetof(struct bpf_sk_lookup, sk):\nnet/core/filter.c-11923-\t\t*insn++ = BPF_LDX_MEM(BPF_SIZEOF(void *), si-\u003edst_reg, si-\u003esrc_reg,\nnet/core/filter.c:11924:\t\t\t\t      offsetof(struct bpf_sk_lookup_kern, selected_sk));\nnet/core/filter.c-11925-\t\tbreak;\nnet/core/filter.c-11926-\nnet/core/filter.c:11927:\tcase offsetof(struct bpf_sk_lookup, family):\nnet/core/filter.c-11928-\t\t*insn++ = BPF_LDX_MEM(BPF_H, si-\u003edst_reg, si-\u003esrc_reg,\nnet/core/filter.c:11929:\t\t\t\t      bpf_target_off(struct bpf_sk_lookup_kern,\nnet/core/filter.c-11930-\t\t\t\t\t\t     family, 2, target_size));\n--\nnet/core/filter.c-11932-\nnet/core/filter.c:11933:\tcase offsetof(struct bpf_sk_lookup, protocol):\nnet/core/filter.c-11934-\t\t*insn++ = BPF_LDX_MEM(BPF_H, si-\u003edst_reg, si-\u003esrc_reg,\nnet/core/filter.c:11935:\t\t\t\t      bpf_target_off(struct bpf_sk_lookup_kern,\nnet/core/filter.c-11936-\t\t\t\t\t\t     protocol, 2, target_size));\n--\nnet/core/filter.c-11938-\nnet/core/filter.c:11939:\tcase offsetof(struct bpf_sk_lookup, remote_ip4):\nnet/core/filter.c-11940-\t\t*insn++ = BPF_LDX_MEM(BPF_W, si-\u003edst_reg, si-\u003esrc_reg,\nnet/core/filter.c:11941:\t\t\t\t      bpf_target_off(struct bpf_sk_lookup_kern,\nnet/core/filter.c-11942-\t\t\t\t\t\t     v4.saddr, 4, target_size));\n--\nnet/core/filter.c-11944-\nnet/core/filter.c:11945:\tcase offsetof(struct bpf_sk_lookup, local_ip4):\nnet/core/filter.c-11946-\t\t*insn++ = BPF_LDX_MEM(BPF_W, si-\u003edst_reg, si-\u003esrc_reg,\nnet/core/filter.c:11947:\t\t\t\t      bpf_target_off(struct bpf_sk_lookup_kern,\nnet/core/filter.c-11948-\t\t\t\t\t\t     v4.daddr, 4, target_size));\n--\nnet/core/filter.c-11950-\nnet/core/filter.c:11951:\tcase bpf_ctx_range_till(struct bpf_sk_lookup,\nnet/core/filter.c-11952-\t\t\t\tremote_ip6[0], remote_ip6[3]): {\n--\nnet/core/filter.c-11955-\nnet/core/filter.c:11956:\t\toff -= offsetof(struct bpf_sk_lookup, remote_ip6[0]);\nnet/core/filter.c-11957-\t\toff += bpf_target_off(struct in6_addr, s6_addr32[0], 4, target_size);\nnet/core/filter.c-11958-\t\t*insn++ = BPF_LDX_MEM(BPF_SIZEOF(void *), si-\u003edst_reg, si-\u003esrc_reg,\nnet/core/filter.c:11959:\t\t\t\t      offsetof(struct bpf_sk_lookup_kern, v6.saddr));\nnet/core/filter.c-11960-\t\t*insn++ = BPF_JMP_IMM(BPF_JEQ, si-\u003edst_reg, 0, 1);\n--\nnet/core/filter.c-11966-\t}\nnet/core/filter.c:11967:\tcase bpf_ctx_range_till(struct bpf_sk_lookup,\nnet/core/filter.c-11968-\t\t\t\tlocal_ip6[0], local_ip6[3]): {\n--\nnet/core/filter.c-11971-\nnet/core/filter.c:11972:\t\toff -= offsetof(struct bpf_sk_lookup, local_ip6[0]);\nnet/core/filter.c-11973-\t\toff += bpf_target_off(struct in6_addr, s6_addr32[0], 4, target_size);\nnet/core/filter.c-11974-\t\t*insn++ = BPF_LDX_MEM(BPF_SIZEOF(void *), si-\u003edst_reg, si-\u003esrc_reg,\nnet/core/filter.c:11975:\t\t\t\t      offsetof(struct bpf_sk_lookup_kern, v6.daddr));\nnet/core/filter.c-11976-\t\t*insn++ = BPF_JMP_IMM(BPF_JEQ, si-\u003edst_reg, 0, 1);\n--\nnet/core/filter.c-11982-\t}\nnet/core/filter.c:11983:\tcase offsetof(struct bpf_sk_lookup, remote_port):\nnet/core/filter.c-11984-\t\t*insn++ = BPF_LDX_MEM(BPF_H, si-\u003edst_reg, si-\u003esrc_reg,\nnet/core/filter.c:11985:\t\t\t\t      bpf_target_off(struct bpf_sk_lookup_kern,\nnet/core/filter.c-11986-\t\t\t\t\t\t     sport, 2, target_size));\n--\nnet/core/filter.c-11988-\nnet/core/filter.c:11989:\tcase offsetofend(struct bpf_sk_lookup, remote_port):\nnet/core/filter.c-11990-\t\t*target_size = 2;\n--\nnet/core/filter.c-11993-\nnet/core/filter.c:11994:\tcase offsetof(struct bpf_sk_lookup, local_port):\nnet/core/filter.c-11995-\t\t*insn++ = BPF_LDX_MEM(BPF_H, si-\u003edst_reg, si-\u003esrc_reg,\nnet/core/filter.c:11996:\t\t\t\t      bpf_target_off(struct bpf_sk_lookup_kern,\nnet/core/filter.c-11997-\t\t\t\t\t\t     dport, 2, target_size));\n--\nnet/core/filter.c-11999-\nnet/core/filter.c:12000:\tcase offsetof(struct bpf_sk_lookup, ingress_ifindex):\nnet/core/filter.c-12001-\t\t*insn++ = BPF_LDX_MEM(BPF_W, si-\u003edst_reg, si-\u003esrc_reg,\nnet/core/filter.c:12002:\t\t\t\t      bpf_target_off(struct bpf_sk_lookup_kern,\nnet/core/filter.c-12003-\t\t\t\t\t\t     ingress_ifindex, 4, target_size));\n--\nnet/core/filter.c-12009-\nnet/core/filter.c:12010:const struct bpf_prog_ops sk_lookup_prog_ops = {\nnet/core/filter.c:12011:\t.test_run = bpf_prog_test_run_sk_lookup,\nnet/core/filter.c-12012-};\nnet/core/filter.c-12013-\nnet/core/filter.c:12014:const struct bpf_verifier_ops sk_lookup_verifier_ops = {\nnet/core/filter.c:12015:\t.get_func_proto\t\t= sk_lookup_func_proto,\nnet/core/filter.c:12016:\t.is_valid_access\t= sk_lookup_is_valid_access,\nnet/core/filter.c:12017:\t.convert_ctx_access\t= sk_lookup_convert_ctx_access,\nnet/core/filter.c-12018-};\n"
}

5/2 2026/07/24 14:15 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 12494
							output: 34
							thoughts: 237
						

Thoughts:
**Analyzing the Scope of This Patch**

Okay, so this patch is touching some pretty key functions related to socket lookup within the kernel's networking stack. My initial thought is to zero in on the implications. Specifically, it's modifying `sk_lookup` and `bpf_sk_lookup_full_sk` in `net/core/filter.c`. That's where the core lookup logic lives, and these are the functions that are ultimately called by the BPF-exposed helpers: `__bpf_sk_lookup` and `bpf_sk_lookup`. These are, in turn, called by all those BPF helpers we use for finding sockets like `bpf_sk_lookup_tcp`, `bpf_sk_lookup_udp`, and the others used for tc and xdp, as well as the socket address versions. And let's not forget the modification to `bpf_sk_release`. This is all suggesting potentially significant changes to how BPF interacts with socket lookups and socket lifecycle management. It's a critical area, potentially impactful on performance and security.

Then I see it also touches `sock_map_lookup` and `sock_hash_lookup` in `net/core/sock_map.c`. That's the socket map and socket hash map code. Definitely going to check that area. Now, let's take a closer look at `net/core/sock_map.c` and understand exactly how those functions are being tweaked and what it means for how BPF interacts with these data structures.



6/2 2026/07/24 14:15 tool grepper
0m Args:
{
  "Expression": "sock_map_lookup",
  "PathPrefix": "net/core/sock_map.c"
}

Results:
{
  "Output": "net/core/sock_map.c=372=static void sock_map_release_progs(struct bpf_map *map)\n--\nnet/core/sock_map.c-376-\nnet/core/sock_map.c:377:static struct sock *__sock_map_lookup_elem(struct bpf_map *map, u32 key)\nnet/core/sock_map.c-378-{\n--\nnet/core/sock_map.c-387-\nnet/core/sock_map.c:388:static void *sock_map_lookup(struct bpf_map *map, void *key)\nnet/core/sock_map.c-389-{\n--\nnet/core/sock_map.c-391-\nnet/core/sock_map.c:392:\tsk = __sock_map_lookup_elem(map, *(u32 *)key);\nnet/core/sock_map.c-393-\tif (sk)\n--\nnet/core/sock_map.c-397-\nnet/core/sock_map.c:398:static void *sock_map_lookup_sys(struct bpf_map *map, void *key)\nnet/core/sock_map.c-399-{\n--\nnet/core/sock_map.c-404-\nnet/core/sock_map.c:405:\tsk = __sock_map_lookup_elem(map, *(u32 *)key);\nnet/core/sock_map.c-406-\tif (!sk)\n--\nnet/core/sock_map.c=645=BPF_CALL_4(bpf_sk_redirect_map, struct sk_buff *, skb,\n--\nnet/core/sock_map.c-652-\nnet/core/sock_map.c:653:\tsk = __sock_map_lookup_elem(map, key);\nnet/core/sock_map.c-654-\tif (unlikely(!sk || !sock_map_redirect_allowed(sk)))\n--\nnet/core/sock_map.c=673=BPF_CALL_4(bpf_msg_redirect_map, struct sk_msg *, msg,\n--\nnet/core/sock_map.c-680-\nnet/core/sock_map.c:681:\tsk = __sock_map_lookup_elem(map, key);\nnet/core/sock_map.c-682-\tif (unlikely(!sk || !sock_map_redirect_allowed(sk)))\n--\nnet/core/sock_map.c=721=static void *sock_map_seq_lookup_elem(struct sock_map_seq_info *info)\n--\nnet/core/sock_map.c-725-\nnet/core/sock_map.c:726:\tinfo-\u003esk = __sock_map_lookup_elem(info-\u003emap, info-\u003eindex);\nnet/core/sock_map.c-727-\n--\nnet/core/sock_map.c=829=const struct bpf_map_ops sock_map_ops = {\n--\nnet/core/sock_map.c-833-\t.map_get_next_key\t= sock_map_get_next_key,\nnet/core/sock_map.c:834:\t.map_lookup_elem_sys_only = sock_map_lookup_sys,\nnet/core/sock_map.c-835-\t.map_update_elem\t= sock_map_update_elem,\nnet/core/sock_map.c-836-\t.map_delete_elem\t= sock_map_delete_elem,\nnet/core/sock_map.c:837:\t.map_lookup_elem\t= sock_map_lookup,\nnet/core/sock_map.c-838-\t.map_release_uref\t= sock_map_release_progs,\n"
}

7/2 2026/07/24 14:15 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 14085
							output: 34
							thoughts: 113
						

Thoughts:
**Analyzing the BPF Socket Map Changes**

Okay, so I'm looking at this patch and it's hitting `sock_map_lookup` and `sock_hash_lookup` in `net/core/sock_map.c`. These are the crucial `map_lookup_elem` operations specifically for `BPF_MAP_TYPE_SOCKMAP` and `BPF_MAP_TYPE_SOCKHASH`.  Given my expertise, this immediately tells me we're dealing with how sockets are being managed within the BPF framework at the core level, which is critical for understanding the performance and behavior of any socket-related BPF program. It's the plumbing that makes everything work.

I see that it also modifies `sk_select_reuseport` in `net/core/filter.c`. This suggests the patch likely affects how reuseport sockets are handled in conjunction with these maps. A change there usually indicates improvements or tweaks in how the kernel picks the correct socket when multiple sockets are bound to the same port.

My primary focus right now is on understanding the modifications to `sock_hash_lookup` in `net/core/sock_map.c`. I need to figure out how the lookup process for sockets bound to these hash maps is changing.



8/2 2026/07/24 14:15 tool grepper
0m Args:
{
  "Expression": "sock_hash_lookup",
  "PathPrefix": "net/core/sock_map.c"
}

Results:
{
  "Output": "net/core/sock_map.c=878=static struct bpf_shtab_elem *\nnet/core/sock_map.c:879:sock_hash_lookup_elem_raw(struct hlist_head *head, u32 hash, void *key,\nnet/core/sock_map.c-880-\t\t\t  u32 key_size)\n--\nnet/core/sock_map.c-892-\nnet/core/sock_map.c:893:static struct sock *__sock_hash_lookup_elem(struct bpf_map *map, void *key)\nnet/core/sock_map.c-894-{\n--\nnet/core/sock_map.c-903-\tbucket = sock_hash_select_bucket(htab, hash);\nnet/core/sock_map.c:904:\telem = sock_hash_lookup_elem_raw(\u0026bucket-\u003ehead, hash, key, key_size);\nnet/core/sock_map.c-905-\n--\nnet/core/sock_map.c=916=static void sock_hash_delete_from_link(struct bpf_map *map, struct sock *sk,\n--\nnet/core/sock_map.c-930-\tspin_lock_bh(\u0026bucket-\u003elock);\nnet/core/sock_map.c:931:\telem_probe = sock_hash_lookup_elem_raw(\u0026bucket-\u003ehead, elem-\u003ehash,\nnet/core/sock_map.c-932-\t\t\t\t\t       elem-\u003ekey, map-\u003ekey_size);\n--\nnet/core/sock_map.c=941=static long sock_hash_delete_elem(struct bpf_map *map, void *key)\n--\nnet/core/sock_map.c-952-\tspin_lock_bh(\u0026bucket-\u003elock);\nnet/core/sock_map.c:953:\telem = sock_hash_lookup_elem_raw(\u0026bucket-\u003ehead, hash, key, key_size);\nnet/core/sock_map.c-954-\tif (elem) {\n--\nnet/core/sock_map.c=991=static int sock_hash_update_common(struct bpf_map *map, void *key,\n--\nnet/core/sock_map.c-1020-\tspin_lock_bh(\u0026bucket-\u003elock);\nnet/core/sock_map.c:1021:\telem = sock_hash_lookup_elem_raw(\u0026bucket-\u003ehead, hash, key, key_size);\nnet/core/sock_map.c-1022-\tif (elem \u0026\u0026 flags == BPF_NOEXIST) {\n--\nnet/core/sock_map.c=1056=static int sock_hash_get_next_key(struct bpf_map *map, void *key,\n--\nnet/core/sock_map.c-1068-\thead = \u0026sock_hash_select_bucket(htab, hash)-\u003ehead;\nnet/core/sock_map.c:1069:\telem = sock_hash_lookup_elem_raw(head, hash, key, key_size);\nnet/core/sock_map.c-1070-\tif (!elem)\n--\nnet/core/sock_map.c=1144=static void sock_hash_free(struct bpf_map *map)\n--\nnet/core/sock_map.c-1196-\nnet/core/sock_map.c:1197:static void *sock_hash_lookup_sys(struct bpf_map *map, void *key)\nnet/core/sock_map.c-1198-{\n--\nnet/core/sock_map.c-1203-\nnet/core/sock_map.c:1204:\tsk = __sock_hash_lookup_elem(map, key);\nnet/core/sock_map.c-1205-\tif (!sk)\n--\nnet/core/sock_map.c-1211-\nnet/core/sock_map.c:1212:static void *sock_hash_lookup(struct bpf_map *map, void *key)\nnet/core/sock_map.c-1213-{\n--\nnet/core/sock_map.c-1215-\nnet/core/sock_map.c:1216:\tsk = __sock_hash_lookup_elem(map, key);\nnet/core/sock_map.c-1217-\tif (sk)\n--\nnet/core/sock_map.c=1249=BPF_CALL_4(bpf_sk_redirect_hash, struct sk_buff *, skb,\n--\nnet/core/sock_map.c-1256-\nnet/core/sock_map.c:1257:\tsk = __sock_hash_lookup_elem(map, key);\nnet/core/sock_map.c-1258-\tif (unlikely(!sk || !sock_map_redirect_allowed(sk)))\n--\nnet/core/sock_map.c=1277=BPF_CALL_4(bpf_msg_redirect_hash, struct sk_msg *, msg,\n--\nnet/core/sock_map.c-1284-\nnet/core/sock_map.c:1285:\tsk = __sock_hash_lookup_elem(map, key);\nnet/core/sock_map.c-1286-\tif (unlikely(!sk || !sock_map_redirect_allowed(sk)))\n--\nnet/core/sock_map.c=1443=const struct bpf_map_ops sock_hash_ops = {\n--\nnet/core/sock_map.c-1449-\t.map_delete_elem\t= sock_hash_delete_elem,\nnet/core/sock_map.c:1450:\t.map_lookup_elem\t= sock_hash_lookup,\nnet/core/sock_map.c:1451:\t.map_lookup_elem_sys_only = sock_hash_lookup_sys,\nnet/core/sock_map.c-1452-\t.map_release_uref\t= sock_hash_release_progs,\n"
}

9/2 2026/07/24 14:15 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 16045
							output: 28
							thoughts: 151
						

Thoughts:
**Analyzing the Impact of this Patch**

Okay, so this patch is touching some key areas, specifically within the BPF ecosystem. It looks like it's tweaking `sock_map_lookup` and `sock_hash_lookup`, which, as you know, are critical for the `map_lookup_elem` operations for `BPF_MAP_TYPE_SOCKMAP` and `BPF_MAP_TYPE_SOCKHASH`. That immediately flags a potential impact on how we interact with and manage sockets using BPF maps. It's also making changes to `sk_select_reuseport`, which is a BPF helper. This is worth investigating because any change in helpers has ripple effects throughout BPF programs.

The author mentions the necessary configs: `CONFIG_BPF_SYSCALL` and `CONFIG_NET`. It's worth considering whether `CONFIG_BPF_SYSCALL` *alone* is sufficient for the changes. Let me quickly verify that. I know that `net/core/sock_map.c` is compiled when `CONFIG_BPF_SYSCALL` is enabled, and that file is where those functions are. But I'll double-check by poking around in `net/core/Makefile` just to be certain there's no subtle dependency on `CONFIG_NET` that's not immediately obvious. Better to be thorough when dealing with kernel configurations, especially related to BPF.



10/2 2026/07/24 14:15 tool grepper
0m Args:
{
  "Expression": "sock_map",
  "PathPrefix": "net/core/Makefile"
}

Results:
{
  "Output": "net/core/Makefile=44=obj-$(CONFIG_NET_SOCK_MSG) += skmsg.o\nnet/core/Makefile:45:obj-$(CONFIG_BPF_SYSCALL) += sock_map.o\nnet/core/Makefile-46-obj-$(CONFIG_BPF_SYSCALL) += bpf_sk_storage.o\n"
}

11/2 2026/07/24 14:15 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 16622
							output: 33
							thoughts: 39
						

Thoughts:
Okay, here's my take on those thoughts, framed as an expert's internal monologue:

**Investigating BPF and Reuseport Compatibility**

Alright, the requirement for `CONFIG_BPF_SYSCALL` is a given – that's fundamental for any serious BPF application. But now I need to dive a little deeper, and figure out how it meshes with some other aspects of the system. I'm wondering about `sk_select_reuseport`. I'm pretty sure that has to be in play here, since this is all about socket-level stuff. Let me see where that function is defined again... ah, right, it's sitting in `net/core/filter.c`. That file location makes sense. This is good, it's a critical path to explore. It will be important to confirm assumptions about the interaction of those two elements.



12/2 2026/07/24 14:15 tool grepper
0m Args:
{
  "Expression": "sk_select_reuseport",
  "PathPrefix": "net/core/filter.c"
}

Results:
{
  "Output": "net/core/filter.c=11556=struct sock *bpf_run_sk_reuseport(struct sock_reuseport *reuse, struct sock *sk,\n--\nnet/core/filter.c-11572-\nnet/core/filter.c:11573:BPF_CALL_4(sk_select_reuseport, struct sk_reuseport_kern *, reuse_kern,\nnet/core/filter.c-11574-\t   struct bpf_map *, map, void *, key, u32, flags)\n--\nnet/core/filter.c-11618-\nnet/core/filter.c:11619:static const struct bpf_func_proto sk_select_reuseport_proto = {\nnet/core/filter.c:11620:\t.func           = sk_select_reuseport,\nnet/core/filter.c-11621-\t.gpl_only       = false,\n--\nnet/core/filter.c=11666=sk_reuseport_func_proto(enum bpf_func_id func_id,\n--\nnet/core/filter.c-11669-\tswitch (func_id) {\nnet/core/filter.c:11670:\tcase BPF_FUNC_sk_select_reuseport:\nnet/core/filter.c:11671:\t\treturn \u0026sk_select_reuseport_proto;\nnet/core/filter.c-11672-\tcase BPF_FUNC_skb_load_bytes:\n"
}

13/2 2026/07/24 14:15 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 17275
							output: 30
							thoughts: 124
						

Thoughts:
**My Assessment of the SK_REUSEPORT BPF Helper**

Okay, so I'm looking at `sk_select_reuseport` – that's the BPF helper specifically designed for `BPF_PROG_TYPE_SK_REUSEPORT` programs. That's my starting point. Now, to understand the prerequisites for this to function correctly, I need to check the relevant configuration options. Right away, I see `CONFIG_BPF_SYSCALL` and `CONFIG_NET` are crucial.

My next step is to quickly determine if there are any other dependencies. I'll need to look at the source and cross reference the config options, I should be able to get a better sense from looking into `net/core/filter.c`. Given that `net/core/filter.c` gets compiled only when `CONFIG_NET` is set, that's a good sign. Furthermore, I see that the `sk_lookup` function within `net/core/filter.c` is conditionally compiled under `#ifdef CONFIG_INET`. This implies that `sk_lookup` and, potentially, related functionality are tied into the broader TCP/IP stack configuration, which isn't entirely surprising given the nature of socket-based reuseport scenarios.



14/2 2026/07/24 14:15 tool grepper
0m Args:
{
  "Expression": "sk_lookup",
  "PathPrefix": "net/core/filter.c"
}

Results:
{
  "Output": "net/core/filter.c=6979=static const struct bpf_func_proto bpf_lwt_seg6_adjust_srh_proto = {\n--\nnet/core/filter.c-6989-#ifdef CONFIG_INET\nnet/core/filter.c:6990:static struct sock *sk_lookup(struct net *net, struct bpf_sock_tuple *tuple,\nnet/core/filter.c-6991-\t\t\t      int dif, int sdif, u8 family, u8 proto)\n--\nnet/core/filter.c=7044=__bpf_skc_lookup(struct sk_buff *skb, struct bpf_sock_tuple *tuple, u32 len,\n--\nnet/core/filter.c-7070-\t\tnet = caller_net;\nnet/core/filter.c:7071:\t\tsk = sk_lookup(net, tuple, ifindex, sdif, family, proto);\nnet/core/filter.c-7072-\t} else {\n--\nnet/core/filter.c-7075-\t\t\tgoto out;\nnet/core/filter.c:7076:\t\tsk = sk_lookup(net, tuple, ifindex, sdif, family, proto);\nnet/core/filter.c-7077-\t\tput_net(net);\n--\nnet/core/filter.c=7084=static struct sock *\nnet/core/filter.c:7085:bpf_sk_lookup_full_sk(struct sock *sk)\nnet/core/filter.c-7086-{\n--\nnet/core/filter.c=7109=static struct sock *\nnet/core/filter.c:7110:__bpf_sk_lookup(struct sk_buff *skb, struct bpf_sock_tuple *tuple, u32 len,\nnet/core/filter.c-7111-\t\tstruct net *caller_net, u32 ifindex, u8 proto, u64 netns_id,\n--\nnet/core/filter.c-7118-\tif (sk)\nnet/core/filter.c:7119:\t\tsk = bpf_sk_lookup_full_sk(sk);\nnet/core/filter.c-7120-\n--\nnet/core/filter.c=7143=static struct sock *\nnet/core/filter.c:7144:bpf_sk_lookup(struct sk_buff *skb, struct bpf_sock_tuple *tuple, u32 len,\nnet/core/filter.c-7145-\t      u8 proto, u64 netns_id, u64 flags)\n--\nnet/core/filter.c-7150-\tif (sk)\nnet/core/filter.c:7151:\t\tsk = bpf_sk_lookup_full_sk(sk);\nnet/core/filter.c-7152-\n--\nnet/core/filter.c=7163=static const struct bpf_func_proto bpf_skc_lookup_tcp_proto = {\n--\nnet/core/filter.c-7174-\nnet/core/filter.c:7175:BPF_CALL_5(bpf_sk_lookup_tcp, struct sk_buff *, skb,\nnet/core/filter.c-7176-\t   struct bpf_sock_tuple *, tuple, u32, len, u64, netns_id, u64, flags)\nnet/core/filter.c-7177-{\nnet/core/filter.c:7178:\treturn (unsigned long)bpf_sk_lookup(skb, tuple, len, IPPROTO_TCP,\nnet/core/filter.c-7179-\t\t\t\t\t    netns_id, flags);\n--\nnet/core/filter.c-7181-\nnet/core/filter.c:7182:static const struct bpf_func_proto bpf_sk_lookup_tcp_proto = {\nnet/core/filter.c:7183:\t.func\t\t= bpf_sk_lookup_tcp,\nnet/core/filter.c-7184-\t.gpl_only\t= false,\n--\nnet/core/filter.c-7193-\nnet/core/filter.c:7194:BPF_CALL_5(bpf_sk_lookup_udp, struct sk_buff *, skb,\nnet/core/filter.c-7195-\t   struct bpf_sock_tuple *, tuple, u32, len, u64, netns_id, u64, flags)\nnet/core/filter.c-7196-{\nnet/core/filter.c:7197:\treturn (unsigned long)bpf_sk_lookup(skb, tuple, len, IPPROTO_UDP,\nnet/core/filter.c-7198-\t\t\t\t\t    netns_id, flags);\n--\nnet/core/filter.c-7200-\nnet/core/filter.c:7201:static const struct bpf_func_proto bpf_sk_lookup_udp_proto = {\nnet/core/filter.c:7202:\t.func\t\t= bpf_sk_lookup_udp,\nnet/core/filter.c-7203-\t.gpl_only\t= false,\n--\nnet/core/filter.c=7225=static const struct bpf_func_proto bpf_tc_skc_lookup_tcp_proto = {\n--\nnet/core/filter.c-7236-\nnet/core/filter.c:7237:BPF_CALL_5(bpf_tc_sk_lookup_tcp, struct sk_buff *, skb,\nnet/core/filter.c-7238-\t   struct bpf_sock_tuple *, tuple, u32, len, u64, netns_id, u64, flags)\n--\nnet/core/filter.c-7243-\nnet/core/filter.c:7244:\treturn (unsigned long)__bpf_sk_lookup(skb, tuple, len, caller_net,\nnet/core/filter.c-7245-\t\t\t\t\t      ifindex, IPPROTO_TCP, netns_id,\n--\nnet/core/filter.c-7248-\nnet/core/filter.c:7249:static const struct bpf_func_proto bpf_tc_sk_lookup_tcp_proto = {\nnet/core/filter.c:7250:\t.func\t\t= bpf_tc_sk_lookup_tcp,\nnet/core/filter.c-7251-\t.gpl_only\t= false,\n--\nnet/core/filter.c-7260-\nnet/core/filter.c:7261:BPF_CALL_5(bpf_tc_sk_lookup_udp, struct sk_buff *, skb,\nnet/core/filter.c-7262-\t   struct bpf_sock_tuple *, tuple, u32, len, u64, netns_id, u64, flags)\n--\nnet/core/filter.c-7267-\nnet/core/filter.c:7268:\treturn (unsigned long)__bpf_sk_lookup(skb, tuple, len, caller_net,\nnet/core/filter.c-7269-\t\t\t\t\t      ifindex, IPPROTO_UDP, netns_id,\n--\nnet/core/filter.c-7272-\nnet/core/filter.c:7273:static const struct bpf_func_proto bpf_tc_sk_lookup_udp_proto = {\nnet/core/filter.c:7274:\t.func\t\t= bpf_tc_sk_lookup_udp,\nnet/core/filter.c-7275-\t.gpl_only\t= false,\n--\nnet/core/filter.c=7292=static const struct bpf_func_proto bpf_sk_release_proto = {\n--\nnet/core/filter.c-7298-\nnet/core/filter.c:7299:BPF_CALL_5(bpf_xdp_sk_lookup_udp, struct xdp_buff *, ctx,\nnet/core/filter.c-7300-\t   struct bpf_sock_tuple *, tuple, u32, len, u32, netns_id, u64, flags)\n--\nnet/core/filter.c-7305-\nnet/core/filter.c:7306:\treturn (unsigned long)__bpf_sk_lookup(NULL, tuple, len, caller_net,\nnet/core/filter.c-7307-\t\t\t\t\t      ifindex, IPPROTO_UDP, netns_id,\n--\nnet/core/filter.c-7310-\nnet/core/filter.c:7311:static const struct bpf_func_proto bpf_xdp_sk_lookup_udp_proto = {\nnet/core/filter.c:7312:\t.func           = bpf_xdp_sk_lookup_udp,\nnet/core/filter.c-7313-\t.gpl_only       = false,\n--\nnet/core/filter.c=7335=static const struct bpf_func_proto bpf_xdp_skc_lookup_tcp_proto = {\n--\nnet/core/filter.c-7346-\nnet/core/filter.c:7347:BPF_CALL_5(bpf_xdp_sk_lookup_tcp, struct xdp_buff *, ctx,\nnet/core/filter.c-7348-\t   struct bpf_sock_tuple *, tuple, u32, len, u32, netns_id, u64, flags)\n--\nnet/core/filter.c-7353-\nnet/core/filter.c:7354:\treturn (unsigned long)__bpf_sk_lookup(NULL, tuple, len, caller_net,\nnet/core/filter.c-7355-\t\t\t\t\t      ifindex, IPPROTO_TCP, netns_id,\n--\nnet/core/filter.c-7358-\nnet/core/filter.c:7359:static const struct bpf_func_proto bpf_xdp_sk_lookup_tcp_proto = {\nnet/core/filter.c:7360:\t.func           = bpf_xdp_sk_lookup_tcp,\nnet/core/filter.c-7361-\t.gpl_only       = false,\n--\nnet/core/filter.c=7380=static const struct bpf_func_proto bpf_sock_addr_skc_lookup_tcp_proto = {\n--\nnet/core/filter.c-7390-\nnet/core/filter.c:7391:BPF_CALL_5(bpf_sock_addr_sk_lookup_tcp, struct bpf_sock_addr_kern *, ctx,\nnet/core/filter.c-7392-\t   struct bpf_sock_tuple *, tuple, u32, len, u64, netns_id, u64, flags)\nnet/core/filter.c-7393-{\nnet/core/filter.c:7394:\treturn (unsigned long)__bpf_sk_lookup(NULL, tuple, len,\nnet/core/filter.c-7395-\t\t\t\t\t      sock_net(ctx-\u003esk), 0, IPPROTO_TCP,\n--\nnet/core/filter.c-7398-\nnet/core/filter.c:7399:static const struct bpf_func_proto bpf_sock_addr_sk_lookup_tcp_proto = {\nnet/core/filter.c:7400:\t.func\t\t= bpf_sock_addr_sk_lookup_tcp,\nnet/core/filter.c-7401-\t.gpl_only\t= false,\n--\nnet/core/filter.c-7409-\nnet/core/filter.c:7410:BPF_CALL_5(bpf_sock_addr_sk_lookup_udp, struct bpf_sock_addr_kern *, ctx,\nnet/core/filter.c-7411-\t   struct bpf_sock_tuple *, tuple, u32, len, u64, netns_id, u64, flags)\nnet/core/filter.c-7412-{\nnet/core/filter.c:7413:\treturn (unsigned long)__bpf_sk_lookup(NULL, tuple, len,\nnet/core/filter.c-7414-\t\t\t\t\t      sock_net(ctx-\u003esk), 0, IPPROTO_UDP,\n--\nnet/core/filter.c-7417-\nnet/core/filter.c:7418:static const struct bpf_func_proto bpf_sock_addr_sk_lookup_udp_proto = {\nnet/core/filter.c:7419:\t.func\t\t= bpf_sock_addr_sk_lookup_udp,\nnet/core/filter.c-7420-\t.gpl_only\t= false,\n--\nnet/core/filter.c=8300=sock_addr_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)\n--\nnet/core/filter.c-8323-#ifdef CONFIG_INET\nnet/core/filter.c:8324:\tcase BPF_FUNC_sk_lookup_tcp:\nnet/core/filter.c:8325:\t\treturn \u0026bpf_sock_addr_sk_lookup_tcp_proto;\nnet/core/filter.c:8326:\tcase BPF_FUNC_sk_lookup_udp:\nnet/core/filter.c:8327:\t\treturn \u0026bpf_sock_addr_sk_lookup_udp_proto;\nnet/core/filter.c-8328-\tcase BPF_FUNC_sk_release:\n--\nnet/core/filter.c=8413=cg_skb_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)\n--\nnet/core/filter.c-8440-#ifdef CONFIG_INET\nnet/core/filter.c:8441:\tcase BPF_FUNC_sk_lookup_tcp:\nnet/core/filter.c:8442:\t\treturn \u0026bpf_sk_lookup_tcp_proto;\nnet/core/filter.c:8443:\tcase BPF_FUNC_sk_lookup_udp:\nnet/core/filter.c:8444:\t\treturn \u0026bpf_sk_lookup_udp_proto;\nnet/core/filter.c-8445-\tcase BPF_FUNC_sk_release:\n--\nnet/core/filter.c=8462=tc_cls_act_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)\n--\nnet/core/filter.c-8559-#ifdef CONFIG_INET\nnet/core/filter.c:8560:\tcase BPF_FUNC_sk_lookup_tcp:\nnet/core/filter.c:8561:\t\treturn \u0026bpf_tc_sk_lookup_tcp_proto;\nnet/core/filter.c:8562:\tcase BPF_FUNC_sk_lookup_udp:\nnet/core/filter.c:8563:\t\treturn \u0026bpf_tc_sk_lookup_udp_proto;\nnet/core/filter.c-8564-\tcase BPF_FUNC_sk_release:\n--\nnet/core/filter.c=8599=xdp_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)\n--\nnet/core/filter.c-8628-#ifdef CONFIG_INET\nnet/core/filter.c:8629:\tcase BPF_FUNC_sk_lookup_udp:\nnet/core/filter.c:8630:\t\treturn \u0026bpf_xdp_sk_lookup_udp_proto;\nnet/core/filter.c:8631:\tcase BPF_FUNC_sk_lookup_tcp:\nnet/core/filter.c:8632:\t\treturn \u0026bpf_xdp_sk_lookup_tcp_proto;\nnet/core/filter.c-8633-\tcase BPF_FUNC_sk_release:\n--\nnet/core/filter.c=8756=sk_skb_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)\n--\nnet/core/filter.c-8781-#ifdef CONFIG_INET\nnet/core/filter.c:8782:\tcase BPF_FUNC_sk_lookup_tcp:\nnet/core/filter.c:8783:\t\treturn \u0026bpf_sk_lookup_tcp_proto;\nnet/core/filter.c:8784:\tcase BPF_FUNC_sk_lookup_udp:\nnet/core/filter.c:8785:\t\treturn \u0026bpf_sk_lookup_udp_proto;\nnet/core/filter.c-8786-\tcase BPF_FUNC_sk_release:\n--\nnet/core/filter.c=11808=const struct bpf_prog_ops sk_reuseport_prog_ops = {\n--\nnet/core/filter.c-11810-\nnet/core/filter.c:11811:DEFINE_STATIC_KEY_FALSE(bpf_sk_lookup_enabled);\nnet/core/filter.c:11812:EXPORT_SYMBOL(bpf_sk_lookup_enabled);\nnet/core/filter.c-11813-\nnet/core/filter.c:11814:BPF_CALL_3(bpf_sk_lookup_assign, struct bpf_sk_lookup_kern *, ctx,\nnet/core/filter.c-11815-\t   struct sock *, sk, u64, flags)\n--\nnet/core/filter.c-11842-\nnet/core/filter.c:11843:static const struct bpf_func_proto bpf_sk_lookup_assign_proto = {\nnet/core/filter.c:11844:\t.func\t\t= bpf_sk_lookup_assign,\nnet/core/filter.c-11845-\t.gpl_only\t= false,\n--\nnet/core/filter.c=11852=static const struct bpf_func_proto *\nnet/core/filter.c:11853:sk_lookup_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)\nnet/core/filter.c-11854-{\n--\nnet/core/filter.c-11858-\tcase BPF_FUNC_sk_assign:\nnet/core/filter.c:11859:\t\treturn \u0026bpf_sk_lookup_assign_proto;\nnet/core/filter.c-11860-\tcase BPF_FUNC_sk_release:\n--\nnet/core/filter.c-11866-\nnet/core/filter.c:11867:static bool sk_lookup_is_valid_access(int off, int size,\nnet/core/filter.c-11868-\t\t\t\t      enum bpf_access_type type,\n--\nnet/core/filter.c-11871-{\nnet/core/filter.c:11872:\tif (off \u003c 0 || off \u003e= sizeof(struct bpf_sk_lookup))\nnet/core/filter.c-11873-\t\treturn false;\n--\nnet/core/filter.c-11879-\tswitch (off) {\nnet/core/filter.c:11880:\tcase bpf_ctx_range_ptr(struct bpf_sk_lookup, sk):\nnet/core/filter.c-11881-\t\tinfo-\u003ereg_type = PTR_TO_SOCKET_OR_NULL;\n--\nnet/core/filter.c-11883-\nnet/core/filter.c:11884:\tcase bpf_ctx_range(struct bpf_sk_lookup, family):\nnet/core/filter.c:11885:\tcase bpf_ctx_range(struct bpf_sk_lookup, protocol):\nnet/core/filter.c:11886:\tcase bpf_ctx_range(struct bpf_sk_lookup, remote_ip4):\nnet/core/filter.c:11887:\tcase bpf_ctx_range(struct bpf_sk_lookup, local_ip4):\nnet/core/filter.c:11888:\tcase bpf_ctx_range_till(struct bpf_sk_lookup, remote_ip6[0], remote_ip6[3]):\nnet/core/filter.c:11889:\tcase bpf_ctx_range_till(struct bpf_sk_lookup, local_ip6[0], local_ip6[3]):\nnet/core/filter.c:11890:\tcase bpf_ctx_range(struct bpf_sk_lookup, local_port):\nnet/core/filter.c:11891:\tcase bpf_ctx_range(struct bpf_sk_lookup, ingress_ifindex):\nnet/core/filter.c-11892-\t\tbpf_ctx_record_field_size(info, sizeof(__u32));\n--\nnet/core/filter.c-11894-\nnet/core/filter.c:11895:\tcase bpf_ctx_range(struct bpf_sk_lookup, remote_port):\nnet/core/filter.c-11896-\t\t/* Allow 4-byte access to 2-byte field for backward compatibility */\n--\nnet/core/filter.c-11901-\nnet/core/filter.c:11902:\tcase offsetofend(struct bpf_sk_lookup, remote_port) ...\nnet/core/filter.c:11903:\t     offsetof(struct bpf_sk_lookup, local_ip4) - 1:\nnet/core/filter.c-11904-\t\t/* Allow access to zero padding for backward compatibility */\n--\nnet/core/filter.c-11912-\nnet/core/filter.c:11913:static u32 sk_lookup_convert_ctx_access(enum bpf_access_type type,\nnet/core/filter.c-11914-\t\t\t\t\tconst struct bpf_insn *si,\n--\nnet/core/filter.c-11921-\tswitch (si-\u003eoff) {\nnet/core/filter.c:11922:\tcase offsetof(struct bpf_sk_lookup, sk):\nnet/core/filter.c-11923-\t\t*insn++ = BPF_LDX_MEM(BPF_SIZEOF(void *), si-\u003edst_reg, si-\u003esrc_reg,\nnet/core/filter.c:11924:\t\t\t\t      offsetof(struct bpf_sk_lookup_kern, selected_sk));\nnet/core/filter.c-11925-\t\tbreak;\nnet/core/filter.c-11926-\nnet/core/filter.c:11927:\tcase offsetof(struct bpf_sk_lookup, family):\nnet/core/filter.c-11928-\t\t*insn++ = BPF_LDX_MEM(BPF_H, si-\u003edst_reg, si-\u003esrc_reg,\nnet/core/filter.c:11929:\t\t\t\t      bpf_target_off(struct bpf_sk_lookup_kern,\nnet/core/filter.c-11930-\t\t\t\t\t\t     family, 2, target_size));\n--\nnet/core/filter.c-11932-\nnet/core/filter.c:11933:\tcase offsetof(struct bpf_sk_lookup, protocol):\nnet/core/filter.c-11934-\t\t*insn++ = BPF_LDX_MEM(BPF_H, si-\u003edst_reg, si-\u003esrc_reg,\nnet/core/filter.c:11935:\t\t\t\t      bpf_target_off(struct bpf_sk_lookup_kern,\nnet/core/filter.c-11936-\t\t\t\t\t\t     protocol, 2, target_size));\n--\nnet/core/filter.c-11938-\nnet/core/filter.c:11939:\tcase offsetof(struct bpf_sk_lookup, remote_ip4):\nnet/core/filter.c-11940-\t\t*insn++ = BPF_LDX_MEM(BPF_W, si-\u003edst_reg, si-\u003esrc_reg,\nnet/core/filter.c:11941:\t\t\t\t      bpf_target_off(struct bpf_sk_lookup_kern,\nnet/core/filter.c-11942-\t\t\t\t\t\t     v4.saddr, 4, target_size));\n--\nnet/core/filter.c-11944-\nnet/core/filter.c:11945:\tcase offsetof(struct bpf_sk_lookup, local_ip4):\nnet/core/filter.c-11946-\t\t*insn++ = BPF_LDX_MEM(BPF_W, si-\u003edst_reg, si-\u003esrc_reg,\nnet/core/filter.c:11947:\t\t\t\t      bpf_target_off(struct bpf_sk_lookup_kern,\nnet/core/filter.c-11948-\t\t\t\t\t\t     v4.daddr, 4, target_size));\n--\nnet/core/filter.c-11950-\nnet/core/filter.c:11951:\tcase bpf_ctx_range_till(struct bpf_sk_lookup,\nnet/core/filter.c-11952-\t\t\t\tremote_ip6[0], remote_ip6[3]): {\n--\nnet/core/filter.c-11955-\nnet/core/filter.c:11956:\t\toff -= offsetof(struct bpf_sk_lookup, remote_ip6[0]);\nnet/core/filter.c-11957-\t\toff += bpf_target_off(struct in6_addr, s6_addr32[0], 4, target_size);\nnet/core/filter.c-11958-\t\t*insn++ = BPF_LDX_MEM(BPF_SIZEOF(void *), si-\u003edst_reg, si-\u003esrc_reg,\nnet/core/filter.c:11959:\t\t\t\t      offsetof(struct bpf_sk_lookup_kern, v6.saddr));\nnet/core/filter.c-11960-\t\t*insn++ = BPF_JMP_IMM(BPF_JEQ, si-\u003edst_reg, 0, 1);\n--\nnet/core/filter.c-11966-\t}\nnet/core/filter.c:11967:\tcase bpf_ctx_range_till(struct bpf_sk_lookup,\nnet/core/filter.c-11968-\t\t\t\tlocal_ip6[0], local_ip6[3]): {\n--\nnet/core/filter.c-11971-\nnet/core/filter.c:11972:\t\toff -= offsetof(struct bpf_sk_lookup, local_ip6[0]);\nnet/core/filter.c-11973-\t\toff += bpf_target_off(struct in6_addr, s6_addr32[0], 4, target_size);\nnet/core/filter.c-11974-\t\t*insn++ = BPF_LDX_MEM(BPF_SIZEOF(void *), si-\u003edst_reg, si-\u003esrc_reg,\nnet/core/filter.c:11975:\t\t\t\t      offsetof(struct bpf_sk_lookup_kern, v6.daddr));\nnet/core/filter.c-11976-\t\t*insn++ = BPF_JMP_IMM(BPF_JEQ, si-\u003edst_reg, 0, 1);\n--\nnet/core/filter.c-11982-\t}\nnet/core/filter.c:11983:\tcase offsetof(struct bpf_sk_lookup, remote_port):\nnet/core/filter.c-11984-\t\t*insn++ = BPF_LDX_MEM(BPF_H, si-\u003edst_reg, si-\u003esrc_reg,\nnet/core/filter.c:11985:\t\t\t\t      bpf_target_off(struct bpf_sk_lookup_kern,\nnet/core/filter.c-11986-\t\t\t\t\t\t     sport, 2, target_size));\n--\nnet/core/filter.c-11988-\nnet/core/filter.c:11989:\tcase offsetofend(struct bpf_sk_lookup, remote_port):\nnet/core/filter.c-11990-\t\t*target_size = 2;\n--\nnet/core/filter.c-11993-\nnet/core/filter.c:11994:\tcase offsetof(struct bpf_sk_lookup, local_port):\nnet/core/filter.c-11995-\t\t*insn++ = BPF_LDX_MEM(BPF_H, si-\u003edst_reg, si-\u003esrc_reg,\nnet/core/filter.c:11996:\t\t\t\t      bpf_target_off(struct bpf_sk_lookup_kern,\nnet/core/filter.c-11997-\t\t\t\t\t\t     dport, 2, target_size));\n--\nnet/core/filter.c-11999-\nnet/core/filter.c:12000:\tcase offsetof(struct bpf_sk_lookup, ingress_ifindex):\nnet/core/filter.c-12001-\t\t*insn++ = BPF_LDX_MEM(BPF_W, si-\u003edst_reg, si-\u003esrc_reg,\nnet/core/filter.c:12002:\t\t\t\t      bpf_target_off(struct bpf_sk_lookup_kern,\nnet/core/filter.c-12003-\t\t\t\t\t\t     ingress_ifindex, 4, target_size));\n--\nnet/core/filter.c-12009-\nnet/core/filter.c:12010:const struct bpf_prog_ops sk_lookup_prog_ops = {\nnet/core/filter.c:12011:\t.test_run = bpf_prog_test_run_sk_lookup,\nnet/core/filter.c-12012-};\nnet/core/filter.c-12013-\nnet/core/filter.c:12014:const struct bpf_verifier_ops sk_lookup_verifier_ops = {\nnet/core/filter.c:12015:\t.get_func_proto\t\t= sk_lookup_func_proto,\nnet/core/filter.c:12016:\t.is_valid_access\t= sk_lookup_is_valid_access,\nnet/core/filter.c:12017:\t.convert_ctx_access\t= sk_lookup_convert_ctx_access,\nnet/core/filter.c-12018-};\n"
}

15/2 2026/07/24 14:15 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 25556
							output: 193
							thoughts: 775
						

Thoughts:
**Analyzing BPF Socket Lookup Dependencies**

Okay, so I'm diving into this patch and immediately see that `CONFIG_INET` is a prerequisite for `sk_lookup`. My focus is on the functions this patch touches: `bpf_sk_lookup_tcp`, `bpf_sk_lookup_udp`, `bpf_tc_sk_lookup_tcp`, `bpf_tc_sk_lookup_udp`, `bpf_xdp_sk_lookup_tcp`, `bpf_xdp_sk_lookup_udp`, `bpf_sock_addr_sk_lookup_tcp`, `bpf_sock_addr_sk_lookup_udp`, and `bpf_sk_release`. These are all BPF helpers, so I need to hone in on the core symbols. Initially, I thought about `sk_lookup`, `bpf_sk_lookup_full_sk`, `__bpf_sk_lookup`, `bpf_sk_lookup`, `bpf_sk_release`, `sk_select_reuseport`, `sock_map_lookup`, and `sock_hash_lookup`.

Hang on, `sk_lookup` is actually a static function within `net/core/filter.c`. That's not ideal for unique identification. Let's see if there are other `sk_lookup` implementations in the kernel... yep, there are quite a few. `bpf_sk_lookup_full_sk` might be better. And `__bpf_sk_lookup` and `bpf_sk_lookup` are also static in `net/core/filter.c`. `bpf_sk_release` is a BPF helper, and `sk_select_reuseport` is also a BPF helper. `sock_map_lookup` and `sock_hash_lookup` are static in `net/core/sock_map.c`.

Okay, let's see if `sock_map_lookup` and `sock_hash_lookup` are sufficiently unique to represent the sockmap aspect of this patch? Good, they are. And `bpf_sk_lookup_full_sk`? Yes, it appears to be a unique function, probably introduced or modified by this very patch. And what about `sk_select_reuseport`? Yep, it's a unique BPF helper.

So, the definitive focus symbols for analysis are:

*   `bpf_sk_lookup_full_sk`
*   `bpf_sk_release`
*   `sk_select_reuseport`
*   `sock_map_lookup`
*   `sock_hash_lookup`

Now, let's nail down the required configurations. I'm seeing: `BPF_SYSCALL`, `NET`, and `INET`.

Let's do a quick double-check... `CONFIG_BPF_SYSCALL` is enough for `sock_map.c`. `CONFIG_INET` covers `sk_lookup` and the BPF helpers in `filter.c`. And naturally, `CONFIG_NET` is required for networking.

Let me summarize my reasoning succinctly: This patch is modifying socket reference counting within BPF socket lookup helpers (`bpf_sk_lookup_full_sk`, `bpf_sk_release`), and functions related to sockmap lookups (`sock_map_lookup`, `sock_hash_lookup`). It appears to guarantee correct socket reference handling during lookups and releases. This is a crucial functional change that directly impacts the core BPF networking logic, potentially reached through programs calling these helpers or interacting with sockmaps.

Now, let's `set-results`.



16/2 2026/07/24 14:16 tool set-results
0m Args:
{
  "EnableConfigs": [
    "BPF_SYSCALL",
    "INET",
    "NET"
  ],
  "FocusSymbols": [
    "bpf_sk_lookup_full_sk",
    "bpf_sk_release",
    "sk_select_reuseport",
    "sock_map_lookup",
    "sock_hash_lookup"
  ],
  "Reasoning": "The patch modifies socket reference counting logic in BPF socket lookup helpers (e.g., bpf_sk_lookup_full_sk, bpf_sk_release) and sockmap lookup functions (sock_map_lookup, sock_hash_lookup). It ensures that a reference is always taken for sockets returned by lookups and properly released. This is a functional change in core BPF networking logic that can be reached via BPF programs calling these helpers or interacting with sockmaps.",
  "WorthFuzzing": true
}

Results:
{
  "EnableConfigs": [
    "BPF_SYSCALL",
    "INET",
    "NET"
  ],
  "FocusSymbols": [
    "bpf_sk_lookup_full_sk",
    "bpf_sk_release",
    "sk_select_reuseport",
    "sock_map_lookup",
    "sock_hash_lookup"
  ],
  "Reasoning": "The patch modifies socket reference counting logic in BPF socket lookup helpers (e.g., bpf_sk_lookup_full_sk, bpf_sk_release) and sockmap lookup functions (sock_map_lookup, sock_hash_lookup). It ensures that a reference is always taken for sockets returned by lookups and properly released. This is a functional change in core BPF networking logic that can be reached via BPF programs calling these helpers or interacting with sockmaps.",
  "WorthFuzzing": true
}

LLM Calls Summary:
Total Calls Total Tokens Avg Tokens Total Duration (Seconds) Avg Duration (Seconds)
Tool Calls Summary:
Total Calls Total Duration (Seconds) Avg Duration (Seconds)