1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
[]
= [".", "ktstr-macros", "scx-ktstr"]
[]
= "2024"
= "1.94.1"
= "GPL-2.0-only"
= "https://github.com/likewhatevs/ktstr"
[]
= "ktstr"
= "0.4.21"
= true
= true
= true
= true
= "Test harness for Linux process schedulers"
= "README.md"
= ["sched_ext", "scheduler", "testing", "bpf", "linux"]
= ["development-tools::testing"]
= "https://likewhatevs.github.io/ktstr/api/ktstr/"
= [".build-cache/", "doc/guide/book/", ".github/", ".githooks/", ".config/"]
[]
= "1"
= { = "4", = ["derive"] }
= "4"
= "1.5"
# Binary serialization for bulk-port TLV payloads (AssertResult,
# PayloadMetrics, RawPayloadOutput). Replaces the prior JSON-over-TLV
# encoding so the host parses test verdicts and per-payload metrics
# without serde_json's text-form overhead. `serde` feature pipes the
# existing `#[derive(Serialize, Deserialize)]` types through bincode's
# `bincode::serde::encode_to_vec` / `decode_from_slice` entry points
# (`features/serde/ser.rs` + `de_owned.rs`); the wire format pin uses
# `bincode::config::standard()` (little-endian, variable-int) for both
# guest and host so layout never diverges. Pre-1.0 — old sidecar /
# baseline data is disposable per project policy.
= { = "2", = ["serde"] }
= "1"
= { = "0.81", = false, = ["sha1", "blocking-network-client", "blocking-http-transport-reqwest-rust-tls", "worktree-mutation", "status", "revision"] }
= { = "0.13", = ["blocking"] }
= "0.4"
= "3"
= { = "0.1", = ["static"] }
= { = "0.55", = false, = ["services-ghac"] }
= { = "1", = ["rt"] }
= { = "0.13", = ["zstdmt"] }
= { = "0.12", = ["frame"] }
= "1"
= "0.3"
= "0.8"
= "0.2"
= { = "0.31", = ["event", "feature", "fs", "inotify", "mount", "poll", "process", "ptrace", "reboot", "sched", "signal", "term", "uio"] }
= { = "0.2", = ["dwarf"] }
= "0.10"
= { = "1", = false, = ["sync"] }
= { = "1", = ["derive"] }
= "1"
= "0.1"
= { = "0.3", = ["env-filter"] }
= "1.1.1"
= { = "0.14", = ["fam-wrappers"] }
= "0.24"
= { = "0.26", = ["vendored"] }
= { = "1.6", = ["vendored"] }
= { = "0.13", = ["bzimage", "elf", "pe"] }
= "0.3"
= { = "=0.17.1", = ["backend-mmap"] }
= "0.15"
= "0.4.1"
= "0.2.7"
= "0.17"
= "0.8.1"
= { = "0.8.48", = ["derive"] }
= { = "0.53.0", = false, = ["lazy", "describe"] }
= "0.3"
= { = "0.4.8", = "ktstr-macros" }
= { = "0.10.5", = ["elf64"] }
# Memory-map /proc/self/exe in `try_flush_profraw` instead of reading
# the whole binary into a Vec<u8>. Coverage-instrumented test binaries
# are large (hundreds of MiB to ~1 GiB), and the read+copy cost on the
# guest's coverage-flush path was a measurable share of teardown
# latency. Already in the dep tree transitively (blazesym, gix); pinned
# here so `src/test_support/profraw.rs` doesn't depend on either crate's
# re-export surface.
= "0.9"
# DWARF parser for resolving struct-member offsets in jemalloc's tsd_t
# at probe time (jemalloc-probe binary). Already present transitively
# via blazesym; pinned as a direct dep so the probe's offset-recovery
# path doesn't depend on blazesym's re-export surface.
= "0.33"
= "1"
# ELF reader/writer. `features = ["build"]` pulls in the full
# `object::build::elf::Builder` surface used by `elf_strip.rs` and
# `cache.rs` for SHT_NOBITS rewriting. `cargo tree --duplicates` also
# lists `object v0.37.3` reached via `ar_archive_writer` (build-dep of
# `psm` / `stacker` / `polars`) with only the `memchr` feature — that
# second instance is a build-script compilation artifact and does not
# link into any shipped binary. The dupe is an artifact of resolver v3
# keeping build-dep and regular-dep feature graphs separate; unifying
# would require dropping `polars`, which is not a proportionate fix.
= { = "0.39", = false, = ["build"] }
= "2"
= "0.18"
# Table rendering for stats and verifier CLI output. Replaces hand-rolled
# `format!("{:<30}...")` layouts plus `"-".repeat()` separators with a
# builder API that measures column widths from actual content, so labels
# like `scenario/topology/work_type` stop spilling into adjacent columns
# when topology names exceed the previously hardcoded 30-column width.
# Default features pull in crossterm for `Cell::fg(Color::Red/Green)` in
# the compare_runs VERDICT column; stdout TTY detection is handled by
# comfy-table itself (see `crate::cli::new_table`).
= "7.2"
# Stable hash for cache keys — std::hash::DefaultHasher is not
# guaranteed stable across toolchain versions; siphasher::sip::SipHasher13
# pins the algorithm so cached artifacts survive Rust updates.
= "1"
# SIMD-accelerated byte-pattern search for IKCONFIG extraction from
# stripped vmlinux images (tens of MB each). `windows().position()`
# with an 8-byte needle is O(n) in naive byte compares; memmem uses
# a two-way algorithm with x86_64 AVX2 / aarch64 Neon when available.
= "2"
# C parser for extracting struct definitions from scx BPF source files.
# Used by cargo-ktstr's BTF type anchor generator to force clang to
# retain struct types that would otherwise be eliminated by inlining +
# dead-code elimination. tree-sitter-c parses any C formatting without
# regex fragility.
= "0.24"
= "0.23"
# Human-readable duration parsing for the `--watch <interval>` flag on
# `ktstr locks`. Accepts "100ms", "1s", "5m", "1h" forms per rev 5 §6.
# Tiny crate (~2 modules, zero non-std deps).
= "2"
# Safe wrappers around direct syscalls — replaces ad-hoc
# `libc::uname`/`libc::flock`/`libc::shm_open` sites that each reinvent
# fd ownership and errno handling. Keeps the libc dep around because
# not every call we make has a rustix equivalent we consume yet (mmap,
# some signal paths), but the flock+uname+shm surface migrates cleanly.
= { = "1", = ["fs", "shm", "system"] }
# Derive macros for enum-level operations. `VariantNames` auto-generates
# the list of variant names so `WorkType::ALL_NAMES` stays in lock-step
# with the enum definition without a hand-maintained parallel table.
= { = "0.27", = ["derive"] }
# Levenshtein edit distance for the "did you mean?" suggestion in
# `cli::show_thresholds`'s unknown-test-name error path. Already
# present transitively via clap — promoting it to a direct dep makes
# the intent explicit and survives a future clap version that drops
# the transitive exposure.
= "0.11"
# Base64 encoder for `cargo ktstr export`'s self-extracting .run files
# — embeds a gzip tarball after a `__ARCHIVE__` shell-script marker
# so the bash preamble can `base64 -d | tar xz` the binaries on the
# target host. Lightweight crate, well-audited, used only at export
# time (not on the test hot path).
= "0.22"
# jemalloc as global allocator for the ktstr/cargo-ktstr binaries.
# binary-only — the library stays allocator-agnostic so downstream
# consumers pick their own allocator. `stats` feature compiles
# jemalloc with internal per-allocation bookkeeping so
# `tikv-jemalloc-ctl`'s `stats.{allocated,active,resident,mapped}`
# mallctl reads return populated values instead of failing with
# EPERM; `host_heap::collect` depends on this.
= { = "0.6", = ["stats"] }
# Safe wrappers for the jemalloc mallctl introspection surface. Used
# by `host_heap` to capture the running binary's heap footprint
# (active / allocated / resident / mapped bytes, arena count) as part
# of the sidecar's HostContext. Reads return `Err` when the linked
# allocator is not jemalloc, so downstream consumers that do NOT
# enable `tikv-jemallocator` land the heap state as `None` cleanly.
# `stats` feature gates the `stats::*` submodule (allocated/active/
# resident/mapped); without it the submodule is absent at compile
# time. `arenas::narenas` is exposed unconditionally.
= { = "0.6", = ["stats"] }
# Regex synthesis from a list of literal strings — used by
# `ctprof_compare` to render human-readable display labels for
# pattern-aggregated thread-name groups (e.g. 4 threads named
# `tokio-runtime-worker-0..3` collapse to a regex showing the
# shared prefix + alternation). The internal join key stays as the
# deterministic strip-trailing-digit prefix; grex is invoked at
# render time only, on bucket-member literals (≥2 entries), to
# produce a regex string operators can read or paste into tooling.
# `default-features = false` drops the binary CLI surface (clap,
# colored, indoc) so only the library trait is pulled in.
= { = "1.4", = false }
# SHA-1 listed as a direct dep solely to enable `asm` (SHA-NI on
# x86_64) via Cargo feature unification on the transitive instance
# pulled in by gix → gix-hash → sha1-checked → sha1. No call sites
# in ktstr itself — remove this entry if gix ever exposes a
# passthrough feature.
= { = "0.10", = ["asm"] }
# SHA-256 for verifying downloaded model-cache artifacts. `asm`
# enables `sha2-asm` — hand-tuned SHA-NI assembly on x86_64,
# ARMv8 SHA-2 crypto extensions on aarch64.
= { = "0.10", = ["asm"] }
# Lowercase hex encoding for SHA-256 digest comparisons in the
# model-cache verify path.
= "0.4"
# Local inference backend for `OutputFormat::LlmExtract`. CPU-only —
# `openmp` enables OpenMP-parallel matmul (no GPU offload). The GGUF
# carries its own tokenizer surface, so no separate tokenizer crate is
# needed. The `sampler` feature enables the `LlamaSampler` builder API
# (`greedy()`, `accept()`, `sample()`) used by `invoke_with_model`.
# Build dep on cmake — the linked llama.cpp C++ sources are built from
# source via `llama-cpp-sys-2`'s build script.
= { = "0.1.145", = false, = ["openmp", "sampler"] }
# Stateful UTF-8 decoder required by `LlamaModel::token_to_piece` —
# a single token may carry a partial multi-byte UTF-8 sequence and
# only a stateful decoder can stitch consecutive tokens into valid
# UTF-8 without dropping bytes. Already a transitive dep of
# `llama-cpp-2`; pinned as a direct dep so the call site's intent is
# explicit and survives a future llama-cpp-2 reorganization that
# changes its re-export surface.
= "0.8"
# Error-enum derives for the `InferenceError` type that
# `load_inference` and `invoke_with_model` return. Already a
# transitive dep via `llama-cpp-2`'s own thiserror-derived error
# types; promoted to a direct dep so the migration's
# `#[derive(thiserror::Error)]` site is explicit. Pinned at the v2
# series to match what `llama-cpp-2` already pulls in (v2.0.18);
# v2's `#[source]` attribute matches the structured-error
# pattern this crate's error-handling design favors.
= "2"
# Compiled regex patterns for the token-based pattern_key
# normalizer in `ctprof_compare.rs`. Used to express the
# spec rules in `classify_token` (`^\d+$`, `^[0-9a-f]+$`,
# `^[A-Za-z]+\d+$`, `^\d+[A-Za-z]+$`) literally rather than as
# hand-rolled char loops, so the rules read identically to the
# spec. Already a transitive dep via `fancy-regex` and others;
# promoted to a direct dep so the import sites are explicit.
= "1"
# Netlink stack for the taskstats genetlink capture path
# (`src/taskstats.rs`). The three crates layer cleanly:
# `netlink-sys` — AF_NETLINK socket + sendto/recv.
# `netlink-packet-core` — `NetlinkMessage<T>` envelope, ALIGN handling,
# multipart-reply assembly.
# `netlink-packet-generic` — generic-netlink (genetlink): `GenlMessage<T>`
# wrapper, CTRL_CMD_GETFAMILY family-id lookup.
# Hand-rolled genetlink against raw libc would be ~300 lines of
# protocol parsing (NLA alignment, multipart NLM_F_MULTI handshake,
# CTRL family lookup) — established crate stack avoids that
# correctness risk.
= "0.8"
= "0.7"
= "0.3"
# Bindgen-generated bindings for the `perf_event_open(2)` syscall and
# its `perf_event_attr` struct. The Linux libc and the Rust libc crate
# both deliberately omit these — perf-event-open-sys provides the
# bitfield setters (`set_exclude_host`, `set_disabled`) and the
# kernel-version-tolerant struct layout (per its top-of-crate docs:
# old programs run on new kernels and vice versa). Used by
# `src/monitor/perf_counters.rs` to open one fd per (vCPU, hardware
# counter) with `exclude_host=1` so the PMU counts only what executes
# inside the guest. Disambiguates host-thread idle/spin/productive
# work without any in-guest overhead.
= "6"
= "0.8"
[]
= "thin"
= "abort"
[]
= []
[]
= { = "warn", = ['cfg(coverage)', 'cfg(coverage_nightly)'] }
[]
= "2"
= "1"
= "3"
= "1"
# Grok-style structured log matcher. Used by the watchdog timing
# precision test to extract the sched_ext stall duration from the
# kernel's SCX_EXIT_ERROR_STALL message ("…failed to run for
# N.NNNs"). `default-features = false` disables the default `onig`
# C-regex engine (which would drag in a C library build). The
# `fancy-regex` engine is the minimum that supports the lookbehind
# and atomic-group constructs grok's default `BASE10NUM` / `NUMBER`
# patterns use; the pure-`regex` backend rejects those patterns
# at compile time.
= { = "2", = false, = ["fancy-regex"] }
# In-test tracing subscriber that captures `tracing::warn!` /
# `tracing::info!` events into a per-test buffer, queryable via
# `logs_contain(&str)`. Used by the `set_rt_priority_warns_without_cap`
# unit test to pin that the CAP_SYS_NICE-absent path emits an
# actionable warn event — converted from a pure `eprintln!` that no
# test could observe. Default feature set filters to the current
# crate's tracing events, which matches the unit-test use case
# where the event originates from ktstr itself.
= "0.2"
= "1"
= "1"
# `test-utils` feature on the existing virtio-queue dep — gates the
# upstream `mock` module (`MockSplitQueue`, `desc_chain` builders)
# used by virtio-blk descriptor-chain tests. Pinned as a separate
# dev-dep entry rather than via `features = [...]` on the main
# `[dependencies]` line so the mock infrastructure does NOT leak
# into shipped binaries.
= { = "0.17", = ["test-utils"] }
[]
= "1"
= "1"
= { = "0.81", = false, = ["sha1", "blocking-network-client", "blocking-http-transport-reqwest-rust-tls", "worktree-mutation"] }
= "0.26"
= { = "0.13", = ["blocking"] }
# Stable hash for BTF content drift detection in build.rs.
# Reusing the same crate ktstr uses for sidecar_variant_hash keeps
# the dep graph narrow and pins one algorithm across every hashing
# site in the project. See build.rs `siphash_13` for the call site.
= "1"
= "0.4"
[[]]
= "ktstr"
= "src/bin/ktstr.rs"
[[]]
= "cargo-ktstr"
= "src/bin/cargo-ktstr.rs"
[[]]
= "ktstr-jemalloc-probe"
= "src/bin/jemalloc_probe.rs"
[[]]
= "ktstr-jemalloc-alloc-worker"
= "src/bin/jemalloc_alloc_worker.rs"
[[]]
= "ktstr_sched_tests"
[[]]
= "failure_dump_e2e"
[[]]
= "cast_analysis_e2e"
[[]]
= "scenario_coverage"
[[]]
= "assert_gate_matrix"
[[]]
= "cargo_ktstr_cli"
[[]]
= "verifier_pipeline"
[[]]
= "compile_fail"
[[]]
= "jemalloc_probe_tests"
[[]]
= "live_host_pipeline_e2e"