| Seq | Timestamp | Type | Name | Duration |
|---|---|---|---|---|
| 0/0 | 2026/07/09 09:28 | flow | patch-triage |
0mArgs:null Results: {
"EnableConfigs": null,
"FocusSymbols": [],
"Reasoning": "The patch modifies the Intel IDPF (Infrastructure Data Path Function) driver. This is a hardware-specific PCI network driver for Intel IPUs. Since there is no software emulator for this hardware in standard virtualized environments (like QEMU or GCE), the modified code paths are unreachable during fuzzing.",
"WorthFuzzing": false
} |
| 1/1 | 2026/07/09 09:28 | action | read-patch-diff |
0mArgs:null Results: {
"PatchDiff": "commit 5b39ccbd3469d03fd30efd60cd1b7fc770a74871\nAuthor: syz-cluster \u003ctriage@syzkaller.com\u003e\nDate: Thu Jul 9 09:28:28 2026 +0000\n\n syz-cluster: applied patch under review\n\ndiff --git a/drivers/net/ethernet/intel/idpf/idpf.h b/drivers/net/ethernet/intel/idpf/idpf.h\nindex ec1b75f039bb25..5414bbbee07add 100644\n--- a/drivers/net/ethernet/intel/idpf/idpf.h\n+++ b/drivers/net/ethernet/intel/idpf/idpf.h\n@@ -384,6 +384,7 @@ struct idpf_vport {\n \tstruct idpf_tx_queue **txqs;\n \tu16 num_txq;\n \tu16 num_xdp_txq;\n+\tbool xdpsq_fb;\n \tbool xdpsq_share;\n \tstruct bpf_prog *xdp_prog;\n \ndiff --git a/drivers/net/ethernet/intel/idpf/idpf_txrx.c b/drivers/net/ethernet/intel/idpf/idpf_txrx.c\nindex 7f9056404f64fc..6472bff9ceb37a 100644\n--- a/drivers/net/ethernet/intel/idpf/idpf_txrx.c\n+++ b/drivers/net/ethernet/intel/idpf/idpf_txrx.c\n@@ -227,7 +227,7 @@ static int idpf_tx_desc_alloc(const struct idpf_vport *vport,\n \n \tidpf_xsk_setup_queue(vport, tx_q, VIRTCHNL2_QUEUE_TYPE_TX);\n \n-\tif (!idpf_queue_has(FLOW_SCH_EN, tx_q))\n+\tif (!idpf_queue_has(FLOW_SCH_EN, tx_q) || idpf_queue_has(XDP, tx_q))\n \t\treturn 0;\n \n \trefillq = tx_q-\u003erefillq;\n@@ -1055,6 +1055,11 @@ static void idpf_clean_queue_set(const struct idpf_queue_set *qs)\n \t\t\tif (idpf_queue_has(XDP, q-\u003etxq)) {\n \t\t\t\tq-\u003etxq-\u003epending = 0;\n \t\t\t\tq-\u003etxq-\u003exdp_tx = 0;\n+\n+\t\t\t\tif (static_branch_unlikely(\u0026idpf_xdp_fb) \u0026\u0026\n+\t\t\t\t idpf_queue_has(FLOW_SCH_EN, q-\u003etxq))\n+\t\t\t\t\tbitmap_zero(q-\u003etxq-\u003epending_mask,\n+\t\t\t\t\t\t q-\u003etxq-\u003edesc_count);\n \t\t\t} else {\n \t\t\t\tq-\u003etxq-\u003etxq_grp-\u003enum_completions_pending = 0;\n \t\t\t}\n@@ -1317,7 +1322,8 @@ static void idpf_txq_group_rel(struct idpf_q_vec_rsrc *rsrc)\n \t\t\tif (!txq_grp-\u003etxqs[j])\n \t\t\t\tcontinue;\n \n-\t\t\tif (idpf_queue_has(FLOW_SCH_EN, txq_grp-\u003etxqs[j])) {\n+\t\t\tif (idpf_queue_has(FLOW_SCH_EN, txq_grp-\u003etxqs[j]) \u0026\u0026\n+\t\t\t !idpf_queue_has(XDP, txq_grp-\u003etxqs[j])) {\n \t\t\t\tkfree(txq_grp-\u003etxqs[j]-\u003erefillq);\n \t\t\t\ttxq_grp-\u003etxqs[j]-\u003erefillq = NULL;\n \t\t\t}\ndiff --git a/drivers/net/ethernet/intel/idpf/idpf_txrx.h b/drivers/net/ethernet/intel/idpf/idpf_txrx.h\nindex 4be5b3b6d3ed2b..7ebe59d81e1707 100644\n--- a/drivers/net/ethernet/intel/idpf/idpf_txrx.h\n+++ b/drivers/net/ethernet/intel/idpf/idpf_txrx.h\n@@ -625,11 +625,12 @@ libeth_cacheline_set_assert(struct idpf_rx_queue,\n * @clean_budget: singleq only, queue cleaning budget\n * @cleaned_pkts: Number of packets cleaned for the above said case\n * @refillq: Pointer to refill queue\n+ * @cached_tstamp_caps: Tx timestamp capabilities negotiated with the CP\n * @pending: number of pending descriptors to send in QB\n * @xdp_tx: number of pending \u0026xdp_buff or \u0026xdp_frame buffers\n * @timer: timer for XDP Tx queue cleanup\n * @xdp_lock: lock for XDP Tx queues sharing\n- * @cached_tstamp_caps: Tx timestamp capabilities negotiated with the CP\n+ * @pending_mask: mask of buffers waiting for completion in the FB XDP mode\n * @tstamp_task: Work that handles Tx timestamp read\n * @stats_sync: See struct u64_stats_sync\n * @q_stats: See union idpf_tx_queue_stats\n@@ -689,6 +690,8 @@ struct idpf_tx_queue {\n \t\t\tu16 cleaned_pkts;\n \n \t\t\tstruct idpf_sw_queue *refillq;\n+\n+\t\t\tstruct idpf_ptp_vport_tx_tstamp_caps *cached_tstamp_caps;\n \t\t};\n \t\tstruct {\n \t\t\tu32 pending;\n@@ -696,10 +699,11 @@ struct idpf_tx_queue {\n \n \t\t\tstruct libeth_xdpsq_timer *timer;\n \t\t\tstruct libeth_xdpsq_lock xdp_lock;\n+\n+\t\t\tunsigned long *pending_mask;\n \t\t};\n \t};\n \n-\tstruct idpf_ptp_vport_tx_tstamp_caps *cached_tstamp_caps;\n \tstruct work_struct *tstamp_task;\n \n \tstruct u64_stats_sync stats_sync;\n@@ -718,8 +722,7 @@ struct idpf_tx_queue {\n \t__cacheline_group_end_aligned(cold);\n };\n libeth_cacheline_set_assert(struct idpf_tx_queue, 64,\n-\t\t\t 104 +\n-\t\t\t offsetof(struct idpf_tx_queue, cached_tstamp_caps) -\n+\t\t\t 96 + offsetof(struct idpf_tx_queue, tstamp_task) -\n \t\t\t offsetofend(struct idpf_tx_queue, timer) +\n \t\t\t offsetof(struct idpf_tx_queue, q_stats) -\n \t\t\t offsetofend(struct idpf_tx_queue, tstamp_task),\ndiff --git a/drivers/net/ethernet/intel/idpf/xdp.c b/drivers/net/ethernet/intel/idpf/xdp.c\nindex cbccd454676816..8a4e0a13364dfc 100644\n--- a/drivers/net/ethernet/intel/idpf/xdp.c\n+++ b/drivers/net/ethernet/intel/idpf/xdp.c\n@@ -7,6 +7,8 @@\n #include \"xdp.h\"\n #include \"xsk.h\"\n \n+DEFINE_STATIC_KEY_FALSE(idpf_xdp_fb);\n+\n static int idpf_rxq_for_each(const struct idpf_q_vec_rsrc *rsrc,\n \t\t\t int (*fn)(struct idpf_rx_queue *rxq, void *arg),\n \t\t\t void *arg)\n@@ -183,8 +185,8 @@ int idpf_xdpsqs_get(const struct idpf_vport *vport)\n \t\tkfree(xdpsq-\u003erefillq);\n \t\txdpsq-\u003erefillq = NULL;\n \n-\t\tidpf_queue_clear(FLOW_SCH_EN, xdpsq);\n-\t\tidpf_queue_clear(FLOW_SCH_EN, xdpsq-\u003ecomplq);\n+\t\tidpf_queue_assign(FLOW_SCH_EN, xdpsq, vport-\u003exdpsq_fb);\n+\t\tidpf_queue_assign(FLOW_SCH_EN, xdpsq-\u003ecomplq, vport-\u003exdpsq_fb);\n \t\tidpf_queue_set(NOIRQ, xdpsq);\n \t\tidpf_queue_set(XDP, xdpsq);\n \t\tidpf_queue_set(XDP, xdpsq-\u003ecomplq);\n@@ -197,6 +199,28 @@ int idpf_xdpsqs_get(const struct idpf_vport *vport)\n \t\txdpsq-\u003epending = 0;\n \t\txdpsq-\u003exdp_tx = 0;\n \t\txdpsq-\u003ethresh = libeth_xdp_queue_threshold(xdpsq-\u003edesc_count);\n+\n+\t\tif (static_branch_unlikely(\u0026idpf_xdp_fb) \u0026\u0026\n+\t\t idpf_queue_has(FLOW_SCH_EN, xdpsq)) {\n+\t\t\txdpsq-\u003epending_mask =\n+\t\t\t\tbitmap_zalloc_node(xdpsq-\u003edesc_count,\n+\t\t\t\t\t\t GFP_KERNEL,\n+\t\t\t\t\t\t cpu_to_mem(i - sqs));\n+\t\t\tif (xdpsq-\u003epending_mask)\n+\t\t\t\tcontinue;\n+\n+\t\t\tfor (int j = i - 1; j \u003e= sqs; j--) {\n+\t\t\t\txdpsq = vport-\u003etxqs[j];\n+\n+\t\t\t\tif (idpf_queue_has(FLOW_SCH_EN, xdpsq))\n+\t\t\t\t\tbitmap_free(xdpsq-\u003epending_mask);\n+\t\t\t}\n+\n+\t\t\tfor (u32 j = 0; j \u003c vport-\u003enum_xdp_txq; j++)\n+\t\t\t\tkfree(timers[j]);\n+\n+\t\t\treturn -ENOMEM;\n+\t\t}\n \t}\n \n \treturn 0;\n@@ -222,6 +246,12 @@ void idpf_xdpsqs_put(const struct idpf_vport *vport)\n \t\tlibeth_xdpsq_deinit_timer(xdpsq-\u003etimer);\n \t\tlibeth_xdpsq_put(\u0026xdpsq-\u003exdp_lock, dev);\n \n+\t\tif (static_branch_unlikely(\u0026idpf_xdp_fb) \u0026\u0026\n+\t\t idpf_queue_has(FLOW_SCH_EN, xdpsq)) {\n+\t\t\tbitmap_free(xdpsq-\u003epending_mask);\n+\t\t\txdpsq-\u003epending_mask = NULL;\n+\t\t}\n+\n \t\tkfree(xdpsq-\u003etimer);\n \t\txdpsq-\u003erefillq = NULL;\n \t\tidpf_queue_clear(NOIRQ, xdpsq);\n@@ -250,6 +280,65 @@ static int idpf_xdp_parse_cqe(const struct idpf_splitq_4b_tx_compl_desc *desc,\n \treturn upper_16_bits(val);\n }\n \n+static u32 idpf_xdpsq_poll_fb(struct idpf_tx_queue *xdpsq, u32 budget)\n+{\n+\tstruct idpf_compl_queue *cq = xdpsq-\u003ecomplq;\n+\tunsigned long *mask = xdpsq-\u003epending_mask;\n+\tu32 done_frames, tx_cnt, new_ntc;\n+\tu32 ntc = cq-\u003enext_to_clean;\n+\tu32 cnt = cq-\u003edesc_count;\n+\tbool gen;\n+\n+\tgen = idpf_queue_has(GEN_CHK, cq);\n+\n+\tfor (done_frames = 0; done_frames \u003c budget; ) {\n+\t\tint ret;\n+\n+\t\tret = idpf_xdp_parse_cqe(\u0026cq-\u003ecomp[ntc].common, gen);\n+\t\tif (ret \u003e= 0) {\n+\t\t\t__clear_bit(ret, mask);\n+\t\t\tdone_frames++;\n+\n+\t\t\tgoto next;\n+\t\t}\n+\n+\t\tswitch (ret) {\n+\t\tcase -ENODATA:\n+\t\t\tgoto out;\n+\t\tcase -EINVAL:\n+\t\t\tbreak;\n+\t\t}\n+\n+next:\n+\t\tif (unlikely(++ntc == cnt)) {\n+\t\t\tntc = 0;\n+\t\t\tgen = !gen;\n+\t\t\tidpf_queue_change(GEN_CHK, cq);\n+\t\t}\n+\t}\n+\n+out:\n+\tcq-\u003enext_to_clean = ntc;\n+\n+\tif (unlikely(!done_frames))\n+\t\treturn 0;\n+\n+\ttx_cnt = xdpsq-\u003edesc_count;\n+\n+\t/* Don't go past next_to_use */\n+\t__set_bit(xdpsq-\u003enext_to_use, mask);\n+\n+\tnew_ntc = find_next_bit(mask, tx_cnt, xdpsq-\u003enext_to_clean);\n+\tdone_frames = new_ntc - xdpsq-\u003enext_to_clean;\n+\n+\tif (new_ntc == tx_cnt)\n+\t\tdone_frames += find_first_bit(mask, tx_cnt);\n+\n+\t__clear_bit(xdpsq-\u003enext_to_use, mask);\n+\n+\treturn done_frames;\n+}\n+\n u32 idpf_xdpsq_poll(struct idpf_tx_queue *xdpsq, u32 budget)\n {\n \tstruct idpf_compl_queue *cq = xdpsq-\u003ecomplq;\n@@ -260,6 +349,10 @@ u32 idpf_xdpsq_poll(struct idpf_tx_queue *xdpsq, u32 budget)\n \tu32 done_frames;\n \tbool gen;\n \n+\tif (static_branch_unlikely(\u0026idpf_xdp_fb) \u0026\u0026\n+\t idpf_queue_has(FLOW_SCH_EN, xdpsq))\n+\t\treturn idpf_xdpsq_poll_fb(xdpsq, budget);\n+\n \tgen = idpf_queue_has(GEN_CHK, cq);\n \n \tfor (done_frames = 0; done_frames \u003c budget; ) {\n@@ -479,6 +572,24 @@ static int idpf_xdp_setup_prog(struct idpf_vport *vport,\n \t\treturn -ENOSPC;\n \t}\n \n+\tvport-\u003exdpsq_fb = !idpf_is_cap_ena(vport-\u003eadapter, IDPF_OTHER_CAPS,\n+\t\t\t\t\t VIRTCHNL2_CAP_SPLITQ_QSCHED);\n+\tif (!vport-\u003exdpsq_fb)\n+\t\tgoto reset;\n+\n+\tif (prog) {\n+\t\tbool warn = !static_key_enabled(\u0026idpf_xdp_fb);\n+\n+\t\tstatic_branch_inc(\u0026idpf_xdp_fb);\n+\n+\t\tif (warn \u0026\u0026 net_ratelimit())\n+\t\t\tnetdev_warn(vport-\u003enetdev,\n+\t\t\t\t \"The FW doesn't support Tx in FIFO mode, XDP Tx performance might be suboptimal\\n\");\n+\t} else {\n+\t\tstatic_branch_dec(\u0026idpf_xdp_fb);\n+\t}\n+\n+reset:\n \told = cfg-\u003euser_config.xdp_prog;\n \tcfg-\u003euser_config.xdp_prog = prog;\n \ndiff --git a/drivers/net/ethernet/intel/idpf/xdp.h b/drivers/net/ethernet/intel/idpf/xdp.h\nindex 63e56f7d43e002..3d01c535bd4c60 100644\n--- a/drivers/net/ethernet/intel/idpf/xdp.h\n+++ b/drivers/net/ethernet/intel/idpf/xdp.h\n@@ -8,6 +8,10 @@\n \n #include \"idpf_txrx.h\"\n \n+struct idpf_q_vec_rsrc;\n+\n+DECLARE_STATIC_KEY_FALSE(idpf_xdp_fb);\n+\n int idpf_xdp_rxq_info_init(struct idpf_rx_queue *rxq);\n int idpf_xdp_rxq_info_init_all(const struct idpf_q_vec_rsrc *rsrc);\n void idpf_xdp_rxq_info_deinit(struct idpf_rx_queue *rxq, u32 model);\n@@ -21,6 +25,34 @@ void idpf_xdpsqs_put(const struct idpf_vport *vport);\n u32 idpf_xdpsq_poll(struct idpf_tx_queue *xdpsq, u32 budget);\n bool idpf_xdp_tx_flush_bulk(struct libeth_xdp_tx_bulk *bq, u32 flags);\n \n+static inline void idpf_xdp_tx_xmit_fb(struct libeth_xdp_tx_desc desc, u32 i,\n+\t\t\t\t const struct libeth_xdpsq *sq, u64 priv)\n+{\n+\tstruct idpf_flex_tx_sched_desc *tx_desc = sq-\u003edescs;\n+\tu32 cmd;\n+\n+\tcmd = FIELD_PREP(IDPF_TXD_FLEX_FLOW_DTYPE_M,\n+\t\t\t IDPF_TX_DESC_DTYPE_FLEX_FLOW_SCHE);\n+\tif (desc.flags \u0026 LIBETH_XDP_TX_LAST)\n+\t\tcmd |= IDPF_TXD_FLEX_FLOW_CMD_EOP;\n+\tif (priv \u0026\u0026 (desc.flags \u0026 LIBETH_XDP_TX_CSUM))\n+\t\tcmd |= IDPF_TXD_FLEX_FLOW_CMD_CS_EN;\n+\n+\ttx_desc = \u0026tx_desc[i];\n+\ttx_desc-\u003ebuf_addr = cpu_to_le64(desc.addr);\n+\n+#ifdef __LIBETH_WORD_ACCESS\n+\t*(u64 *)\u0026tx_desc-\u003eqw1 = ((u64)desc.len \u003c\u003c 48) | ((u64)i \u003c\u003c 32) | cmd;\n+#else\n+\ttx_desc-\u003eqw1.rxr_bufsize = cpu_to_le16(desc.len);\n+\ttx_desc-\u003eqw1.compl_tag = cpu_to_le16(i);\n+\ttx_desc-\u003eqw1.ts[0] = 0;\n+\ttx_desc-\u003eqw1.ts[1] = 0;\n+\ttx_desc-\u003eqw1.ts[2] = 0;\n+\ttx_desc-\u003eqw1.cmd_dtype = cmd;\n+#endif\n+}\n+\n /**\n * idpf_xdp_tx_xmit - produce a single HW Tx descriptor out of XDP desc\n * @desc: XDP descriptor to pull the DMA address and length from\n@@ -34,6 +66,14 @@ static inline void idpf_xdp_tx_xmit(struct libeth_xdp_tx_desc desc, u32 i,\n \tstruct idpf_flex_tx_desc *tx_desc = sq-\u003edescs;\n \tu32 cmd;\n \n+\tif (static_branch_unlikely(\u0026idpf_xdp_fb) \u0026\u0026\n+\t idpf_queue_has(FLOW_SCH_EN,\n+\t\t\t libeth_xdpsq_to_sq(sq, struct idpf_tx_queue,\n+\t\t\t\t\t next_to_use))) {\n+\t\tidpf_xdp_tx_xmit_fb(desc, i, sq, priv);\n+\t\treturn;\n+\t}\n+\n \tcmd = FIELD_PREP(IDPF_FLEX_TXD_QW1_DTYPE_M,\n \t\t\t IDPF_TX_DESC_DTYPE_FLEX_L2TAG1_L2TAG2);\n \tif (desc.flags \u0026 LIBETH_XDP_TX_LAST)\n@@ -53,10 +93,27 @@ static inline void idpf_xdp_tx_xmit(struct libeth_xdp_tx_desc desc, u32 i,\n #endif\n }\n \n+static inline void idpf_xdpsq_set_rs_fb(const struct idpf_tx_queue *xdpsq)\n+{\n+\tu32 n = min(xdpsq-\u003epending, xdpsq-\u003edesc_count - xdpsq-\u003enext_to_clean);\n+\n+\tbitmap_set(xdpsq-\u003epending_mask, xdpsq-\u003enext_to_clean, n);\n+\n+\tn = xdpsq-\u003epending - n;\n+\tif (n)\n+\t\tbitmap_set(xdpsq-\u003epending_mask, 0, n);\n+}\n+\n static inline void idpf_xdpsq_set_rs(const struct idpf_tx_queue *xdpsq)\n {\n \tu32 ntu, cmd;\n \n+\tif (static_branch_unlikely(\u0026idpf_xdp_fb) \u0026\u0026\n+\t idpf_queue_has(FLOW_SCH_EN, xdpsq)) {\n+\t\tidpf_xdpsq_set_rs_fb(xdpsq);\n+\t\treturn;\n+\t}\n+\n \tntu = xdpsq-\u003enext_to_use;\n \tif (unlikely(!ntu))\n \t\tntu = xdpsq-\u003edesc_count;\n@@ -84,7 +141,8 @@ static inline void idpf_xdpsq_update_tail(const struct idpf_tx_queue *xdpsq)\n * Set the RS bit (\"end of batch\"), bump the tail, and queue the cleanup timer.\n * To be called after a NAPI polling loop, at the end of .ndo_xdp_xmit() etc.\n */\n-static inline void idpf_xdp_tx_finalize(void *_xdpsq, bool sent, bool flush)\n+static __always_inline void idpf_xdp_tx_finalize(void *_xdpsq, bool sent,\n+\t\t\t\t\t\t bool flush)\n {\n \tstruct idpf_tx_queue *xdpsq = _xdpsq;\n \ndiff --git a/include/net/libeth/xdp.h b/include/net/libeth/xdp.h\nindex 898723ab62e812..ed61d83bda2d77 100644\n--- a/include/net/libeth/xdp.h\n+++ b/include/net/libeth/xdp.h\n@@ -430,6 +430,19 @@ struct libeth_xdpsq {\n \tstruct libeth_xdpsq_lock\t*lock;\n };\n \n+/**\n+ * libeth_xdpsq_to_sq - get SQ pointer from an XDPSQ pointer\n+ * @xdpsq: \u0026libeth_xdpsq corresponding to the queue\n+ * @type: typeof() of the driver Tx queue structure\n+ * @member: name of the NTU field inside @type\n+ *\n+ * Some of the sending callbacks take only \u0026libeth_xdpsq pointer and no pointer\n+ * to the actual driver Tx queue structure. Use this helper to quickly jump to\n+ * the latter when needed.\n+ */\n+#define libeth_xdpsq_to_sq(xdpsq, type, member)\t\t\t\t \\\n+\tcontainer_of_const((xdpsq)-\u003entu, type, member)\n+\n /**\n * struct libeth_xdp_tx_desc - abstraction for an XDP Tx descriptor\n * @addr: DMA address of the frame\n"
} |
| 2/1 | 2026/07/09 09:28 | agent | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: {
"EnableConfigs": null,
"FocusSymbols": [],
"Reasoning": "The patch modifies the Intel IDPF (Infrastructure Data Path Function) driver. This is a hardware-specific PCI network driver for Intel IPUs. Since there is no software emulator for this hardware in standard virtualized environments (like QEMU or GCE), the modified code paths are unreachable during fuzzing.",
"WorthFuzzing": false
}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 5b39ccbd3469d03fd30efd60cd1b7fc770a74871
Author: syz-cluster <triage@syzkaller.com>
Date: Thu Jul 9 09:28:28 2026 +0000
syz-cluster: applied patch under review
diff --git a/drivers/net/ethernet/intel/idpf/idpf.h b/drivers/net/ethernet/intel/idpf/idpf.h
index ec1b75f039bb25..5414bbbee07add 100644
--- a/drivers/net/ethernet/intel/idpf/idpf.h
+++ b/drivers/net/ethernet/intel/idpf/idpf.h
@@ -384,6 +384,7 @@ struct idpf_vport {
struct idpf_tx_queue **txqs;
u16 num_txq;
u16 num_xdp_txq;
+ bool xdpsq_fb;
bool xdpsq_share;
struct bpf_prog *xdp_prog;
diff --git a/drivers/net/ethernet/intel/idpf/idpf_txrx.c b/drivers/net/ethernet/intel/idpf/idpf_txrx.c
index 7f9056404f64fc..6472bff9ceb37a 100644
--- a/drivers/net/ethernet/intel/idpf/idpf_txrx.c
+++ b/drivers/net/ethernet/intel/idpf/idpf_txrx.c
@@ -227,7 +227,7 @@ static int idpf_tx_desc_alloc(const struct idpf_vport *vport,
idpf_xsk_setup_queue(vport, tx_q, VIRTCHNL2_QUEUE_TYPE_TX);
- if (!idpf_queue_has(FLOW_SCH_EN, tx_q))
+ if (!idpf_queue_has(FLOW_SCH_EN, tx_q) || idpf_queue_has(XDP, tx_q))
return 0;
refillq = tx_q->refillq;
@@ -1055,6 +1055,11 @@ static void idpf_clean_queue_set(const struct idpf_queue_set *qs)
if (idpf_queue_has(XDP, q->txq)) {
q->txq->pending = 0;
q->txq->xdp_tx = 0;
+
+ if (static_branch_unlikely(&idpf_xdp_fb) &&
+ idpf_queue_has(FLOW_SCH_EN, q->txq))
+ bitmap_zero(q->txq->pending_mask,
+ q->txq->desc_count);
} else {
q->txq->txq_grp->num_completions_pending = 0;
}
@@ -1317,7 +1322,8 @@ static void idpf_txq_group_rel(struct idpf_q_vec_rsrc *rsrc)
if (!txq_grp->txqs[j])
continue;
- if (idpf_queue_has(FLOW_SCH_EN, txq_grp->txqs[j])) {
+ if (idpf_queue_has(FLOW_SCH_EN, txq_grp->txqs[j]) &&
+ !idpf_queue_has(XDP, txq_grp->txqs[j])) {
kfree(txq_grp->txqs[j]->refillq);
txq_grp->txqs[j]->refillq = NULL;
}
diff --git a/drivers/net/ethernet/intel/idpf/idpf_txrx.h b/drivers/net/ethernet/intel/idpf/idpf_txrx.h
index 4be5b3b6d3ed2b..7ebe59d81e1707 100644
--- a/drivers/net/ethernet/intel/idpf/idpf_txrx.h
+++ b/drivers/net/ethernet/intel/idpf/idpf_txrx.h
@@ -625,11 +625,12 @@ libeth_cacheline_set_assert(struct idpf_rx_queue,
* @clean_budget: singleq only, queue cleaning budget
* @cleaned_pkts: Number of packets cleaned for the above said case
* @refillq: Pointer to refill queue
+ * @cached_tstamp_caps: Tx timestamp capabilities negotiated with the CP
* @pending: number of pending descriptors to send in QB
* @xdp_tx: number of pending &xdp_buff or &xdp_frame buffers
* @timer: timer for XDP Tx queue cleanup
* @xdp_lock: lock for XDP Tx queues sharing
- * @cached_tstamp_caps: Tx timestamp capabilities negotiated with the CP
+ * @pending_mask: mask of buffers waiting for completion in the FB XDP mode
* @tstamp_task: Work that handles Tx timestamp read
* @stats_sync: See struct u64_stats_sync
* @q_stats: See union idpf_tx_queue_stats
@@ -689,6 +690,8 @@ struct idpf_tx_queue {
u16 cleaned_pkts;
struct idpf_sw_queue *refillq;
+
+ struct idpf_ptp_vport_tx_tstamp_caps *cached_tstamp_caps;
};
struct {
u32 pending;
@@ -696,10 +699,11 @@ struct idpf_tx_queue {
struct libeth_xdpsq_timer *timer;
struct libeth_xdpsq_lock xdp_lock;
+
+ unsigned long *pending_mask;
};
};
- struct idpf_ptp_vport_tx_tstamp_caps *cached_tstamp_caps;
struct work_struct *tstamp_task;
struct u64_stats_sync stats_sync;
@@ -718,8 +722,7 @@ struct idpf_tx_queue {
__cacheline_group_end_aligned(cold);
};
libeth_cacheline_set_assert(struct idpf_tx_queue, 64,
- 104 +
- offsetof(struct idpf_tx_queue, cached_tstamp_caps) -
+ 96 + offsetof(struct idpf_tx_queue, tstamp_task) -
offsetofend(struct idpf_tx_queue, timer) +
offsetof(struct idpf_tx_queue, q_stats) -
offsetofend(struct idpf_tx_queue, tstamp_task),
diff --git a/drivers/net/ethernet/intel/idpf/xdp.c b/drivers/net/ethernet/intel/idpf/xdp.c
index cbccd454676816..8a4e0a13364dfc 100644
--- a/drivers/net/ethernet/intel/idpf/xdp.c
+++ b/drivers/net/ethernet/intel/idpf/xdp.c
@@ -7,6 +7,8 @@
#include "xdp.h"
#include "xsk.h"
+DEFINE_STATIC_KEY_FALSE(idpf_xdp_fb);
+
static int idpf_rxq_for_each(const struct idpf_q_vec_rsrc *rsrc,
int (*fn)(struct idpf_rx_queue *rxq, void *arg),
void *arg)
@@ -183,8 +185,8 @@ int idpf_xdpsqs_get(const struct idpf_vport *vport)
kfree(xdpsq->refillq);
xdpsq->refillq = NULL;
- idpf_queue_clear(FLOW_SCH_EN, xdpsq);
- idpf_queue_clear(FLOW_SCH_EN, xdpsq->complq);
+ idpf_queue_assign(FLOW_SCH_EN, xdpsq, vport->xdpsq_fb);
+ idpf_queue_assign(FLOW_SCH_EN, xdpsq->complq, vport->xdpsq_fb);
idpf_queue_set(NOIRQ, xdpsq);
idpf_queue_set(XDP, xdpsq);
idpf_queue_set(XDP, xdpsq->complq);
@@ -197,6 +199,28 @@ int idpf_xdpsqs_get(const struct idpf_vport *vport)
xdpsq->pending = 0;
xdpsq->xdp_tx = 0;
xdpsq->thresh = libeth_xdp_queue_threshold(xdpsq->desc_count);
+
+ if (static_branch_unlikely(&idpf_xdp_fb) &&
+ idpf_queue_has(FLOW_SCH_EN, xdpsq)) {
+ xdpsq->pending_mask =
+ bitmap_zalloc_node(xdpsq->desc_count,
+ GFP_KERNEL,
+ cpu_to_mem(i - sqs));
+ if (xdpsq->pending_mask)
+ continue;
+
+ for (int j = i - 1; j >= sqs; j--) {
+ xdpsq = vport->txqs[j];
+
+ if (idpf_queue_has(FLOW_SCH_EN, xdpsq))
+ bitmap_free(xdpsq->pending_mask);
+ }
+
+ for (u32 j = 0; j < vport->num_xdp_txq; j++)
+ kfree(timers[j]);
+
+ return -ENOMEM;
+ }
}
return 0;
@@ -222,6 +246,12 @@ void idpf_xdpsqs_put(const struct idpf_vport *vport)
libeth_xdpsq_deinit_timer(xdpsq->timer);
libeth_xdpsq_put(&xdpsq->xdp_lock, dev);
+ if (static_branch_unlikely(&idpf_xdp_fb) &&
+ idpf_queue_has(FLOW_SCH_EN, xdpsq)) {
+ bitmap_free(xdpsq->pending_mask);
+ xdpsq->pending_mask = NULL;
+ }
+
kfree(xdpsq->timer);
xdpsq->refillq = NULL;
idpf_queue_clear(NOIRQ, xdpsq);
@@ -250,6 +280,65 @@ static int idpf_xdp_parse_cqe(const struct idpf_splitq_4b_tx_compl_desc *desc,
return upper_16_bits(val);
}
+static u32 idpf_xdpsq_poll_fb(struct idpf_tx_queue *xdpsq, u32 budget)
+{
+ struct idpf_compl_queue *cq = xdpsq->complq;
+ unsigned long *mask = xdpsq->pending_mask;
+ u32 done_frames, tx_cnt, new_ntc;
+ u32 ntc = cq->next_to_clean;
+ u32 cnt = cq->desc_count;
+ bool gen;
+
+ gen = idpf_queue_has(GEN_CHK, cq);
+
+ for (done_frames = 0; done_frames < budget; ) {
+ int ret;
+
+ ret = idpf_xdp_parse_cqe(&cq->comp[ntc].common, gen);
+ if (ret >= 0) {
+ __clear_bit(ret, mask);
+ done_frames++;
+
+ goto next;
+ }
+
+ switch (ret) {
+ case -ENODATA:
+ goto out;
+ case -EINVAL:
+ break;
+ }
+
+next:
+ if (unlikely(++ntc == cnt)) {
+ ntc = 0;
+ gen = !gen;
+ idpf_queue_change(GEN_CHK, cq);
+ }
+ }
+
+out:
+ cq->next_to_clean = ntc;
+
+ if (unlikely(!done_frames))
+ return 0;
+
+ tx_cnt = xdpsq->desc_count;
+
+ /* Don't go past next_to_use */
+ __set_bit(xdpsq->next_to_use, mask);
+
+ new_ntc = find_next_bit(mask, tx_cnt, xdpsq->next_to_clean);
+ done_frames = new_ntc - xdpsq->next_to_clean;
+
+ if (new_ntc == tx_cnt)
+ done_frames += find_first_bit(mask, tx_cnt);
+
+ __clear_bit(xdpsq->next_to_use, mask);
+
+ return done_frames;
+}
+
u32 idpf_xdpsq_poll(struct idpf_tx_queue *xdpsq, u32 budget)
{
struct idpf_compl_queue *cq = xdpsq->complq;
@@ -260,6 +349,10 @@ u32 idpf_xdpsq_poll(struct idpf_tx_queue *xdpsq, u32 budget)
u32 done_frames;
bool gen;
+ if (static_branch_unlikely(&idpf_xdp_fb) &&
+ idpf_queue_has(FLOW_SCH_EN, xdpsq))
+ return idpf_xdpsq_poll_fb(xdpsq, budget);
+
gen = idpf_queue_has(GEN_CHK, cq);
for (done_frames = 0; done_frames < budget; ) {
@@ -479,6 +572,24 @@ static int idpf_xdp_setup_prog(struct idpf_vport *vport,
return -ENOSPC;
}
+ vport->xdpsq_fb = !idpf_is_cap_ena(vport->adapter, IDPF_OTHER_CAPS,
+ VIRTCHNL2_CAP_SPLITQ_QSCHED);
+ if (!vport->xdpsq_fb)
+ goto reset;
+
+ if (prog) {
+ bool warn = !static_key_enabled(&idpf_xdp_fb);
+
+ static_branch_inc(&idpf_xdp_fb);
+
+ if (warn && net_ratelimit())
+ netdev_warn(vport->netdev,
+ "The FW doesn't support Tx in FIFO mode, XDP Tx performance might be suboptimal\n");
+ } else {
+ static_branch_dec(&idpf_xdp_fb);
+ }
+
+reset:
old = cfg->user_config.xdp_prog;
cfg->user_config.xdp_prog = prog;
diff --git a/drivers/net/ethernet/intel/idpf/xdp.h b/drivers/net/ethernet/intel/idpf/xdp.h
index 63e56f7d43e002..3d01c535bd4c60 100644
--- a/drivers/net/ethernet/intel/idpf/xdp.h
+++ b/drivers/net/ethernet/intel/idpf/xdp.h
@@ -8,6 +8,10 @@
#include "idpf_txrx.h"
+struct idpf_q_vec_rsrc;
+
+DECLARE_STATIC_KEY_FALSE(idpf_xdp_fb);
+
int idpf_xdp_rxq_info_init(struct idpf_rx_queue *rxq);
int idpf_xdp_rxq_info_init_all(const struct idpf_q_vec_rsrc *rsrc);
void idpf_xdp_rxq_info_deinit(struct idpf_rx_queue *rxq, u32 model);
@@ -21,6 +25,34 @@ void idpf_xdpsqs_put(const struct idpf_vport *vport);
u32 idpf_xdpsq_poll(struct idpf_tx_queue *xdpsq, u32 budget);
bool idpf_xdp_tx_flush_bulk(struct libeth_xdp_tx_bulk *bq, u32 flags);
+static inline void idpf_xdp_tx_xmit_fb(struct libeth_xdp_tx_desc desc, u32 i,
+ const struct libeth_xdpsq *sq, u64 priv)
+{
+ struct idpf_flex_tx_sched_desc *tx_desc = sq->descs;
+ u32 cmd;
+
+ cmd = FIELD_PREP(IDPF_TXD_FLEX_FLOW_DTYPE_M,
+ IDPF_TX_DESC_DTYPE_FLEX_FLOW_SCHE);
+ if (desc.flags & LIBETH_XDP_TX_LAST)
+ cmd |= IDPF_TXD_FLEX_FLOW_CMD_EOP;
+ if (priv && (desc.flags & LIBETH_XDP_TX_CSUM))
+ cmd |= IDPF_TXD_FLEX_FLOW_CMD_CS_EN;
+
+ tx_desc = &tx_desc[i];
+ tx_desc->buf_addr = cpu_to_le64(desc.addr);
+
+#ifdef __LIBETH_WORD_ACCESS
+ *(u64 *)&tx_desc->qw1 = ((u64)desc.len << 48) | ((u64)i << 32) | cmd;
+#else
+ tx_desc->qw1.rxr_bufsize = cpu_to_le16(desc.len);
+ tx_desc->qw1.compl_tag = cpu_to_le16(i);
+ tx_desc->qw1.ts[0] = 0;
+ tx_desc->qw1.ts[1] = 0;
+ tx_desc->qw1.ts[2] = 0;
+ tx_desc->qw1.cmd_dtype = cmd;
+#endif
+}
+
/**
* idpf_xdp_tx_xmit - produce a single HW Tx descriptor out of XDP desc
* @desc: XDP descriptor to pull the DMA address and length from
@@ -34,6 +66,14 @@ static inline void idpf_xdp_tx_xmit(struct libeth_xdp_tx_desc desc, u32 i,
struct idpf_flex_tx_desc *tx_desc = sq->descs;
u32 cmd;
+ if (static_branch_unlikely(&idpf_xdp_fb) &&
+ idpf_queue_has(FLOW_SCH_EN,
+ libeth_xdpsq_to_sq(sq, struct idpf_tx_queue,
+ next_to_use))) {
+ idpf_xdp_tx_xmit_fb(desc, i, sq, priv);
+ return;
+ }
+
cmd = FIELD_PREP(IDPF_FLEX_TXD_QW1_DTYPE_M,
IDPF_TX_DESC_DTYPE_FLEX_L2TAG1_L2TAG2);
if (desc.flags & LIBETH_XDP_TX_LAST)
@@ -53,10 +93,27 @@ static inline void idpf_xdp_tx_xmit(struct libeth_xdp_tx_desc desc, u32 i,
#endif
}
+static inline void idpf_xdpsq_set_rs_fb(const struct idpf_tx_queue *xdpsq)
+{
+ u32 n = min(xdpsq->pending, xdpsq->desc_count - xdpsq->next_to_clean);
+
+ bitmap_set(xdpsq->pending_mask, xdpsq->next_to_clean, n);
+
+ n = xdpsq->pending - n;
+ if (n)
+ bitmap_set(xdpsq->pending_mask, 0, n);
+}
+
static inline void idpf_xdpsq_set_rs(const struct idpf_tx_queue *xdpsq)
{
u32 ntu, cmd;
+ if (static_branch_unlikely(&idpf_xdp_fb) &&
+ idpf_queue_has(FLOW_SCH_EN, xdpsq)) {
+ idpf_xdpsq_set_rs_fb(xdpsq);
+ return;
+ }
+
ntu = xdpsq->next_to_use;
if (unlikely(!ntu))
ntu = xdpsq->desc_count;
@@ -84,7 +141,8 @@ static inline void idpf_xdpsq_update_tail(const struct idpf_tx_queue *xdpsq)
* Set the RS bit ("end of batch"), bump the tail, and queue the cleanup timer.
* To be called after a NAPI polling loop, at the end of .ndo_xdp_xmit() etc.
*/
-static inline void idpf_xdp_tx_finalize(void *_xdpsq, bool sent, bool flush)
+static __always_inline void idpf_xdp_tx_finalize(void *_xdpsq, bool sent,
+ bool flush)
{
struct idpf_tx_queue *xdpsq = _xdpsq;
diff --git a/include/net/libeth/xdp.h b/include/net/libeth/xdp.h
index 898723ab62e812..ed61d83bda2d77 100644
--- a/include/net/libeth/xdp.h
+++ b/include/net/libeth/xdp.h
@@ -430,6 +430,19 @@ struct libeth_xdpsq {
struct libeth_xdpsq_lock *lock;
};
+/**
+ * libeth_xdpsq_to_sq - get SQ pointer from an XDPSQ pointer
+ * @xdpsq: &libeth_xdpsq corresponding to the queue
+ * @type: typeof() of the driver Tx queue structure
+ * @member: name of the NTU field inside @type
+ *
+ * Some of the sending callbacks take only &libeth_xdpsq pointer and no pointer
+ * to the actual driver Tx queue structure. Use this helper to quickly jump to
+ * the latter when needed.
+ */
+#define libeth_xdpsq_to_sq(xdpsq, type, member) \
+ container_of_const((xdpsq)->ntu, type, member)
+
/**
* struct libeth_xdp_tx_desc - abstraction for an XDP Tx descriptor
* @addr: DMA address of the frame
|
| 3/2 | 2026/07/09 09:28 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 7479 output: 35 thoughts: 347 Thoughts: **Analyzing the IDPF XDP Fallback Patch** Okay, so I've got this patch – seems like it introduces a fallback mode for XDP Tx in the Intel IDPF driver, which is interesting. It's touching `idpf_txrx.c`, `idpf_txrx.h`, `xdp.c`, `xdp.h`, and `include/net/libeth/xdp.h`, so it's definitely digging into the core XDP Tx path for this driver. My immediate thought is, can we actually *reach* this in a virtualized environment? IDPF, if I remember correctly, is the "Intel Core NIC Family" driver – a PCI device driver. The real question is, can we realistically emulate or fuzz this? Standard environments like GCE or QEMU typically don't expose PCI devices unless they're explicitly emulated. Syzkaller *does* have some support for fuzzing PCI devices via vPCI or similar, but the real benefit is in drivers that can be triggered through software interfaces or have an emulator. For this case, I'd need to confirm if there is a way to instantiate one, since IDPF is typically a physical NIC driver. I need to quickly confirm whether an IDPF emulator is available or if it's purely hardware. Wait, let me check – is IDPF even a virtual device? "Intel Infrastructure Data Plane Function," that could be either. I need to check the Kconfig to be sure. |
| 4/2 | 2026/07/09 09:28 | tool | grepper |
0mArgs:{
"Expression": "config IDPF",
"PathPrefix": "drivers/net/ethernet/intel/idpf/"
}Results: {
"Output": "drivers/net/ethernet/intel/idpf/Kconfig-3-\ndrivers/net/ethernet/intel/idpf/Kconfig:4:config IDPF\ndrivers/net/ethernet/intel/idpf/Kconfig-5-\ttristate \"Intel(R) Infrastructure Data Path Function Support\"\n--\ndrivers/net/ethernet/intel/idpf/Kconfig=17=if IDPF\ndrivers/net/ethernet/intel/idpf/Kconfig-18-\ndrivers/net/ethernet/intel/idpf/Kconfig:19:config IDPF_SINGLEQ\ndrivers/net/ethernet/intel/idpf/Kconfig-20-\tbool \"idpf singleq support\"\n"
} |
| 5/2 | 2026/07/09 09:28 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 8356 output: 40 thoughts: 11 Thoughts: Okay, here's my take on those thoughts, tailored for an expert audience: **Analyzing the IDPF Kconfig** Right, let's dive in. My immediate thought is, "Let's crack open the Kconfig for IDPF and see what goodies are hidden within." I'm mentally parsing the implied goals here: is this a specific module? Or an overarching configuration scheme? Given my background, I'm expecting this to be the core of the configuration for a particular Integrated Development Platform Framework (IDPF), or a similar system. I want to quickly understand the exposed options, dependencies, and any potential feature flags that are relevant to my current project. Specifically, I'm looking for clues about the supported hardware targets, the available security features, and how modular the IDPF is. My experience tells me that a solid understanding of this Kconfig file is going to be paramount to any kind of effective implementation or customization, so let's get to work and understand the options! |
| 6/2 | 2026/07/09 09:28 | tool | read-file |
0mArgs:{
"File": "drivers/net/ethernet/intel/idpf/Kconfig",
"FirstLine": 1,
"LineCount": 30
}Results: {
"Contents": " 1:\t# SPDX-License-Identifier: GPL-2.0-only\n 2:\t# Copyright (C) 2024 Intel Corporation\n 3:\t\n 4:\tconfig IDPF\n 5:\t\ttristate \"Intel(R) Infrastructure Data Path Function Support\"\n 6:\t\tdepends on PCI_MSI\n 7:\t\tdepends on PTP_1588_CLOCK_OPTIONAL\n 8:\t\tselect DIMLIB\n 9:\t\tselect LIBETH_XDP\n 10:\t\thelp\n 11:\t\t This driver supports Intel(R) Infrastructure Data Path Function\n 12:\t\t devices.\n 13:\t\n 14:\t\t To compile this driver as a module, choose M here. The module\n 15:\t\t will be called idpf.\n 16:\t\n 17:\tif IDPF\n 18:\t\n 19:\tconfig IDPF_SINGLEQ\n 20:\t\tbool \"idpf singleq support\"\n 21:\t\thelp\n 22:\t\t This option enables support for legacy single Rx/Tx queues w/no\n 23:\t\t completion and fill queues. Only enable if you have hardware which\n 24:\t\t wants to work in this mode as it increases the driver size and adds\n 25:\t\t runtme checks on hotpath.\n 26:\t\n 27:\tendif # IDPF\n"
} |
| 7/2 | 2026/07/09 09:28 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 8963 output: 30 thoughts: 114 Thoughts: **Fuzzing a PCI Device Driver: Initial Assessment** Okay, so I'm looking at a PCI device driver. The immediate question in my mind, as always, is whether or not this can be effectively fuzzed in a virtualized environment. With my experience, I know that these hardware-specific drivers, those that *demand* a real PCI device and don't have a reliable emulator within QEMU or syzkaller, are typically a pain. The `probe` function just won't succeed, and, consequently, the network device (netdev) it's trying to register will never appear. It's a dead end, generally. So, the next obvious check is whether there's an emulator for this specific type of device – an IDPF emulator – within QEMU. I *think* I recall looking for something like that before, and I don't recall it existing. But it's worth double-checking. If QEMU is a dead end, the next place to look is syzkaller. Does syzkaller offer any specialized support for IDPF that I'm overlooking? That would be a huge time saver. It’s the obvious route to success. |
| 8/2 | 2026/07/09 09:28 | tool | grepper |
0mError:no matches Args: {
"Expression": "idpf",
"PathPrefix": "tools/testing/selftests/"
}Results: {
"error": "no matches"
} |
| 9/2 | 2026/07/09 09:28 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 9375 output: 93 thoughts: 562 Thoughts: **Reaching the IDPF Driver: A Fuzzing Perspective** Okay, let's see how we can get to this code. It's buried in `drivers/net/ethernet/intel/idpf/`. The key question is whether it's even *reachable* in a standard fuzzing setup. If there's no hardware present, the driver will simply sit there, inert. My initial thought was to see if syzkaller has some kind of hook, maybe something like `syz_pci_device` to trigger it. I remember it has a bunch of hooks for different subsystems like USB (`syz_usb_connect`), 802.11 (`syz_80211_inject_frame`), genetlink (`syz_genetlink_get_family`), and mounting images (`syz_mount_image`). But, does syzkaller have an explicit primitive for PCI devices? Wait, *does* syzkaller have `syz_pci_device`? No, that's not right. `syz_kvm_setup_cpu` is as close as it gets. Okay, wait, *does* syzkaller have `syz_pci_device`? No, it doesn't. It *does* fuzz some PCI drivers if they are exposed through some virtual bus, but that's usually not the case. Let me double-check - does syzkaller have a `syz_pci_device`? Nope, nothing. Ah, right, the prompt. I have to consider this: "Return WorthFuzzing=false if the patch only contains: ... - 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)." The IDPF is an *actual* Intel NIC; it's a physical device. And QEMU, in a standard setup (or GCE for that matter) doesn't emulate the IDPF. We're talking about a hardware device like Intel's IPU (Infrastructure Processing Unit) "Mount Evans." This isn't like an e1000 or virtio-net, or even a software-emulated USB gadget. QEMU does emulate some NICs, but not IDPF; it emulates things like e1000, e1000e, igb, rtl8139, pcnet, ne2k_pci, vmxnet3, virtio-net, tulip. So, any code specific to IDPF is effectively unreachable in those environments. Is there a virtual bus? No, IDPF is hardware specific. Therefore, I'm concluding that this patch isn't WorthFuzzing. The code paths are *impossible* to hit in a QEMU or GCE environment because the IDPF is a hardware-specific driver that isn't emulated. |
| 10/2 | 2026/07/09 09:29 | tool | set-results |
0mArgs:{
"EnableConfigs": [],
"FocusSymbols": [],
"Reasoning": "The patch modifies the Intel IDPF (Infrastructure Data Path Function) driver. This is a hardware-specific PCI network driver for Intel IPUs. Since there is no software emulator for this hardware in standard virtualized environments (like QEMU or GCE), the modified code paths are unreachable during fuzzing.",
"WorthFuzzing": false
}Results: {
"EnableConfigs": null,
"FocusSymbols": [],
"Reasoning": "The patch modifies the Intel IDPF (Infrastructure Data Path Function) driver. This is a hardware-specific PCI network driver for Intel IPUs. Since there is no software emulator for this hardware in standard virtualized environments (like QEMU or GCE), the modified code paths are unreachable during fuzzing.",
"WorthFuzzing": false
} |
| Total Calls | Total Tokens | Avg Tokens | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|
| Total Calls | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|