| Seq | Timestamp | Type | Name | Duration |
|---|---|---|---|---|
| 0/0 | 2026/08/25 05:57 | flow | patch-triage |
0mArgs:null Results: {
"EnableConfigs": null,
"FocusSymbols": [],
"KMSANReasoning": "",
"NeedsKMSAN": false,
"Reasoning": "The patch modifies the Marvell OcteonTX2 driver, which is a vendor-specific PCIe hardware driver. This hardware is not emulated in standard QEMU, making the code unreachable in virtualized fuzzing environments.",
"WorthFuzzing": false
} |
| 1/1 | 2026/08/25 05:57 | action | read-patch-diff |
0mArgs:null Results: {
"PatchDiff": "commit 5ec77f28bf52c4d8acab7957bf730df9a9d92113\nAuthor: syz-cluster \u003ctriage@syzkaller.com\u003e\nDate: Tue Aug 25 05:57:28 2026 +0000\n\n syz-cluster: applied patch under review\n\ndiff --git a/drivers/net/ethernet/marvell/octeontx2/af/common.h b/drivers/net/ethernet/marvell/octeontx2/af/common.h\nindex 779413a383b74..30dd882a01497 100644\n--- a/drivers/net/ethernet/marvell/octeontx2/af/common.h\n+++ b/drivers/net/ethernet/marvell/octeontx2/af/common.h\n@@ -7,6 +7,10 @@\n #ifndef COMMON_H\n #define COMMON_H\n \n+#include \u003clinux/dma-mapping.h\u003e\n+#include \u003clinux/gfp.h\u003e\n+#include \u003clinux/mm.h\u003e\n+\n #include \"rvu_struct.h\"\n \n #define OTX2_ALIGN\t\t\t128 /* Align to cacheline */\n@@ -44,6 +48,70 @@ struct qmem {\n \tu32\t\tqsize;\n };\n \n+/* dma_alloc_coherent()/dma_free_coherent() equivalents backed by\n+ * __get_free_pages(). The region is mapped for DMA with\n+ * dma_map_page()/dma_unmap_page().\n+ */\n+static inline void *otx2_dma_alloc_coherent(struct device *dev, size_t size,\n+\t\t\t\t\t dma_addr_t *dma_handle, gfp_t gfp)\n+{\n+\tdma_addr_t dma_addr;\n+\tunsigned int order;\n+\tphys_addr_t paddr;\n+\tstruct page *page;\n+\tvoid *vaddr;\n+\tu64 mask;\n+\n+\tif (!dev || !dma_handle || !size)\n+\t\treturn NULL;\n+\n+\tsize = PAGE_ALIGN(size);\n+\torder = get_order(size);\n+\tif (order \u003e MAX_PAGE_ORDER)\n+\t\treturn NULL;\n+\n+\tgfp |= __GFP_COMP | __GFP_ZERO | __GFP_RECLAIM;\n+\tvaddr = (void *)__get_free_pages(gfp, order);\n+\tif (!vaddr)\n+\t\treturn NULL;\n+\n+\tpaddr = virt_to_phys((void *)vaddr);\n+\tmask = dma_get_required_mask(dev);\n+\tif (paddr + size \u003e mask) {\n+\t\tfree_pages((unsigned long)vaddr, order);\n+\t\tgfp |= GFP_DMA32;\n+\n+\t\tvaddr = (void *)__get_free_pages(gfp, order);\n+\t\tif (!vaddr)\n+\t\t\treturn NULL;\n+\t}\n+\n+\tpage = virt_to_page(vaddr);\n+\tdma_addr = dma_map_page(dev, page, 0, size, DMA_BIDIRECTIONAL);\n+\tif (dma_mapping_error(dev, dma_addr)) {\n+\t\tfree_pages((unsigned long)vaddr, order);\n+\t\treturn NULL;\n+\t}\n+\n+\t*dma_handle = dma_addr;\n+\treturn vaddr;\n+}\n+\n+static inline void otx2_dma_free_coherent(struct device *dev, size_t size,\n+\t\t\t\t\t void *vaddr, dma_addr_t dma_handle)\n+{\n+\tunsigned int order;\n+\n+\tif (!dev || !vaddr)\n+\t\treturn;\n+\n+\tsize = PAGE_ALIGN(size);\n+\torder = get_order(size);\n+\n+\tdma_unmap_page(dev, dma_handle, size, DMA_BIDIRECTIONAL);\n+\tfree_pages((unsigned long)vaddr, order);\n+}\n+\n static inline int qmem_alloc(struct device *dev, struct qmem **q,\n \t\t\t int qsize, int entry_sz)\n {\n@@ -60,8 +128,8 @@ static inline int qmem_alloc(struct device *dev, struct qmem **q,\n \n \tqmem-\u003eentry_sz = entry_sz;\n \tqmem-\u003ealloc_sz = (qsize * entry_sz) + OTX2_ALIGN;\n-\tqmem-\u003ebase = dma_alloc_attrs(dev, qmem-\u003ealloc_sz, \u0026qmem-\u003eiova,\n-\t\t\t\t GFP_KERNEL, DMA_ATTR_FORCE_CONTIGUOUS);\n+\tqmem-\u003ebase = otx2_dma_alloc_coherent(dev, qmem-\u003ealloc_sz, \u0026qmem-\u003eiova,\n+\t\t\t\t\t GFP_KERNEL);\n \tif (!qmem-\u003ebase)\n \t\treturn -ENOMEM;\n \n@@ -80,10 +148,9 @@ static inline void qmem_free(struct device *dev, struct qmem *qmem)\n \t\treturn;\n \n \tif (qmem-\u003ebase)\n-\t\tdma_free_attrs(dev, qmem-\u003ealloc_sz,\n-\t\t\t qmem-\u003ebase - qmem-\u003ealign,\n-\t\t\t qmem-\u003eiova - qmem-\u003ealign,\n-\t\t\t DMA_ATTR_FORCE_CONTIGUOUS);\n+\t\totx2_dma_free_coherent(dev, qmem-\u003ealloc_sz,\n+\t\t\t\t qmem-\u003ebase - qmem-\u003ealign,\n+\t\t\t\t qmem-\u003eiova - qmem-\u003ealign);\n \tdevm_kfree(dev, qmem);\n }\n \n"
} |
| 2/1 | 2026/08/25 05:57 | agent | patch-evaluator |
0mModel:best-expensive Args: null Results: {
"EnableConfigs": null,
"FocusSymbols": [],
"Reasoning": "The patch modifies the Marvell OcteonTX2 driver, which is a vendor-specific PCIe hardware driver. This hardware is not emulated in standard QEMU, making the code unreachable in virtualized fuzzing environments.",
"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). - Code in vendor-specific PCIe switch, SmartNIC, or GPU drivers (e.g., mlxsw, pds_core, qed, ionic, amdgpu) that require physical PCIe hardware cards not emulated in standard QEMU. - Driver .remove, .shutdown, or pci_unregister_driver teardown callbacks (e.g., igb_remove) that are executed only during PCI hot-unplug or sysfs driver unbind operations. 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. Prefer non-static, non-inlined API entrypoint functions over internal static helper functions (which are inlined by the compiler and do not have distinct symbol addresses). 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. Also check "depends on" lines in Kconfig to include any non-standard parent subsystem configs needed for Kbuild to compile the code statically into vmlinux. 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 5ec77f28bf52c4d8acab7957bf730df9a9d92113
Author: syz-cluster <triage@syzkaller.com>
Date: Tue Aug 25 05:57:28 2026 +0000
syz-cluster: applied patch under review
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/common.h b/drivers/net/ethernet/marvell/octeontx2/af/common.h
index 779413a383b74..30dd882a01497 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/common.h
+++ b/drivers/net/ethernet/marvell/octeontx2/af/common.h
@@ -7,6 +7,10 @@
#ifndef COMMON_H
#define COMMON_H
+#include <linux/dma-mapping.h>
+#include <linux/gfp.h>
+#include <linux/mm.h>
+
#include "rvu_struct.h"
#define OTX2_ALIGN 128 /* Align to cacheline */
@@ -44,6 +48,70 @@ struct qmem {
u32 qsize;
};
+/* dma_alloc_coherent()/dma_free_coherent() equivalents backed by
+ * __get_free_pages(). The region is mapped for DMA with
+ * dma_map_page()/dma_unmap_page().
+ */
+static inline void *otx2_dma_alloc_coherent(struct device *dev, size_t size,
+ dma_addr_t *dma_handle, gfp_t gfp)
+{
+ dma_addr_t dma_addr;
+ unsigned int order;
+ phys_addr_t paddr;
+ struct page *page;
+ void *vaddr;
+ u64 mask;
+
+ if (!dev || !dma_handle || !size)
+ return NULL;
+
+ size = PAGE_ALIGN(size);
+ order = get_order(size);
+ if (order > MAX_PAGE_ORDER)
+ return NULL;
+
+ gfp |= __GFP_COMP | __GFP_ZERO | __GFP_RECLAIM;
+ vaddr = (void *)__get_free_pages(gfp, order);
+ if (!vaddr)
+ return NULL;
+
+ paddr = virt_to_phys((void *)vaddr);
+ mask = dma_get_required_mask(dev);
+ if (paddr + size > mask) {
+ free_pages((unsigned long)vaddr, order);
+ gfp |= GFP_DMA32;
+
+ vaddr = (void *)__get_free_pages(gfp, order);
+ if (!vaddr)
+ return NULL;
+ }
+
+ page = virt_to_page(vaddr);
+ dma_addr = dma_map_page(dev, page, 0, size, DMA_BIDIRECTIONAL);
+ if (dma_mapping_error(dev, dma_addr)) {
+ free_pages((unsigned long)vaddr, order);
+ return NULL;
+ }
+
+ *dma_handle = dma_addr;
+ return vaddr;
+}
+
+static inline void otx2_dma_free_coherent(struct device *dev, size_t size,
+ void *vaddr, dma_addr_t dma_handle)
+{
+ unsigned int order;
+
+ if (!dev || !vaddr)
+ return;
+
+ size = PAGE_ALIGN(size);
+ order = get_order(size);
+
+ dma_unmap_page(dev, dma_handle, size, DMA_BIDIRECTIONAL);
+ free_pages((unsigned long)vaddr, order);
+}
+
static inline int qmem_alloc(struct device *dev, struct qmem **q,
int qsize, int entry_sz)
{
@@ -60,8 +128,8 @@ static inline int qmem_alloc(struct device *dev, struct qmem **q,
qmem->entry_sz = entry_sz;
qmem->alloc_sz = (qsize * entry_sz) + OTX2_ALIGN;
- qmem->base = dma_alloc_attrs(dev, qmem->alloc_sz, &qmem->iova,
- GFP_KERNEL, DMA_ATTR_FORCE_CONTIGUOUS);
+ qmem->base = otx2_dma_alloc_coherent(dev, qmem->alloc_sz, &qmem->iova,
+ GFP_KERNEL);
if (!qmem->base)
return -ENOMEM;
@@ -80,10 +148,9 @@ static inline void qmem_free(struct device *dev, struct qmem *qmem)
return;
if (qmem->base)
- dma_free_attrs(dev, qmem->alloc_sz,
- qmem->base - qmem->align,
- qmem->iova - qmem->align,
- DMA_ATTR_FORCE_CONTIGUOUS);
+ otx2_dma_free_coherent(dev, qmem->alloc_sz,
+ qmem->base - qmem->align,
+ qmem->iova - qmem->align);
devm_kfree(dev, qmem);
}
|
| 3/2 | 2026/08/25 05:57 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 3119 output: 48 thoughts: 192 Thoughts: **Analyzing a Marvell OcteonTX2 Driver Patch** Okay, so this patch is touching `drivers/net/ethernet/marvell/octeontx2/af/common.h`. Right off the bat, I see it's replacing `dma_alloc_attrs` with this custom `otx2_dma_alloc_coherent`. And it's using `__get_free_pages` and `dma_map_page` underneath. This looks like a memory allocation optimization, specifically tailored for the Marvell OcteonTX2. Given my experience, I'm already thinking about potential performance implications of this change – good or bad, I'll need to dig deeper. My immediate question is, how relevant is this driver in a virtualized context? The OcteonTX2 is typically specific hardware, an SoC or NIC. I need to figure out if this is a PCI or platform driver. A quick check of the path, `drivers/net/ethernet/marvell/octeontx2/af/`, indicates that this is definitely for the network side of things. Let me quickly grep for `pci_driver` or `platform_driver` within that directory and see what I find. That will give me a better understanding of how this driver is attached to the system and therefore the significance of this patch within the driver architecture. |
| 4/2 | 2026/08/25 05:57 | tool | grepper |
0mArgs:{
"Expression": "(pci_driver|platform_driver)",
"PathPrefix": "drivers/net/ethernet/marvell/octeontx2/af/"
}Results: {
"Output": "drivers/net/ethernet/marvell/octeontx2/af/cgx.c=2060=static void cgx_remove(struct pci_dev *pdev)\n--\ndrivers/net/ethernet/marvell/octeontx2/af/cgx.c-2073-\ndrivers/net/ethernet/marvell/octeontx2/af/cgx.c:2074:struct pci_driver cgx_driver = {\ndrivers/net/ethernet/marvell/octeontx2/af/cgx.c-2075-\t.name = DRV_NAME,\n--\ndrivers/net/ethernet/marvell/octeontx2/af/cgx.h=132=struct cgx_event_cb {\n--\ndrivers/net/ethernet/marvell/octeontx2/af/cgx.h-136-\ndrivers/net/ethernet/marvell/octeontx2/af/cgx.h:137:extern struct pci_driver cgx_driver;\ndrivers/net/ethernet/marvell/octeontx2/af/cgx.h-138-\n--\ndrivers/net/ethernet/marvell/octeontx2/af/mcs.c=1599=static void mcs_remove(struct pci_dev *pdev)\n--\ndrivers/net/ethernet/marvell/octeontx2/af/mcs.c-1611-\ndrivers/net/ethernet/marvell/octeontx2/af/mcs.c:1612:struct pci_driver mcs_driver = {\ndrivers/net/ethernet/marvell/octeontx2/af/mcs.c-1613-\t.name = DRV_NAME,\n--\ndrivers/net/ethernet/marvell/octeontx2/af/mcs.h=155=struct mcs_ops {\n--\ndrivers/net/ethernet/marvell/octeontx2/af/mcs.h-164-\ndrivers/net/ethernet/marvell/octeontx2/af/mcs.h:165:extern struct pci_driver mcs_driver;\ndrivers/net/ethernet/marvell/octeontx2/af/mcs.h-166-\n--\ndrivers/net/ethernet/marvell/octeontx2/af/ptp.c=589=static const struct pci_device_id ptp_id_table[] = {\n--\ndrivers/net/ethernet/marvell/octeontx2/af/ptp.c-611-\ndrivers/net/ethernet/marvell/octeontx2/af/ptp.c:612:struct pci_driver ptp_driver = {\ndrivers/net/ethernet/marvell/octeontx2/af/ptp.c-613-\t.name = DRV_NAME,\n--\ndrivers/net/ethernet/marvell/octeontx2/af/ptp.h=29=void ptp_start(struct rvu *rvu, u64 sclk, u32 ext_clk_freq, u32 extts);\ndrivers/net/ethernet/marvell/octeontx2/af/ptp.h-30-\ndrivers/net/ethernet/marvell/octeontx2/af/ptp.h:31:extern struct pci_driver ptp_driver;\ndrivers/net/ethernet/marvell/octeontx2/af/ptp.h-32-\n--\ndrivers/net/ethernet/marvell/octeontx2/af/rvu.c=3738=static void rvu_shutdown(struct pci_dev *pdev)\n--\ndrivers/net/ethernet/marvell/octeontx2/af/rvu.c-3747-\ndrivers/net/ethernet/marvell/octeontx2/af/rvu.c:3748:static struct pci_driver rvu_driver = {\ndrivers/net/ethernet/marvell/octeontx2/af/rvu.c-3749-\t.name = DRV_NAME,\n"
} |
| 5/2 | 2026/08/25 05:57 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 4699 output: 77 thoughts: 134 Thoughts: **PCI Driver Worthiness Assessment** Okay, so I'm looking at this patch for a PCI driver. Specifically, it's for Marvell OcteonTX2 hardware. The instructions are clear: if the patch only touches vendor-specific PCIe drivers that need *actual* physical PCIe cards, things that aren't emulated in standard QEMU, then we shouldn't consider it for fuzzing. Let's break this down. The Marvell OcteonTX2 is definitely vendor-specific hardware. And from my understanding of the system, it *absolutely* needs those physical PCIe cards to function properly. Standard QEMU just isn't going to cut it for this. This isn't something we can easily set up for fuzzing. Therefore, according to the guidelines, the answer is pretty clear. I'm going to set `WorthFuzzing=false`. It's not a good use of resources to try and fuzz something that's dependent on hardware we can't easily emulate. |
| 6/2 | 2026/08/25 05:57 | tool | set-results |
0mArgs:{
"EnableConfigs": [],
"FocusSymbols": [],
"Reasoning": "The patch modifies the Marvell OcteonTX2 driver, which is a vendor-specific PCIe hardware driver. This hardware is not emulated in standard QEMU, making the code unreachable in virtualized fuzzing environments.",
"WorthFuzzing": false
}Results: {
"EnableConfigs": null,
"FocusSymbols": [],
"Reasoning": "The patch modifies the Marvell OcteonTX2 driver, which is a vendor-specific PCIe hardware driver. This hardware is not emulated in standard QEMU, making the code unreachable in virtualized fuzzing environments.",
"WorthFuzzing": false
} |
| 7/1 | 2026/08/25 05:57 | action | If |
0mArgs:{
"WorthFuzzing": false
}Results: null |
| Total Calls | Total Tokens | Avg Tokens | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|
| Total Calls | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|