summaryrefslogtreecommitdiffstats
path: root/tools/guest-diag/wall2/slotfill.sh
blob: a3416a9aed5f0f501575cbde2252575a2a5ef075 (plain)
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
#!/bin/bash
# Watch the vk_frame client and fill the completion-slot u16 (base+0x2e) in
# every small /dev/nvidiactl rw-s mapping while it waits.
cd /tmp
rm -f /tmp/slotfill.log
(timeout 120 /tmp/vk_frame 1 64 64 5 /tmp 0 > /tmp/vk76.out 2>&1 &)
PID=""
for i in $(seq 1 100); do PID=$(pgrep -x vk_frame | head -1); [ -n "$PID" ] && break; sleep 0.1; done
echo "pid=$PID" >> /tmp/slotfill.log
END=$((SECONDS+60))
while [ $SECONDS -lt $END ]; do
  [ -d /proc/$PID ] || break
  for m in $(grep 'nvidiactl' /proc/$PID/maps | awk '$2 ~ /rw-s/ {print $1}'); do
    lo=${m%-*}; hi=${m#*-}
    size=$((0x$hi - 0x$lo))
    [ $size -gt 65536 ] && continue
    off=$((0x$lo + 0x2e))
    v=$(dd if=/proc/$PID/mem bs=1 skip=$off count=2 2>/dev/null | xxd -p)
    if [ "$v" = "ffff" ]; then
      printf '\x00\x00' | dd of=/proc/$PID/mem bs=1 seek=$off count=2 conv=notrunc 2>/dev/null
      echo "$(date +%s.%N) FILL $m+0x2e was ffff" >> /tmp/slotfill.log
    fi
  done
  sleep 0.2
done
echo "done" >> /tmp/slotfill.log
echo "=== client ==="
cat /tmp/vk76.out
echo "=== fills ==="
grep -c FILL /tmp/slotfill.log