| Seq | Timestamp | Type | Name | Duration |
|---|---|---|---|---|
| 0/0 | 2026/06/30 08:31 | flow | patch-triage |
0mArgs:null Results: {
"EnableConfigs": [
"UNIX"
],
"FocusSymbols": [
"unix_stream_sendmsg"
],
"Reasoning": "The patch modifies core AF_UNIX socket logic by setting SKBFL_SHARED_FRAG on skbs when MSG_SPLICE_PAGES is used in unix_stream_sendmsg. This is a functional change in reachable core kernel code and should be fuzzed.",
"WorthFuzzing": true
} |
| 1/1 | 2026/06/30 08:31 | action | read-patch-diff |
0mArgs:null Results: {
"PatchDiff": "commit 0b00e3ce970df98a306b5d0a66c6e15c459f1763\nAuthor: syz-cluster \u003ctriage@syzkaller.com\u003e\nDate: Tue Jun 30 08:31:44 2026 +0000\n\n syz-cluster: applied patch under review\n\ndiff --git a/net/unix/af_unix.c b/net/unix/af_unix.c\nindex f7a9d55eee8a12..f2cd0f8ec0914e 100644\n--- a/net/unix/af_unix.c\n+++ b/net/unix/af_unix.c\n@@ -2458,6 +2458,7 @@ static int unix_stream_sendmsg(struct socket *sock, struct msghdr *msg,\n \t\t\t\tgoto out_free;\n \n \t\t\tsize = err;\n+\t\t\tskb_shinfo(skb)-\u003eflags |= SKBFL_SHARED_FRAG;\n \t\t\trefcount_add(size, \u0026sk-\u003esk_wmem_alloc);\n \t\t} else {\n \t\t\tskb_put(skb, size - data_len);\n"
} |
| 2/1 | 2026/06/30 08:31 | agent | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: {
"EnableConfigs": [
"UNIX"
],
"FocusSymbols": [
"unix_stream_sendmsg"
],
"Reasoning": "The patch modifies core AF_UNIX socket logic by setting SKBFL_SHARED_FRAG on skbs when MSG_SPLICE_PAGES is used in unix_stream_sendmsg. This is a functional change in reachable core kernel code and should be fuzzed.",
"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 0b00e3ce970df98a306b5d0a66c6e15c459f1763
Author: syz-cluster <triage@syzkaller.com>
Date: Tue Jun 30 08:31:44 2026 +0000
syz-cluster: applied patch under review
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
index f7a9d55eee8a12..f2cd0f8ec0914e 100644
--- a/net/unix/af_unix.c
+++ b/net/unix/af_unix.c
@@ -2458,6 +2458,7 @@ static int unix_stream_sendmsg(struct socket *sock, struct msghdr *msg,
goto out_free;
size = err;
+ skb_shinfo(skb)->flags |= SKBFL_SHARED_FRAG;
refcount_add(size, &sk->sk_wmem_alloc);
} else {
skb_put(skb, size - data_len);
|
| 3/2 | 2026/06/30 08:31 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 1833 output: 35 thoughts: 68 Thoughts: Here's my take on the situation: **Analyzing a Network Socket Patch** Okay, so I've got this patch – seems it's touching `net/unix/af_unix.c`. The core of the change looks like it's adding `skb_shinfo(skb)->flags |= SKBFL_SHARED_FRAG;` within `unix_stream_sendmsg`. Alright, that's interesting. Adding that `SKBFL_SHARED_FRAG` flag suggests they're trying to mark the SKB's fragment list as being potentially shared. That instantly triggers a mental scan for any potential concurrency issues or memory management implications. So, let's zoom in on `unix_stream_sendmsg`. I need to understand the context. What's happening *around* that line? What are the implications of setting this flag at this point in the transmission process? I need to know why they're thinking this fragment sharing is necessary and if the existing locking primitives, refcounting, or any other protection mechanisms are still sufficient. Is this a subtle performance optimization, or is it fixing a genuine correctness problem, a race condition, or a memory leak that I'm missing? I need to trace the data flow through `unix_stream_sendmsg`, then figure out what happens with the SKB further down the stack. Any other call sites of this function? We need to verify that this is safe and properly handles all of the edge cases. I'll need to look at how the shared fragment is actually used later to identify any potential race conditions. |
| 4/2 | 2026/06/30 08:31 | tool | grepper |
0mArgs:{
"Expression": "unix_stream_sendmsg",
"PathPrefix": "net/unix/af_unix.c"
}Results: {
"Output": "net/unix/af_unix.c=858=static int unix_shutdown(struct socket *, int);\nnet/unix/af_unix.c:859:static int unix_stream_sendmsg(struct socket *, struct msghdr *, size_t);\nnet/unix/af_unix.c-860-static int unix_stream_recvmsg(struct socket *, struct msghdr *, size_t, int);\n--\nnet/unix/af_unix.c=966=static const struct proto_ops unix_stream_ops = {\n--\nnet/unix/af_unix.c-982-\t.setsockopt =\tunix_setsockopt,\nnet/unix/af_unix.c:983:\t.sendmsg =\tunix_stream_sendmsg,\nnet/unix/af_unix.c-984-\t.recvmsg =\tunix_stream_recvmsg,\n--\nnet/unix/af_unix.c=2316=static int queue_oob(struct sock *sk, struct msghdr *msg, struct sock *other,\n--\nnet/unix/af_unix.c-2375-\nnet/unix/af_unix.c:2376:static int unix_stream_sendmsg(struct socket *sock, struct msghdr *msg,\nnet/unix/af_unix.c-2377-\t\t\t size_t len)\n"
} |
| 5/2 | 2026/06/30 08:31 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 2615 output: 39 thoughts: 20 Thoughts: Here's my attempt at summarizing the thought process, tailored for an expert audience: **Diving into `unix_stream_sendmsg`** Okay, let's zero in on `unix_stream_sendmsg`, specifically around line 2458. I need to refresh my memory on the intricacies of how this function handles messages over Unix domain sockets. I'm primarily interested in understanding the nuances of `sendmsg`'s behavior, particularly regarding control messages and ancillary data, given that's where most subtle issues typically arise in this context. I'm assuming, of course, the underlying transport is using the correct flags to behave as a stream and not a datagram. My goal is to quickly map out the function's critical path, looking for potential vulnerabilities, threading implications, or subtle edge cases related to buffer management or error handling. I'm paying special attention to how it handles the interaction between user-provided buffers and the kernel's internal structures. Are there any race conditions with data copy? Is it handling signals correctly? I'll probably be most interested in how the implementation interacts with the socket options and flags passed to `sendmsg` itself, such as `MSG_EOR`, `MSG_MORE`, etc. I also want to determine the flow of any errors that might occur. |
| 6/2 | 2026/06/30 08:31 | tool | read-file |
0mArgs:{
"File": "net/unix/af_unix.c",
"FirstLine": 2420,
"LineCount": 100
}Results: {
"Contents": "2420:\t\n2421:\t\t\tif (unlikely(msg-\u003emsg_flags \u0026 MSG_SPLICE_PAGES)) {\n2422:\t\t\t\tskb = sock_alloc_send_pskb(sk, 0, 0,\n2423:\t\t\t\t\t\t\t msg-\u003emsg_flags \u0026 MSG_DONTWAIT,\n2424:\t\t\t\t\t\t\t \u0026err, 0);\n2425:\t\t\t} else {\n2426:\t\t\t\t/* Keep two messages in the pipe so it schedules better */\n2427:\t\t\t\tsize = min_t(int, size, (READ_ONCE(sk-\u003esk_sndbuf) \u003e\u003e 1) - 64);\n2428:\t\n2429:\t\t\t\t/* allow fallback to order-0 allocations */\n2430:\t\t\t\tsize = min_t(int, size, SKB_MAX_HEAD(0) + UNIX_SKB_FRAGS_SZ);\n2431:\t\n2432:\t\t\t\tdata_len = max_t(int, 0, size - SKB_MAX_HEAD(0));\n2433:\t\n2434:\t\t\t\tdata_len = min_t(size_t, size, PAGE_ALIGN(data_len));\n2435:\t\n2436:\t\t\t\tskb = sock_alloc_send_pskb(sk, size - data_len, data_len,\n2437:\t\t\t\t\t\t\t msg-\u003emsg_flags \u0026 MSG_DONTWAIT, \u0026err,\n2438:\t\t\t\t\t\t\t get_order(UNIX_SKB_FRAGS_SZ));\n2439:\t\t\t}\n2440:\t\t\tif (!skb)\n2441:\t\t\t\tgoto out_err;\n2442:\t\n2443:\t\t\t/* Only send the fds in the first buffer */\n2444:\t\t\terr = unix_scm_to_skb(\u0026scm, skb, !fds_sent);\n2445:\t\t\tif (err \u003c 0)\n2446:\t\t\t\tgoto out_free;\n2447:\t\n2448:\t\t\tfds_sent = true;\n2449:\t\n2450:\t\t\terr = unix_maybe_add_creds(skb, sk, other);\n2451:\t\t\tif (err)\n2452:\t\t\t\tgoto out_free;\n2453:\t\n2454:\t\t\tif (unlikely(msg-\u003emsg_flags \u0026 MSG_SPLICE_PAGES)) {\n2455:\t\t\t\tskb-\u003eip_summed = CHECKSUM_UNNECESSARY;\n2456:\t\t\t\terr = skb_splice_from_iter(skb, \u0026msg-\u003emsg_iter, size);\n2457:\t\t\t\tif (err \u003c 0)\n2458:\t\t\t\t\tgoto out_free;\n2459:\t\n2460:\t\t\t\tsize = err;\n2461:\t\t\t\tskb_shinfo(skb)-\u003eflags |= SKBFL_SHARED_FRAG;\n2462:\t\t\t\trefcount_add(size, \u0026sk-\u003esk_wmem_alloc);\n2463:\t\t\t} else {\n2464:\t\t\t\tskb_put(skb, size - data_len);\n2465:\t\t\t\tskb-\u003edata_len = data_len;\n2466:\t\t\t\tskb-\u003elen = size;\n2467:\t\t\t\terr = skb_copy_datagram_from_iter(skb, 0, \u0026msg-\u003emsg_iter, size);\n2468:\t\t\t\tif (err)\n2469:\t\t\t\t\tgoto out_free;\n2470:\t\t\t}\n2471:\t\n2472:\t\t\tunix_state_lock(other);\n2473:\t\n2474:\t\t\tif (sock_flag(other, SOCK_DEAD) ||\n2475:\t\t\t (other-\u003esk_shutdown \u0026 RCV_SHUTDOWN))\n2476:\t\t\t\tgoto out_pipe_unlock;\n2477:\t\n2478:\t\t\tif (UNIXCB(skb).fp \u0026\u0026 !other-\u003esk_scm_rights) {\n2479:\t\t\t\tunix_state_unlock(other);\n2480:\t\t\t\terr = -EPERM;\n2481:\t\t\t\tgoto out_free;\n2482:\t\t\t}\n2483:\t\n2484:\t\t\tscm_stat_add(other, skb);\n2485:\t\n2486:\t\t\tspin_lock(\u0026other-\u003esk_receive_queue.lock);\n2487:\t\t\tWRITE_ONCE(otheru-\u003einq_len, otheru-\u003einq_len + skb-\u003elen);\n2488:\t\t\t__skb_queue_tail(\u0026other-\u003esk_receive_queue, skb);\n2489:\t\t\tspin_unlock(\u0026other-\u003esk_receive_queue.lock);\n2490:\t\n2491:\t\t\tunix_state_unlock(other);\n2492:\t\t\tREAD_ONCE(other-\u003esk_data_ready)(other);\n2493:\t\t\tsent += size;\n2494:\t\t}\n2495:\t\n2496:\t#if IS_ENABLED(CONFIG_AF_UNIX_OOB)\n2497:\t\tif (msg-\u003emsg_flags \u0026 MSG_OOB) {\n2498:\t\t\terr = queue_oob(sk, msg, other, \u0026scm, fds_sent);\n2499:\t\t\tif (err)\n2500:\t\t\t\tgoto out_err;\n2501:\t\t\tsent++;\n2502:\t\t}\n2503:\t#endif\n2504:\t\n2505:\t\tscm_destroy(\u0026scm);\n2506:\t\n2507:\t\treturn sent;\n2508:\t\n2509:\tout_pipe_unlock:\n2510:\t\tunix_state_unlock(other);\n2511:\tout_pipe:\n2512:\t\tif (!sent \u0026\u0026 !(msg-\u003emsg_flags \u0026 MSG_NOSIGNAL))\n2513:\t\t\tsend_sig(SIGPIPE, current, 0);\n2514:\t\terr = -EPIPE;\n2515:\tout_free:\n2516:\t\tconsume_skb(skb);\n2517:\tout_err:\n2518:\t\tscm_destroy(\u0026scm);\n2519:\t\treturn sent ? : err;\n"
} |
| 7/2 | 2026/06/30 08:31 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 4537 output: 27 thoughts: 130 Thoughts: **Fuzzing the AF_UNIX Socket Code** Okay, so this patch introduces a functional change within the core `AF_UNIX` socket code. Specifically, it's adding `SKBFL_SHARED_FRAG` to the `skb_shinfo(skb)->flags` within `unix_stream_sendmsg` when the `MSG_SPLICE_PAGES` flag is set in the `msg_flags`. That's interesting, and definitely warrants some attention from a fuzzing perspective. This is where I can really dig into this change, because I know the intricacies of this subsystem. Given the change touches `unix_stream_sendmsg`, that function is my primary focus. I need to make sure I am fuzzing that properly. Now, before I launch into that, I should do a quick review of the relevant config options. While `UNIX` is typically enabled, I should verify there are no hidden configs relating directly to `MSG_SPLICE_PAGES` or `AF_UNIX` behavior that might influence this particular change. Better safe than sorry. Let me check the config options related to these functionalities. Then, I can get to work on fuzzing. |
| 8/2 | 2026/06/30 08:31 | tool | grepper |
0mArgs:{
"Expression": "MSG_SPLICE_PAGES",
"PathPrefix": ""
}Results: {
"Output": "Documentation/bpf/map_sockmap.rst=242=For ``sendmsg()`` hooks this is likely the first scatterlist element. But for\nDocumentation/bpf/map_sockmap.rst:243:calls relying on MSG_SPLICE_PAGES (e.g., ``sendfile()``) this will be the\nDocumentation/bpf/map_sockmap.rst-244-range (**0**, **0**) because the data is shared with user space and by default\n--\ndrivers/block/drbd/drbd_main.c=1518=static int _drbd_send_page(struct drbd_peer_device *peer_device, struct page *page,\n--\ndrivers/block/drbd/drbd_main.c-1533-\tif (!drbd_disable_sendpage \u0026\u0026 sendpages_ok(page, len, offset))\ndrivers/block/drbd/drbd_main.c:1534:\t\tmsg.msg_flags |= MSG_NOSIGNAL | MSG_SPLICE_PAGES;\ndrivers/block/drbd/drbd_main.c-1535-\n--\ndrivers/infiniband/sw/siw/siw_qp_tx.c=294=static int siw_tx_ctrl(struct siw_iwarp_tx *c_tx, struct socket *s,\n--\ndrivers/infiniband/sw/siw/siw_qp_tx.c-314-/*\ndrivers/infiniband/sw/siw/siw_qp_tx.c:315: * 0copy TCP transmit interface: Use MSG_SPLICE_PAGES.\ndrivers/infiniband/sw/siw/siw_qp_tx.c-316- *\n--\ndrivers/infiniband/sw/siw/siw_qp_tx.c=323=static int siw_tcp_sendpages(struct socket *s, struct page **page, int offset,\n--\ndrivers/infiniband/sw/siw/siw_qp_tx.c-327-\tstruct msghdr msg = {\ndrivers/infiniband/sw/siw/siw_qp_tx.c:328:\t\t.msg_flags = (MSG_MORE | MSG_DONTWAIT | MSG_SPLICE_PAGES),\ndrivers/infiniband/sw/siw/siw_qp_tx.c-329-\t};\n--\ndrivers/infiniband/sw/siw/siw_qp_tx.c-340-\t\tif (!sendpage_ok(page[i]))\ndrivers/infiniband/sw/siw/siw_qp_tx.c:341:\t\t\tmsg.msg_flags \u0026= ~MSG_SPLICE_PAGES;\ndrivers/infiniband/sw/siw/siw_qp_tx.c-342-\t\tbvec_set_page(\u0026bvec, page[i], bytes, offset);\n--\ndrivers/nvme/host/tcp.c=1132=static int nvme_tcp_try_send_data(struct nvme_tcp_request *req)\n--\ndrivers/nvme/host/tcp.c-1140-\t\tstruct msghdr msg = {\ndrivers/nvme/host/tcp.c:1141:\t\t\t.msg_flags = MSG_DONTWAIT | MSG_SPLICE_PAGES,\ndrivers/nvme/host/tcp.c-1142-\t\t};\n--\ndrivers/nvme/host/tcp.c-1155-\t\tif (!sendpages_ok(page, len, offset))\ndrivers/nvme/host/tcp.c:1156:\t\t\tmsg.msg_flags \u0026= ~MSG_SPLICE_PAGES;\ndrivers/nvme/host/tcp.c-1157-\n--\ndrivers/nvme/host/tcp.c=1195=static int nvme_tcp_try_send_cmd_pdu(struct nvme_tcp_request *req)\n--\ndrivers/nvme/host/tcp.c-1199-\tstruct bio_vec bvec;\ndrivers/nvme/host/tcp.c:1200:\tstruct msghdr msg = { .msg_flags = MSG_DONTWAIT | MSG_SPLICE_PAGES, };\ndrivers/nvme/host/tcp.c-1201-\tbool inline_data = nvme_tcp_has_inline_data(req);\n--\ndrivers/nvme/host/tcp.c=1236=static int nvme_tcp_try_send_data_pdu(struct nvme_tcp_request *req)\n--\ndrivers/nvme/host/tcp.c-1249-\tif (!req-\u003eh2cdata_left)\ndrivers/nvme/host/tcp.c:1250:\t\tmsg.msg_flags |= MSG_SPLICE_PAGES;\ndrivers/nvme/host/tcp.c-1251-\n--\ndrivers/nvme/target/tcp.c=628=static int nvmet_try_send_data_pdu(struct nvmet_tcp_cmd *cmd)\n--\ndrivers/nvme/target/tcp.c-630-\tstruct msghdr msg = {\ndrivers/nvme/target/tcp.c:631:\t\t.msg_flags = MSG_DONTWAIT | MSG_MORE | MSG_SPLICE_PAGES,\ndrivers/nvme/target/tcp.c-632-\t};\n--\ndrivers/nvme/target/tcp.c=655=static int nvmet_try_send_data(struct nvmet_tcp_cmd *cmd, bool last_in_batch)\n--\ndrivers/nvme/target/tcp.c-661-\t\tstruct msghdr msg = {\ndrivers/nvme/target/tcp.c:662:\t\t\t.msg_flags = MSG_DONTWAIT | MSG_SPLICE_PAGES,\ndrivers/nvme/target/tcp.c-663-\t\t};\n--\ndrivers/nvme/target/tcp.c=708=static int nvmet_try_send_response(struct nvmet_tcp_cmd *cmd,\n--\ndrivers/nvme/target/tcp.c-710-{\ndrivers/nvme/target/tcp.c:711:\tstruct msghdr msg = { .msg_flags = MSG_DONTWAIT | MSG_SPLICE_PAGES, };\ndrivers/nvme/target/tcp.c-712-\tstruct bio_vec bvec;\n--\ndrivers/nvme/target/tcp.c=739=static int nvmet_try_send_r2t(struct nvmet_tcp_cmd *cmd, bool last_in_batch)\ndrivers/nvme/target/tcp.c-740-{\ndrivers/nvme/target/tcp.c:741:\tstruct msghdr msg = { .msg_flags = MSG_DONTWAIT | MSG_SPLICE_PAGES, };\ndrivers/nvme/target/tcp.c-742-\tstruct bio_vec bvec;\n--\ndrivers/scsi/iscsi_tcp.c=293=static int iscsi_sw_tcp_xmit_segment(struct iscsi_tcp_conn *tcp_conn,\n--\ndrivers/scsi/iscsi_tcp.c-318-\t\t\tif (!tcp_conn-\u003eiscsi_conn-\u003edatadgst_en)\ndrivers/scsi/iscsi_tcp.c:319:\t\t\t\tmsg.msg_flags |= MSG_SPLICE_PAGES;\ndrivers/scsi/iscsi_tcp.c-320-\t\t\tsg = segment-\u003esg;\n--\ndrivers/target/iscsi/iscsi_target_util.c=1090=int iscsit_fe_sendpage_sg(\n--\ndrivers/target/iscsi/iscsi_target_util.c-1095-\tstruct bio_vec bvec;\ndrivers/target/iscsi/iscsi_target_util.c:1096:\tstruct msghdr msghdr = { .msg_flags = MSG_SPLICE_PAGES,\t};\ndrivers/target/iscsi/iscsi_target_util.c-1097-\tstruct kvec iov;\n--\nfs/dlm/lowcomms.c=1365=static int send_to_sock(struct connection *con)\n--\nfs/dlm/lowcomms.c-1369-\tstruct msghdr msg = {\nfs/dlm/lowcomms.c:1370:\t\t.msg_flags = MSG_SPLICE_PAGES | MSG_DONTWAIT | MSG_NOSIGNAL,\nfs/dlm/lowcomms.c-1371-\t};\n--\nfs/ocfs2/cluster/tcp.c=932=static void o2net_sendpage(struct o2net_sock_container *sc,\n--\nfs/ocfs2/cluster/tcp.c-943-\twhile (1) {\nfs/ocfs2/cluster/tcp.c:944:\t\tmsg.msg_flags = MSG_DONTWAIT | MSG_SPLICE_PAGES;\nfs/ocfs2/cluster/tcp.c-945-\t\tmutex_lock(\u0026sc-\u003esc_send_lock);\n--\nfs/splice.c=795=ssize_t splice_to_socket(struct pipe_inode_info *pipe, struct file *out,\n--\nfs/splice.c-873-\nfs/splice.c:874:\t\tmsg.msg_flags = MSG_SPLICE_PAGES;\nfs/splice.c-875-\t\tif (flags \u0026 SPLICE_F_MORE)\n--\ninclude/linux/socket.h=197=struct ucred {\n--\ninclude/linux/socket.h-345-#define MSG_ZEROCOPY\t0x4000000\t/* Use user data in kernel path */\ninclude/linux/socket.h:346:#define MSG_SPLICE_PAGES 0x8000000\t/* Splice the pages from the iterator in sendmsg() */\ninclude/linux/socket.h-347-#define MSG_FASTOPEN\t0x20000000\t/* Send data in TCP SYN */\n--\ninclude/linux/socket.h-358-#define MSG_INTERNAL_SENDMSG_FLAGS \\\ninclude/linux/socket.h:359:\t(MSG_SPLICE_PAGES | MSG_SENDPAGE_NOPOLICY | MSG_SENDPAGE_DECRYPTED | MSG_NO_SHARED_FRAGS)\ninclude/linux/socket.h-360-\n--\ninclude/linux/sunrpc/svc.h=134=extern u32 svc_max_payload(const struct svc_rqst *rqstp);\n--\ninclude/linux/sunrpc/svc.h-141- *\ninclude/linux/sunrpc/svc.h:142: * Pages are sent using -\u003esendmsg with MSG_SPLICE_PAGES so each\ninclude/linux/sunrpc/svc.h-143- * server thread needs to allocate more to replace those used in\n--\nnet/ceph/messenger_v1.c=80=static int ceph_tcp_sendpage(struct socket *sock, struct page *page,\n--\nnet/ceph/messenger_v1.c-89-\t/*\nnet/ceph/messenger_v1.c:90:\t * MSG_SPLICE_PAGES cannot properly handle pages with page_count == 0,\nnet/ceph/messenger_v1.c-91-\t * we need to fall back to sendmsg if that's the case.\n--\nnet/ceph/messenger_v1.c-97-\tif (sendpage_ok(page))\nnet/ceph/messenger_v1.c:98:\t\tmsg.msg_flags |= MSG_SPLICE_PAGES;\nnet/ceph/messenger_v1.c-99-\n--\nnet/ceph/messenger_v2.c=142=static int do_try_sendpage(struct socket *sock, struct iov_iter *it)\n--\nnet/ceph/messenger_v2.c-158-\t\t/*\nnet/ceph/messenger_v2.c:159:\t\t * MSG_SPLICE_PAGES cannot properly handle pages with\nnet/ceph/messenger_v2.c-160-\t\t * page_count == 0, we need to fall back to sendmsg if\n--\nnet/ceph/messenger_v2.c-167-\t\tif (sendpage_ok(bv.bv_page))\nnet/ceph/messenger_v2.c:168:\t\t\tmsg.msg_flags |= MSG_SPLICE_PAGES;\nnet/ceph/messenger_v2.c-169-\t\telse\nnet/ceph/messenger_v2.c:170:\t\t\tmsg.msg_flags \u0026= ~MSG_SPLICE_PAGES;\nnet/ceph/messenger_v2.c-171-\n--\nnet/core/skbuff.c=3305=static int __skb_send_sock(struct sock *sk, struct sk_buff *skb, int offset,\n--\nnet/core/skbuff.c-3363-\t\t\tstruct msghdr msg = {\nnet/core/skbuff.c:3364:\t\t\t\t.msg_flags = MSG_SPLICE_PAGES | MSG_DONTWAIT |\nnet/core/skbuff.c-3365-\t\t\t\t\t flags,\n--\nnet/core/skbuff.c=7347=static void skb_splice_csum_page(struct sk_buff *skb, struct page *page,\n--\nnet/core/skbuff.c-7364- *\nnet/core/skbuff.c:7365: * This is a common helper function for supporting MSG_SPLICE_PAGES. It\nnet/core/skbuff.c-7366- * extracts pages from an iterator and adds them to the socket buffer if\n--\nnet/ipv4/ip_output.c=949=static int __ip_append_data(struct sock *sk,\n--\nnet/ipv4/ip_output.c-1036-\t\t}\nnet/ipv4/ip_output.c:1037:\t} else if ((flags \u0026 MSG_SPLICE_PAGES) \u0026\u0026 length) {\nnet/ipv4/ip_output.c-1038-\t\tif (inet_test_bit(HDRINCL, sk))\n--\nnet/ipv4/ip_output.c-1044-\t\telse\nnet/ipv4/ip_output.c:1045:\t\t\tflags \u0026= ~MSG_SPLICE_PAGES;\nnet/ipv4/ip_output.c-1046-\t}\n--\nnet/ipv4/ip_output.c-1173-\t\t\t\tgoto error;\nnet/ipv4/ip_output.c:1174:\t\t\t} else if (flags \u0026 MSG_SPLICE_PAGES) {\nnet/ipv4/ip_output.c-1175-\t\t\t\tcopy = 0;\n--\nnet/ipv4/ip_output.c-1220-\t\t\t}\nnet/ipv4/ip_output.c:1221:\t\t} else if (flags \u0026 MSG_SPLICE_PAGES) {\nnet/ipv4/ip_output.c-1222-\t\t\tstruct msghdr *msg = from;\n--\nnet/ipv4/tcp.c=1116=int tcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t size)\n--\nnet/ipv4/tcp.c-1166-\t\t}\nnet/ipv4/tcp.c:1167:\t} else if (unlikely(msg-\u003emsg_flags \u0026 MSG_SPLICE_PAGES) \u0026\u0026 size) {\nnet/ipv4/tcp.c-1168-\t\tif (sk-\u003esk_route_caps \u0026 NETIF_F_SG)\nnet/ipv4/tcp.c:1169:\t\t\tzc = MSG_SPLICE_PAGES;\nnet/ipv4/tcp.c-1170-\t}\n--\nnet/ipv4/tcp.c-1347-\t\t\tcopy = err;\nnet/ipv4/tcp.c:1348:\t\t} else if (zc == MSG_SPLICE_PAGES) {\nnet/ipv4/tcp.c-1349-\t\t\t/* Splice in data if we can; copy if we can't. */\n--\nnet/ipv4/tcp_bpf.c=91=static int tcp_bpf_push(struct sock *sk, struct sk_msg *msg, u32 apply_bytes,\n--\nnet/ipv4/tcp_bpf.c-112-retry:\nnet/ipv4/tcp_bpf.c:113:\t\tmsghdr.msg_flags = flags | MSG_SPLICE_PAGES;\nnet/ipv4/tcp_bpf.c-114-\t\thas_tx_ulp = tls_sw_has_ctx_tx(sk);\n--\nnet/ipv6/ip6_output.c=1449=static int __ip6_append_data(struct sock *sk,\n--\nnet/ipv6/ip6_output.c-1572-\t\t}\nnet/ipv6/ip6_output.c:1573:\t} else if ((flags \u0026 MSG_SPLICE_PAGES) \u0026\u0026 length) {\nnet/ipv6/ip6_output.c-1574-\t\tif (inet_test_bit(HDRINCL, sk))\n--\nnet/ipv6/ip6_output.c-1580-\t\telse\nnet/ipv6/ip6_output.c:1581:\t\t\tflags \u0026= ~MSG_SPLICE_PAGES;\nnet/ipv6/ip6_output.c-1582-\t}\n--\nnet/ipv6/ip6_output.c-1737-\t\t\t\tgoto error;\nnet/ipv6/ip6_output.c:1738:\t\t\t} else if (flags \u0026 MSG_SPLICE_PAGES) {\nnet/ipv6/ip6_output.c-1739-\t\t\t\tcopy = 0;\n--\nnet/ipv6/ip6_output.c-1784-\t\t\t}\nnet/ipv6/ip6_output.c:1785:\t\t} else if (flags \u0026 MSG_SPLICE_PAGES) {\nnet/ipv6/ip6_output.c-1786-\t\t\tstruct msghdr *msg = from;\n--\nnet/kcm/kcmsock.c=584=static int kcm_write_msgs(struct kcm_sock *kcm)\n--\nnet/kcm/kcmsock.c-608-\t\tstruct msghdr msg = {\nnet/kcm/kcmsock.c:609:\t\t\t.msg_flags = MSG_DONTWAIT | MSG_SPLICE_PAGES,\nnet/kcm/kcmsock.c-610-\t\t};\n--\nnet/kcm/kcmsock.c=749=static int kcm_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)\n--\nnet/kcm/kcmsock.c-835-\nnet/kcm/kcmsock.c:836:\t\tif (msg-\u003emsg_flags \u0026 MSG_SPLICE_PAGES) {\nnet/kcm/kcmsock.c-837-\t\t\tcopy = msg_data_left(msg);\n--\nnet/rds/tcp_send.c=70=int rds_tcp_xmit(struct rds_connection *conn, struct rds_message *rm,\n--\nnet/rds/tcp_send.c-115-\twhile (sg \u003c rm-\u003edata.op_nents) {\nnet/rds/tcp_send.c:116:\t\tmsg.msg_flags = MSG_SPLICE_PAGES | MSG_DONTWAIT | MSG_NOSIGNAL;\nnet/rds/tcp_send.c-117-\t\tif (sg + 1 \u003c rm-\u003edata.op_nents)\n--\nnet/rxrpc/output.c=243=static void rxrpc_send_ack_packet(struct rxrpc_call *call, int nr_kv, size_t len,\n--\nnet/rxrpc/output.c-262-\tmsg.msg_controllen = 0;\nnet/rxrpc/output.c:263:\tmsg.msg_flags\t= MSG_SPLICE_PAGES;\nnet/rxrpc/output.c-264-\n--\nnet/rxrpc/output.c=639=void rxrpc_send_data_packet(struct rxrpc_call *call, struct rxrpc_send_data_req *req)\n--\nnet/rxrpc/output.c-672-\tmsg.msg_controllen = 0;\nnet/rxrpc/output.c:673:\tmsg.msg_flags\t= MSG_SPLICE_PAGES;\nnet/rxrpc/output.c-674-\n--\nnet/rxrpc/output.c=927=void rxrpc_send_response(struct rxrpc_connection *conn, struct sk_buff *response)\n--\nnet/rxrpc/output.c-957-\tmsg.msg_controllen = 0;\nnet/rxrpc/output.c:958:\tmsg.msg_flags\t= MSG_SPLICE_PAGES;\nnet/rxrpc/output.c-959-\n--\nnet/rxrpc/rxgk.c=640=static int rxgk_issue_challenge(struct rxrpc_connection *conn)\n--\nnet/rxrpc/rxgk.c-665-\tmsg.msg_controllen = 0;\nnet/rxrpc/rxgk.c:666:\tmsg.msg_flags\t= MSG_SPLICE_PAGES;\nnet/rxrpc/rxgk.c-667-\n--\nnet/sunrpc/svcsock.c=728=static int svc_udp_sendto(struct svc_rqst *rqstp)\n--\nnet/sunrpc/svcsock.c-741-\t\t.msg_control\t= cmh,\nnet/sunrpc/svcsock.c:742:\t\t.msg_flags\t= MSG_SPLICE_PAGES,\nnet/sunrpc/svcsock.c-743-\t\t.msg_controllen\t= sizeof(buffer),\n--\nnet/sunrpc/svcsock.c=1155=static int svc_tcp_recvfrom(struct svc_rqst *rqstp)\n--\nnet/sunrpc/svcsock.c-1244-/*\nnet/sunrpc/svcsock.c:1245: * MSG_SPLICE_PAGES is used exclusively to reduce the number of\nnet/sunrpc/svcsock.c-1246- * copy operations in this path. Therefore the caller must ensure\n--\nnet/sunrpc/svcsock.c=1249=static int svc_tcp_sendmsg(struct svc_sock *svsk, struct svc_rqst *rqstp,\n--\nnet/sunrpc/svcsock.c-1252-\tstruct msghdr msg = {\nnet/sunrpc/svcsock.c:1253:\t\t.msg_flags\t= MSG_SPLICE_PAGES,\nnet/sunrpc/svcsock.c-1254-\t};\n--\nnet/tls/tls_device.c=421=static int tls_push_data(struct sock *sk,\n--\nnet/tls/tls_device.c-440-\t ~(MSG_MORE | MSG_DONTWAIT | MSG_NOSIGNAL |\nnet/tls/tls_device.c:441:\t MSG_SPLICE_PAGES | MSG_EOR))\nnet/tls/tls_device.c-442-\t\treturn -EOPNOTSUPP;\n--\nnet/tls/tls_device.c-495-\t\tcopy = min_t(size_t, size, max_open_record_len - record-\u003elen);\nnet/tls/tls_device.c:496:\t\tif (copy \u0026\u0026 (flags \u0026 MSG_SPLICE_PAGES)) {\nnet/tls/tls_device.c-497-\t\t\tstruct page_frag zc_pfrag;\n--\nnet/tls/tls_device.c=565=int tls_device_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)\n--\nnet/tls/tls_device.c-571-\tif (!tls_ctx-\u003ezerocopy_sendfile)\nnet/tls/tls_device.c:572:\t\tmsg-\u003emsg_flags \u0026= ~MSG_SPLICE_PAGES;\nnet/tls/tls_device.c-573-\n--\nnet/tls/tls_main.c=168=int tls_push_sg(struct sock *sk,\n--\nnet/tls/tls_main.c-175-\tstruct msghdr msg = {\nnet/tls/tls_main.c:176:\t\t.msg_flags = MSG_SPLICE_PAGES | flags,\nnet/tls/tls_main.c-177-\t};\n--\nnet/tls/tls_sw.c=766=static int tls_sw_sendmsg_locked(struct sock *sk, struct msghdr *msg,\n--\nnet/tls/tls_sw.c-848-\nnet/tls/tls_sw.c:849:\t\tif (try_to_copy \u0026\u0026 (msg-\u003emsg_flags \u0026 MSG_SPLICE_PAGES)) {\nnet/tls/tls_sw.c-850-\t\t\tret = tls_sw_sendmsg_splice(sk, msg, msg_pl,\n--\nnet/tls/tls_sw.c=994=int tls_sw_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)\n--\nnet/tls/tls_sw.c-999-\tif (msg-\u003emsg_flags \u0026 ~(MSG_MORE | MSG_DONTWAIT | MSG_NOSIGNAL |\nnet/tls/tls_sw.c:1000:\t\t\t MSG_CMSG_COMPAT | MSG_SPLICE_PAGES | MSG_EOR |\nnet/tls/tls_sw.c-1001-\t\t\t MSG_SENDPAGE_NOPOLICY))\n--\nnet/unix/af_unix.c=2376=static int unix_stream_sendmsg(struct socket *sock, struct msghdr *msg,\n--\nnet/unix/af_unix.c-2420-\nnet/unix/af_unix.c:2421:\t\tif (unlikely(msg-\u003emsg_flags \u0026 MSG_SPLICE_PAGES)) {\nnet/unix/af_unix.c-2422-\t\t\tskb = sock_alloc_send_pskb(sk, 0, 0,\n--\nnet/unix/af_unix.c-2453-\nnet/unix/af_unix.c:2454:\t\tif (unlikely(msg-\u003emsg_flags \u0026 MSG_SPLICE_PAGES)) {\nnet/unix/af_unix.c-2455-\t\t\tskb-\u003eip_summed = CHECKSUM_UNNECESSARY;\n--\nnet/xfrm/espintcp.c=206=static int espintcp_sendskmsg_locked(struct sock *sk,\n--\nnet/xfrm/espintcp.c-209-\tstruct msghdr msghdr = {\nnet/xfrm/espintcp.c:210:\t\t.msg_flags = flags | MSG_SPLICE_PAGES | MSG_MORE,\nnet/xfrm/espintcp.c-211-\t};\n--\ntools/perf/trace/beauty/include/linux/socket.h=197=struct ucred {\n--\ntools/perf/trace/beauty/include/linux/socket.h-345-#define MSG_ZEROCOPY\t0x4000000\t/* Use user data in kernel path */\ntools/perf/trace/beauty/include/linux/socket.h:346:#define MSG_SPLICE_PAGES 0x8000000\t/* Splice the pages from the iterator in sendmsg() */\ntools/perf/trace/beauty/include/linux/socket.h-347-#define MSG_FASTOPEN\t0x20000000\t/* Send data in TCP SYN */\n--\ntools/perf/trace/beauty/include/linux/socket.h-358-#define MSG_INTERNAL_SENDMSG_FLAGS \\\ntools/perf/trace/beauty/include/linux/socket.h:359:\t(MSG_SPLICE_PAGES | MSG_SENDPAGE_NOPOLICY | MSG_SENDPAGE_DECRYPTED)\ntools/perf/trace/beauty/include/linux/socket.h-360-\n--\ntools/perf/trace/beauty/msg_flags.c-21-#endif\ntools/perf/trace/beauty/msg_flags.c:22:#ifndef MSG_SPLICE_PAGES\ntools/perf/trace/beauty/msg_flags.c:23:#define MSG_SPLICE_PAGES\t0x8000000\ntools/perf/trace/beauty/msg_flags.c-24-#endif\n"
} |
| 9/2 | 2026/06/30 08:32 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 12109 output: 28 thoughts: 125 Thoughts: **Analyzing a Patch in the AF_UNIX Domain** Okay, so I'm looking at this patch and it's using the `MSG_SPLICE_PAGES` flag within `sendmsg` calls. This immediately tells me we're dealing with optimization, probably around data transfer efficiency, specifically within the AF_UNIX domain. The fact that the change is in `net/unix/af_unix.c` confirms my initial thought – this is core to the AF_UNIX socket implementation. I should check the `UNIX` config is enabled as it could change behaviour. This is a functional change, not just a bug fix, so fuzzing is going to be crucial here. I need to make sure I cover all the possible edge cases with various types of data and sizes. Based on the file, the relevant function to scrutinize is likely `unix_stream_sendmsg`. Before I dive too deep, I need to check for any related configs, particularly anything connected to `MSG_SPLICE_PAGES` or perhaps `SKBFL_SHARED_FRAG`. It's possible there are other settings that interact with this one and could open up other potential areas of concern. Finding those related configs is a critical first step. |
| 10/2 | 2026/06/30 08:32 | tool | grepper |
0mArgs:{
"Expression": "SKBFL_SHARED_FRAG",
"PathPrefix": ""
}Results: {
"Output": "include/linux/skbuff.h=503=enum {\n--\ninclude/linux/skbuff.h-511-\t */\ninclude/linux/skbuff.h:512:\tSKBFL_SHARED_FRAG = BIT(1),\ninclude/linux/skbuff.h-513-\n--\ninclude/linux/skbuff.h-526-\ninclude/linux/skbuff.h:527:#define SKBFL_ZEROCOPY_FRAG\t(SKBFL_ZEROCOPY_ENABLE | SKBFL_SHARED_FRAG)\ninclude/linux/skbuff.h-528-#define SKBFL_ALL_ZEROCOPY\t(SKBFL_ZEROCOPY_FRAG | SKBFL_PURE_ZEROCOPY | \\\n--\ninclude/linux/skbuff.h=4023=static inline bool skb_has_shared_frag(const struct sk_buff *skb)\n--\ninclude/linux/skbuff.h-4025-\treturn skb_is_nonlinear(skb) \u0026\u0026\ninclude/linux/skbuff.h:4026:\t skb_shinfo(skb)-\u003eflags \u0026 SKBFL_SHARED_FRAG;\ninclude/linux/skbuff.h-4027-}\n--\nnet/core/gro.c=92=int skb_gro_receive(struct sk_buff *p, struct sk_buff *skb)\n--\nnet/core/gro.c-218-\tp-\u003elen += len;\nnet/core/gro.c:219:\tskb_shinfo(p)-\u003eflags |= skbinfo-\u003eflags \u0026 SKBFL_SHARED_FRAG;\nnet/core/gro.c-220-\tif (lp != p) {\n--\nnet/core/gro.c-223-\t\tlp-\u003elen += len;\nnet/core/gro.c:224:\t\tskb_shinfo(lp)-\u003eflags |= skbinfo-\u003eflags \u0026 SKBFL_SHARED_FRAG;\nnet/core/gro.c-225-\t}\n--\nnet/core/gro.c=230=int skb_gro_receive_list(struct sk_buff *p, struct sk_buff *skb)\n--\nnet/core/gro.c-256-\nnet/core/gro.c:257:\tskb_shinfo(p)-\u003eflags |= skb_shinfo(skb)-\u003eflags \u0026 SKBFL_SHARED_FRAG;\nnet/core/gro.c-258-\n--\nnet/core/skbuff.c=2219=struct sk_buff *__pskb_copy_fclone(struct sk_buff *skb, int headroom,\n--\nnet/core/skbuff.c-2253-\t\tskb_shinfo(n)-\u003enr_frags = i;\nnet/core/skbuff.c:2254:\t\tskb_shinfo(n)-\u003eflags |= skb_shinfo(skb)-\u003eflags \u0026 SKBFL_SHARED_FRAG;\nnet/core/skbuff.c-2255-\t}\n--\nnet/core/skbuff.c=4225=void skb_split(struct sk_buff *skb, struct sk_buff *skb1, const u32 len)\n--\nnet/core/skbuff.c-4227-\tint pos = skb_headlen(skb);\nnet/core/skbuff.c:4228:\tconst int zc_flags = SKBFL_SHARED_FRAG | SKBFL_PURE_ZEROCOPY;\nnet/core/skbuff.c-4229-\n--\nnet/core/skbuff.c=4268=int skb_shift(struct sk_buff *tgt, struct sk_buff *skb, int shiftlen)\n--\nnet/core/skbuff.c-4378-\nnet/core/skbuff.c:4379:\tskb_shinfo(tgt)-\u003eflags |= skb_shinfo(skb)-\u003eflags \u0026 SKBFL_SHARED_FRAG;\nnet/core/skbuff.c-4380-\n--\nnet/core/skbuff.c=4771=struct sk_buff *skb_segment(struct sk_buff *head_skb,\n--\nnet/core/skbuff.c-4992-\t\t\t\t\t skb_shinfo(frag_skb)-\u003eflags) \u0026\nnet/core/skbuff.c:4993:\t\t\t\t\t SKBFL_SHARED_FRAG;\nnet/core/skbuff.c-4994-\n--\nnet/core/skbuff.c-5009-\nnet/core/skbuff.c:5010:\t\t\t\tskb_shinfo(nskb)-\u003eflags |= skb_shinfo(frag_skb)-\u003eflags \u0026 SKBFL_SHARED_FRAG;\nnet/core/skbuff.c-5011-\n--\nnet/core/skbuff.c=6166=bool skb_try_coalesce(struct sk_buff *to, struct sk_buff *from,\n--\nnet/core/skbuff.c-6236-\tif (from_shinfo-\u003enr_frags)\nnet/core/skbuff.c:6237:\t\tto_shinfo-\u003eflags |= from_shinfo-\u003eflags \u0026 SKBFL_SHARED_FRAG;\nnet/core/skbuff.c-6238-\n--\nnet/ipv4/ip_output.c=949=static int __ip_append_data(struct sock *sk,\n--\nnet/ipv4/ip_output.c-1232-\t\t\tif (!(flags \u0026 MSG_NO_SHARED_FRAGS))\nnet/ipv4/ip_output.c:1233:\t\t\t\tskb_shinfo(skb)-\u003eflags |= SKBFL_SHARED_FRAG;\nnet/ipv4/ip_output.c-1234-\t\t\twmem_alloc_delta += copy;\n--\nnet/ipv4/tcp.c=1116=int tcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t size)\n--\nnet/ipv4/tcp.c-1366-\t\t\tif (!(flags \u0026 MSG_NO_SHARED_FRAGS))\nnet/ipv4/tcp.c:1367:\t\t\t\tskb_shinfo(skb)-\u003eflags |= SKBFL_SHARED_FRAG;\nnet/ipv4/tcp.c-1368-\n--\nnet/ipv4/tcp_output.c=2608=static int tcp_clone_payload(struct sock *sk, struct sk_buff *to,\n--\nnet/ipv4/tcp_output.c-2629-\t\t\tlen += todo;\nnet/ipv4/tcp_output.c:2630:\t\t\tskb_shinfo(to)-\u003eflags |= skb_shinfo(skb)-\u003eflags \u0026 SKBFL_SHARED_FRAG;\nnet/ipv4/tcp_output.c-2631-\t\t\tif (lastfrag \u0026\u0026\n--\nnet/ipv6/ip6_output.c=1449=static int __ip6_append_data(struct sock *sk,\n--\nnet/ipv6/ip6_output.c-1796-\t\t\tif (!(flags \u0026 MSG_NO_SHARED_FRAGS))\nnet/ipv6/ip6_output.c:1797:\t\t\t\tskb_shinfo(skb)-\u003eflags |= SKBFL_SHARED_FRAG;\nnet/ipv6/ip6_output.c-1798-\t\t\twmem_alloc_delta += copy;\n--\nnet/kcm/kcmsock.c=749=static int kcm_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)\n--\nnet/kcm/kcmsock.c-848-\t\t\tcopy = err;\nnet/kcm/kcmsock.c:849:\t\t\tskb_shinfo(skb)-\u003eflags |= SKBFL_SHARED_FRAG;\nnet/kcm/kcmsock.c-850-\t\t\tsk_wmem_queued_add(sk, copy);\n--\nnet/unix/af_unix.c=2376=static int unix_stream_sendmsg(struct socket *sock, struct msghdr *msg,\n--\nnet/unix/af_unix.c-2460-\t\t\tsize = err;\nnet/unix/af_unix.c:2461:\t\t\tskb_shinfo(skb)-\u003eflags |= SKBFL_SHARED_FRAG;\nnet/unix/af_unix.c-2462-\t\t\trefcount_add(size, \u0026sk-\u003esk_wmem_alloc);\n--\nnet/xfrm/xfrm_iptfs.c=2154=static void iptfs_consume_frags(struct sk_buff *to, struct sk_buff *from)\n--\nnet/xfrm/xfrm_iptfs.c-2173-\tif (fromi-\u003enr_frags)\nnet/xfrm/xfrm_iptfs.c:2174:\t\ttoi-\u003eflags |= fromi-\u003eflags \u0026 SKBFL_SHARED_FRAG;\nnet/xfrm/xfrm_iptfs.c-2175-\tfromi-\u003enr_frags = 0;\n"
} |
| 11/2 | 2026/06/30 08:32 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 14788 output: 101 thoughts: 112 Thoughts: **Analyzing the Change in `unix_stream_sendmsg`** Okay, so I'm looking at this patch and the core of the change seems to be within the `unix_stream_sendmsg` function. They've introduced the `SKBFL_SHARED_FRAG` flag to `skb_shinfo(skb)->flags`, but only when the `MSG_SPLICE_PAGES` flag is used. This is a clear, functional modification to the way these sockets behave under specific conditions. It looks like we are dealing with a mechanism where we want to splice pages. My primary focus, therefore, is on `unix_stream_sendmsg`. I need to understand why this flag is being introduced, what the implications are for memory management and performance, and whether there are any potential edge cases that need to be considered. Let me quickly double-check the associated configurations. Right, it looks like this is tied to the `UNIX` config. It's the only one specified, so no need to explore any other configurations, or dependencies at this time. Alright, I'll leverage the `set-results` tool to begin my analysis. |
| 12/2 | 2026/06/30 08:32 | tool | set-results |
0mArgs:{
"EnableConfigs": [
"UNIX"
],
"FocusSymbols": [
"unix_stream_sendmsg"
],
"Reasoning": "The patch modifies core AF_UNIX socket logic by setting SKBFL_SHARED_FRAG on skbs when MSG_SPLICE_PAGES is used in unix_stream_sendmsg. This is a functional change in reachable core kernel code and should be fuzzed.",
"WorthFuzzing": true
}Results: {
"EnableConfigs": [
"UNIX"
],
"FocusSymbols": [
"unix_stream_sendmsg"
],
"Reasoning": "The patch modifies core AF_UNIX socket logic by setting SKBFL_SHARED_FRAG on skbs when MSG_SPLICE_PAGES is used in unix_stream_sendmsg. This is a functional change in reachable core kernel code and should be fuzzed.",
"WorthFuzzing": true
} |
| Total Calls | Total Tokens | Avg Tokens | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|
| Total Calls | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|