| Seq | Timestamp | Type | Name | Duration |
|---|---|---|---|---|
| 0/0 | 2026/08/06 09:06 | flow | patch-triage |
0mArgs:null Results: {
"EnableConfigs": null,
"FocusSymbols": [
"copy_process",
"kernel_clone"
],
"Reasoning": "The patch modifies `copy_process` to change how `default_timer_slack_ns` is inherited for tasks with real-time or deadline scheduling policies. This is a functional change in core kernel process creation logic that can be reached via `clone`, `fork`, or `vfork` syscalls.",
"WorthFuzzing": true
} |
| 1/1 | 2026/08/06 09:06 | action | read-patch-diff |
0mArgs:null Results: {
"PatchDiff": "commit b55ec0f3df368402e6ea05effc62cad79b26ec9f\nAuthor: syz-cluster \u003ctriage@syzkaller.com\u003e\nDate: Thu Aug 6 09:06:13 2026 +0000\n\n syz-cluster: applied patch under review\n\ndiff --git a/kernel/fork.c b/kernel/fork.c\nindex 65113a304518a..bc4df18bfd907 100644\n--- a/kernel/fork.c\n+++ b/kernel/fork.c\n@@ -23,6 +23,7 @@\n #include \u003clinux/sched/task_stack.h\u003e\n #include \u003clinux/sched/cputime.h\u003e\n #include \u003clinux/sched/ext.h\u003e\n+#include \u003clinux/sched/rt.h\u003e\n #include \u003clinux/seq_file.h\u003e\n #include \u003clinux/rtmutex.h\u003e\n #include \u003clinux/init.h\u003e\n@@ -2133,7 +2134,10 @@ __latent_entropy struct task_struct *copy_process(\n \tretval = -EAGAIN;\n #endif\n \n-\tp-\u003edefault_timer_slack_ns = current-\u003etimer_slack_ns;\n+\tif (rt_or_dl_task_policy(current))\n+\t\tp-\u003edefault_timer_slack_ns = current-\u003edefault_timer_slack_ns;\n+\telse\n+\t\tp-\u003edefault_timer_slack_ns = current-\u003etimer_slack_ns;\n \n #ifdef CONFIG_PSI\n \tp-\u003epsi_flags = 0;\n"
} |
| 2/1 | 2026/08/06 09:06 | agent | patch-evaluator |
0mModel:best-expensive Args: null Results: {
"EnableConfigs": null,
"FocusSymbols": [
"copy_process",
"kernel_clone"
],
"Reasoning": "The patch modifies `copy_process` to change how `default_timer_slack_ns` is inherited for tasks with real-time or deadline scheduling policies. This is a functional change in core kernel process creation logic that can be reached via `clone`, `fork`, or `vfork` syscalls.",
"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). - 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 b55ec0f3df368402e6ea05effc62cad79b26ec9f
Author: syz-cluster <triage@syzkaller.com>
Date: Thu Aug 6 09:06:13 2026 +0000
syz-cluster: applied patch under review
diff --git a/kernel/fork.c b/kernel/fork.c
index 65113a304518a..bc4df18bfd907 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -23,6 +23,7 @@
#include <linux/sched/task_stack.h>
#include <linux/sched/cputime.h>
#include <linux/sched/ext.h>
+#include <linux/sched/rt.h>
#include <linux/seq_file.h>
#include <linux/rtmutex.h>
#include <linux/init.h>
@@ -2133,7 +2134,10 @@ __latent_entropy struct task_struct *copy_process(
retval = -EAGAIN;
#endif
- p->default_timer_slack_ns = current->timer_slack_ns;
+ if (rt_or_dl_task_policy(current))
+ p->default_timer_slack_ns = current->default_timer_slack_ns;
+ else
+ p->default_timer_slack_ns = current->timer_slack_ns;
#ifdef CONFIG_PSI
p->psi_flags = 0;
|
| 3/2 | 2026/08/06 09:06 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 2160 output: 28 thoughts: 249 Thoughts: **Analyzing a Kernel Patch in `kernel/fork.c`** Okay, so I'm looking at this patch in `kernel/fork.c`, specifically a modification to the `copy_process()` function. My immediate thought is, this is a change to core process creation, something that's called during `fork`, `clone`, the whole shebang. The change itself seems straightforward – we're altering how `p->default_timer_slack_ns` is initialized when a new process is created. Previously, it was just copied from the parent's `current->timer_slack_ns`. Now, the code checks if the parent has a real-time or deadline task policy using `rt_or_dl_task_policy(current)`. If it does, the new process inherits `current->default_timer_slack_ns` instead. Otherwise, it retains the original behavior. This is immediately sparking some ideas in my head. This is a potential area for subtle behavior changes, and definitely something I'd want to fuzz thoroughly. `copy_process()` is a tricky function, and any change to its logic warrants extra attention. The question that comes to mind right away is: is `copy_process` static? Because if it is, fuzzing it becomes a bit harder. Let me just glance at `kernel/fork.c` to confirm. |
| 4/2 | 2026/08/06 09:06 | tool | grepper |
0mArgs:{
"Expression": "copy_process",
"PathPrefix": "kernel/fork.c"
}Results: {
"Output": "kernel/fork.c=1809=init_task_pid(struct task_struct *task, enum pid_type type, struct pid *pid)\n--\nkernel/fork.c-1816-\nkernel/fork.c:1817:static inline void rcu_copy_process(struct task_struct *p)\nkernel/fork.c-1818-{\n--\nkernel/fork.c=1950=static bool need_futex_hash_allocate_default(u64 clone_flags)\n--\nkernel/fork.c-1964- */\nkernel/fork.c:1965:__latent_entropy struct task_struct *copy_process(\nkernel/fork.c-1966-\t\t\t\t\tstruct pid *pid,\n--\nkernel/fork.c-2097-\t/*\nkernel/fork.c:2098:\t * If multiple threads are within copy_process(), then this check\nkernel/fork.c-2099-\t * triggers too late. This doesn't hurt, the check is only there\n--\nkernel/fork.c-2110-\tINIT_LIST_HEAD(\u0026p-\u003esibling);\nkernel/fork.c:2111:\trcu_copy_process(p);\nkernel/fork.c-2112-\tp-\u003evfork_done = NULL;\n--\nkernel/fork.c-2388-\nkernel/fork.c:2389:\tklp_copy_process(p);\nkernel/fork.c-2390-\n--\nkernel/fork.c-2474-\ttrace_task_newtask(p, clone_flags);\nkernel/fork.c:2475:\tuprobe_copy_process(p, clone_flags);\nkernel/fork.c-2476-\tuser_events_fork(p, clone_flags);\n--\nkernel/fork.c=2568=struct task_struct * __init fork_idle(int cpu)\n--\nkernel/fork.c-2578-\nkernel/fork.c:2579:\ttask = copy_process(\u0026init_struct_pid, 0, cpu_to_node(cpu), \u0026args);\nkernel/fork.c-2580-\tif (!IS_ERR(task)) {\n--\nkernel/fork.c=2594=struct task_struct *create_io_thread(int (*fn)(void *), void *arg, int node)\n--\nkernel/fork.c-2605-\nkernel/fork.c:2606:\treturn copy_process(NULL, 0, node, \u0026args);\nkernel/fork.c-2607-}\n--\nkernel/fork.c=2617=pid_t kernel_clone(struct kernel_clone_args *args)\n--\nkernel/fork.c-2657-\nkernel/fork.c:2658:\tp = copy_process(NULL, trace, NUMA_NO_NODE, args);\nkernel/fork.c-2659-\tadd_latent_entropy();\n"
} |
| 5/2 | 2026/08/06 09:06 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 3478 output: 34 thoughts: 79 Thoughts: Okay, let me break this down. **Diving into the `copy_process` Function** My initial thought is that `copy_process` isn't a static function, but it's not immediately obvious if it's exported either. A quick scan suggests it *shouldn't* be static. Ah, okay, so it's *not* static within `kernel/fork.c`, that's a good start. Let's see... looking at the declaration: `__latent_entropy struct task_struct *copy_process(`. Wait, no `static` keyword prepended to it? Good, confirmation. Let me confirm, Line 1965. Okay, good. That's a key detail to understand how it's integrated into the kernel's process management. |
| 6/2 | 2026/08/06 09:06 | tool | read-file |
0mArgs:{
"File": "kernel/fork.c",
"FirstLine": 1960,
"LineCount": 10
}Results: {
"Contents": "1960:\t *\n1961:\t * It copies the registers, and all the appropriate\n1962:\t * parts of the process environment (as per the clone\n1963:\t * flags). The actual kick-off is left to the caller.\n1964:\t */\n1965:\t__latent_entropy struct task_struct *copy_process(\n1966:\t\t\t\t\t\tstruct pid *pid,\n1967:\t\t\t\t\t\tint trace,\n1968:\t\t\t\t\t\tint node,\n1969:\t\t\t\t\t\tstruct kernel_clone_args *args)\n"
} |
| 7/2 | 2026/08/06 09:06 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 3915 output: 28 thoughts: 64 Thoughts: **Delving into the Essence of the Thread Structure** Okay, so this isn't a fixed, exported structure; interesting. Its purpose becomes clear by examining its usage within the kernel. It seems to be intimately involved with the core thread lifecycle functions: `kernel_clone`, `fork_idle`, and `create_io_thread`. That's a strong indication of its fundamental importance. Since `kernel_clone` is the primary entry point for the crucial system calls `clone`, `fork`, and `vfork`, that's definitely the key starting point to understand its inner workings and relation to these functions. Let's dig into `kernel_clone` and see how it interacts with this non-static structure. That should give a clear picture of its overall purpose. |
| 8/2 | 2026/08/06 09:06 | tool | grepper |
0mArgs:{
"Expression": "kernel_clone",
"PathPrefix": "kernel/fork.c"
}Results: {
"Output": "kernel/fork.c=1965=__latent_entropy struct task_struct *copy_process(\n--\nkernel/fork.c-1968-\t\t\t\t\tint node,\nkernel/fork.c:1969:\t\t\t\t\tstruct kernel_clone_args *args)\nkernel/fork.c-1970-{\n--\nkernel/fork.c=2568=struct task_struct * __init fork_idle(int cpu)\n--\nkernel/fork.c-2570-\tstruct task_struct *task;\nkernel/fork.c:2571:\tstruct kernel_clone_args args = {\nkernel/fork.c-2572-\t\t.flags\t\t= CLONE_VM,\n--\nkernel/fork.c-2588-/*\nkernel/fork.c:2589: * This is like kernel_clone(), but shaved down and tailored to just\nkernel/fork.c-2590- * creating io_uring workers. It returns a created task, or an error pointer.\n--\nkernel/fork.c=2594=struct task_struct *create_io_thread(int (*fn)(void *), void *arg, int node)\n--\nkernel/fork.c-2597-\t\t\t CLONE_IO|CLONE_VM|CLONE_UNTRACED;\nkernel/fork.c:2598:\tstruct kernel_clone_args args = {\nkernel/fork.c-2599-\t\t.flags\t\t= flags,\n--\nkernel/fork.c-2616- */\nkernel/fork.c:2617:pid_t kernel_clone(struct kernel_clone_args *args)\nkernel/fork.c-2618-{\n--\nkernel/fork.c=2707=pid_t kernel_thread(int (*fn)(void *), void *arg, const char *name,\n--\nkernel/fork.c-2709-{\nkernel/fork.c:2710:\tstruct kernel_clone_args args = {\nkernel/fork.c-2711-\t\t.flags\t\t= ((flags | CLONE_VM | CLONE_UNTRACED) \u0026 ~CSIGNAL),\n--\nkernel/fork.c-2718-\nkernel/fork.c:2719:\treturn kernel_clone(\u0026args);\nkernel/fork.c-2720-}\n--\nkernel/fork.c=2725=pid_t user_mode_thread(int (*fn)(void *), void *arg, unsigned long flags)\nkernel/fork.c-2726-{\nkernel/fork.c:2727:\tstruct kernel_clone_args args = {\nkernel/fork.c-2728-\t\t.flags\t\t= ((flags | CLONE_VM | CLONE_UNTRACED) \u0026 ~CSIGNAL),\n--\nkernel/fork.c-2733-\nkernel/fork.c:2734:\treturn kernel_clone(\u0026args);\nkernel/fork.c-2735-}\n--\nkernel/fork.c=2738=SYSCALL_DEFINE0(fork)\n--\nkernel/fork.c-2740-#ifdef CONFIG_MMU\nkernel/fork.c:2741:\tstruct kernel_clone_args args = {\nkernel/fork.c-2742-\t\t.exit_signal = SIGCHLD,\n--\nkernel/fork.c-2744-\nkernel/fork.c:2745:\treturn kernel_clone(\u0026args);\nkernel/fork.c-2746-#else\n--\nkernel/fork.c=2754=SYSCALL_DEFINE0(vfork)\nkernel/fork.c-2755-{\nkernel/fork.c:2756:\tstruct kernel_clone_args args = {\nkernel/fork.c-2757-\t\t.flags\t\t= CLONE_VFORK | CLONE_VM,\n--\nkernel/fork.c-2760-\nkernel/fork.c:2761:\treturn kernel_clone(\u0026args);\nkernel/fork.c-2762-}\n--\nkernel/fork.c=2783=SYSCALL_DEFINE5(clone, unsigned long, clone_flags, unsigned long, newsp,\n--\nkernel/fork.c-2788-{\nkernel/fork.c:2789:\tstruct kernel_clone_args args = {\nkernel/fork.c-2790-\t\t.flags\t\t= (lower_32_bits(clone_flags) \u0026 ~CSIGNAL),\n--\nkernel/fork.c-2798-\nkernel/fork.c:2799:\treturn kernel_clone(\u0026args);\nkernel/fork.c-2800-}\n--\nkernel/fork.c-2802-\nkernel/fork.c:2803:static noinline int copy_clone_args_from_user(struct kernel_clone_args *kargs,\nkernel/fork.c-2804-\t\t\t\t\t struct clone_args __user *uargs,\n--\nkernel/fork.c-2848-\nkernel/fork.c:2849:\t*kargs = (struct kernel_clone_args){\nkernel/fork.c-2850-\t\t.flags\t\t= args.flags,\n--\nkernel/fork.c-2879- */\nkernel/fork.c:2880:static inline bool clone3_stack_valid(struct kernel_clone_args *kargs)\nkernel/fork.c-2881-{\n--\nkernel/fork.c-2899-\nkernel/fork.c:2900:static bool clone3_args_valid(struct kernel_clone_args *kargs)\nkernel/fork.c-2901-{\n--\nkernel/fork.c=2939=SYSCALL_DEFINE2(clone3, struct clone_args __user *, uargs, size_t, size)\n--\nkernel/fork.c-2942-\nkernel/fork.c:2943:\tstruct kernel_clone_args kargs;\nkernel/fork.c-2944-\tpid_t set_tid[MAX_PID_NS_LEVEL];\n--\nkernel/fork.c-2959-\nkernel/fork.c:2960:\treturn kernel_clone(\u0026kargs);\nkernel/fork.c-2961-}\n--\nkernel/fork.c=3105=static int unshare_fd(unsigned long unshare_flags, struct files_struct **new_fdp)\n--\nkernel/fork.c-3122- * context which was originally shared using clone. copy_*\nkernel/fork.c:3123: * functions used by kernel_clone() cannot be used here directly\nkernel/fork.c-3124- * because they modify an inactive task_struct that is being\n"
} |
| 9/2 | 2026/08/06 09:06 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 5840 output: 29 thoughts: 246 Thoughts: **Analyzing the Implications of this Clone Patch** Okay, so I'm looking at this patch and it's modifying `copy_process`, which is called by `kernel_clone`. Right, so `kernel_clone` is the main entry point for the clone syscall family – `fork`, `vfork`, `clone`, and `clone3`. The core of this functionality seems to be located within these functions. I need to focus on them. I was trying to determine the best symbol to focus on. This patch introduces a conditional check within `copy_process`, which is dependent on the current task's scheduling policy. It's using `rt_or_dl_task_policy(current)`. So, if the task is Real-Time (RT) or Deadline (DL) it’s going to inherit `default_timer_slack_ns` instead of `timer_slack_ns`. That's a definite functional change. Now, `copy_process` isn't exported, but it *is* called by `kernel_clone`. But, wait, `kernel_clone` isn't exported either? I need to check if these are static. Checking... Okay, `kernel_clone` isn't static. It's used by the syscalls: `fork`, `vfork`, `clone`, and `clone3`. Okay, so `kernel_clone` is used by the system calls and `copy_process` isn't static either. Yes, I'll focus on both. Next, I need to check the function `rt_or_dl_task_policy`, as this is the conditional factor. |
| 10/2 | 2026/08/06 09:06 | tool | grepper |
0mArgs:{
"Expression": "rt_or_dl_task_policy",
"PathPrefix": ""
}Results: {
"Output": "fs/proc/base.c=2597=static ssize_t timerslack_ns_write(struct file *file, const char __user *buf,\n--\nfs/proc/base.c-2629-\ttask_lock(p);\nfs/proc/base.c:2630:\tif (rt_or_dl_task_policy(p))\nfs/proc/base.c-2631-\t\tslack_ns = 0;\n--\ninclude/linux/ioprio.h=39=static inline int task_nice_ioclass(struct task_struct *task)\n--\ninclude/linux/ioprio.h-42-\t\treturn IOPRIO_CLASS_IDLE;\ninclude/linux/ioprio.h:43:\telse if (rt_or_dl_task_policy(task))\ninclude/linux/ioprio.h-44-\t\treturn IOPRIO_CLASS_RT;\n--\ninclude/linux/sched/rt.h=23=static inline bool rt_task(struct task_struct *p)\n--\ninclude/linux/sched/rt.h-29- * Returns true if a task has a priority that belongs to RT or DL classes.\ninclude/linux/sched/rt.h:30: * PI-boosted tasks will return true. Use rt_or_dl_task_policy() to ignore\ninclude/linux/sched/rt.h-31- * PI-boosted tasks.\n--\ninclude/linux/sched/rt.h=33=static inline bool rt_or_dl_task(struct task_struct *p)\n--\ninclude/linux/sched/rt.h-41- */\ninclude/linux/sched/rt.h:42:static inline bool rt_or_dl_task_policy(struct task_struct *tsk)\ninclude/linux/sched/rt.h-43-{\n--\nkernel/fork.c=1965=__latent_entropy struct task_struct *copy_process(\n--\nkernel/fork.c-2136-\nkernel/fork.c:2137:\tif (rt_or_dl_task_policy(current))\nkernel/fork.c-2138-\t\tp-\u003edefault_timer_slack_ns = current-\u003edefault_timer_slack_ns;\n--\nkernel/sched/syscalls.c=241=static void __setscheduler_params(struct task_struct *p,\n--\nkernel/sched/syscalls.c-256-\t/* rt-policy tasks do not have a timerslack */\nkernel/sched/syscalls.c:257:\tif (rt_or_dl_task_policy(p)) {\nkernel/sched/syscalls.c-258-\t\tp-\u003etimer_slack_ns = 0;\n--\nkernel/sys.c=2533=SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3,\n--\nkernel/sys.c-2645-\tcase PR_SET_TIMERSLACK:\nkernel/sys.c:2646:\t\tif (rt_or_dl_task_policy(current))\nkernel/sys.c-2647-\t\t\tbreak;\n--\nkernel/time/hrtimer.c=2051=static void __hrtimer_setup_sleeper(struct hrtimer_sleeper *sl,\n--\nkernel/time/hrtimer.c-2073-\tif (IS_ENABLED(CONFIG_PREEMPT_RT)) {\nkernel/time/hrtimer.c:2074:\t\tif (rt_or_dl_task_policy(current) \u0026\u0026 !(mode \u0026 HRTIMER_MODE_SOFT))\nkernel/time/hrtimer.c-2075-\t\t\tmode |= HRTIMER_MODE_HARD;\n"
} |
| 11/2 | 2026/08/06 09:06 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 7374 output: 105 thoughts: 318 Thoughts: **Analyzing the Patch for Fuzzing Potential** Okay, so the change is definitely in `copy_process`. My initial thought is to zero in on `copy_process` and `kernel_clone` as the primary focus symbols. No special config options are required, thankfully – `copy_process` is always compiled in, which simplifies things. Ah, right, the inclusion of `<linux/sched/rt.h>` makes it clear this is about RT/DL task policy, specifically how timer slack is inherited. This is a functional change, and functional changes are always worth fuzzing. Let me just double-check that `copy_process` isn't a static function. Nope, it's not – good, that means it's a distinct symbol address. Same goes for `kernel_clone`. Both are perfect candidates for fuzzing targets. Alright, let's make absolutely sure there aren’t any other gotchas with configs. Nope, `kernel/fork.c` is always compiled and `rt_or_dl_task_policy` is always defined. We're good to go. Time to structure the fuzzing response. It's a "WorthFuzzing: true" situation, the primary focus symbols are "copy_process" and "kernel_clone", no special enabling configs are necessary, and the reason is this patch affects default timer slack inheritance during process creation for RT/DL tasks. We can hit the code via `clone`, `fork`, or `vfork`. |
| 12/2 | 2026/08/06 09:06 | tool | set-results |
0mArgs:{
"EnableConfigs": [],
"FocusSymbols": [
"copy_process",
"kernel_clone"
],
"Reasoning": "The patch modifies `copy_process` to change how `default_timer_slack_ns` is inherited for tasks with real-time or deadline scheduling policies. This is a functional change in core kernel process creation logic that can be reached via `clone`, `fork`, or `vfork` syscalls.",
"WorthFuzzing": true
}Results: {
"EnableConfigs": null,
"FocusSymbols": [
"copy_process",
"kernel_clone"
],
"Reasoning": "The patch modifies `copy_process` to change how `default_timer_slack_ns` is inherited for tasks with real-time or deadline scheduling policies. This is a functional change in core kernel process creation logic that can be reached via `clone`, `fork`, or `vfork` syscalls.",
"WorthFuzzing": true
} |
| Total Calls | Total Tokens | Avg Tokens | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|
| Total Calls | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|