⬢ DragonFlyBSD Kernel Audit
DF-2309 / master2309.log
← back to finding ↓ download raw
=== pre-loop allocator state (malloc type 'temp') ===
	       Type   Count  MemUse SlabUse   Limit Requests
               temp     469    332K       0    390M    15.0K
vm.stats.vm.v_free_count: 832270
=== calibration: 20 iterations (expect ~15.6 MB consumed if real) ===
DF-2309 usrbufs leak loop: nmsgs=100000 iters=20
per-call leak if real: 800000 bytes; total if real: 15.3 MB
start: v_free_count=832270 (3251.1 MB free)
iter 1     faults=1 v_free_count=832350 (delta_from_start=+80 pages = -0.3 MB consumed)
iter 5     faults=5 v_free_count=832853 (delta_from_start=+583 pages = -2.3 MB consumed)
iter 10    faults=10 v_free_count=830824 (delta_from_start=-1446 pages = 5.6 MB consumed)
iter 15    faults=15 v_free_count=830824 (delta_from_start=-1446 pages = 5.6 MB consumed)
iter 20    faults=20 v_free_count=829253 (delta_from_start=-3017 pages = 11.8 MB consumed)

end:   v_free_count=829253  consumed=3017 pages = 11.8 MB
expected if leak real: 15.3 MB; expected if fixed: ~0 MB
faults=20/20
=== PHASE A: stock iic.ko, nmsgs=100000 x 300 (expect ~234 MB leak) ===
DF-2309 usrbufs leak loop: nmsgs=100000 iters=300
per-call leak if real: 800000 bytes; total if real: 228.9 MB
start: v_free_count=829253 (3239.3 MB free)
iter 1     faults=1 v_free_count=829253 (delta_from_start=+0 pages = 0.0 MB consumed)
iter 50    faults=50 v_free_count=819143 (delta_from_start=-10110 pages = 39.5 MB consumed)
iter 100   faults=100 v_free_count=810110 (delta_from_start=-19143 pages = 74.8 MB consumed)
iter 150   faults=150 v_free_count=799898 (delta_from_start=-29355 pages = 114.7 MB consumed)
iter 200   faults=200 v_free_count=790275 (delta_from_start=-38978 pages = 152.3 MB consumed)
iter 250   faults=250 v_free_count=779474 (delta_from_start=-49779 pages = 194.4 MB consumed)
iter 300   faults=300 v_free_count=770244 (delta_from_start=-59009 pages = 230.5 MB consumed)

end:   v_free_count=770244  consumed=59009 pages = 230.5 MB
expected if leak real: 228.9 MB; expected if fixed: ~0 MB
faults=300/300
=== post-loop allocator state ===
	       Type   Count  MemUse SlabUse   Limit Requests
               temp     789    245M       0    390M    15.6K
vm.stats.vm.v_free_count: 769761
=== attribution: unload+reload iic.ko, memory must NOT come back ===
vm.stats.vm.v_free_count: 769897
(leaked chunks are global M_TEMP, not tied to the module)
=== PHASE B: apply DF-2309 fix.diff, rebuild iic.ko, re-run ===
Hmm...  Looks like a unified diff to me...
The text leading up to this was:
--------------------------
|--- a/sys/bus/iicbus/iic.c	2026-06-29 12:51:18.000000000 +0000
|+++ b/sys/bus/iicbus/iic.c	2026-10-15 00:00:00.000000000 +0000
--------------------------
Patching file sys/bus/iicbus/iic.c using Plan A...
Hunk #1 succeeded at 351 (offset 1 line).
Hmm...  Ignoring the trailing garbage.
done
DF-2309 usrbufs leak loop: nmsgs=100000 iters=300
per-call leak if real: 800000 bytes; total if real: 228.9 MB
start: v_free_count=769799 (3007.0 MB free)
iter 1     faults=1 v_free_count=769799 (delta_from_start=+0 pages = 0.0 MB consumed)
iter 50    faults=50 v_free_count=769273 (delta_from_start=-526 pages = 2.1 MB consumed)
iter 100   faults=100 v_free_count=769273 (delta_from_start=-526 pages = 2.1 MB consumed)
iter 150   faults=150 v_free_count=769593 (delta_from_start=-206 pages = 0.8 MB consumed)
iter 200   faults=200 v_free_count=769273 (delta_from_start=-526 pages = 2.1 MB consumed)
iter 250   faults=250 v_free_count=769273 (delta_from_start=-526 pages = 2.1 MB consumed)
iter 300   faults=300 v_free_count=769273 (delta_from_start=-526 pages = 2.1 MB consumed)

end:   v_free_count=769273  consumed=526 pages = 2.1 MB
expected if leak real: 228.9 MB; expected if fixed: ~0 MB
faults=300/300
=== final allocator state ===
	       Type   Count  MemUse SlabUse   Limit Requests
               temp     789    245M       0    390M    16.8K
vm.stats.vm.v_free_count: 769603