#!/bin/sh
export PATH=/bin:/sbin
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -t devtmpfs devtmpfs /dev
mkdir -p /sys/kernel/tracing
mount -t tracefs tracefs /sys/kernel/tracing
echo FBATCH_BOOT
uname -a
cat /proc/cmdline
cat /sys/devices/system/clocksource/clocksource0/current_clocksource
cat /sys/devices/system/node/node*/meminfo
cat /proc/swaps
sleep 3
for d in /sys/bus/pci/devices/*; do
 if [ "$(cat "$d/vendor")" = 0x8086 ] && [ "$(cat "$d/device")" = 0x0d93 ]; then
  bdf=${d##*/};echo cxl_compression > "$d/driver_override"
  if [ -L "$d/driver" ]; then echo "$bdf" > "$d/driver/unbind"; fi
  echo "$bdf" > /sys/bus/pci/drivers/cxl_compression/bind
 fi
done
sleep 3
echo FLUSH_CPU $(cat /sys/module/cxl_compression/parameters/flush_cpu)
echo RELEASE_CPU $(cat /sys/module/cxl_compression/parameters/release_cpu)
echo PRIVATE_NODE $(cat /sys/devices/system/node/has_private_memory)
[ "$(cat /sys/devices/system/node/has_private_memory)" = 2 ] || { echo TOPOLOGY_FAIL; poweroff -f; }
echo false > /sys/kernel/mm/numa/demotion_enabled
MODE=nop
case "$(cat /proc/cmdline)" in *labmode=host*) MODE=host;; *labmode=trace*) MODE=trace;; *labmode=fast*) MODE=fast;; *labmode=churn*) MODE=churn;; *labmode=budget*) MODE=budget;; *labmode=safety*) MODE=safety;; *labmode=pressure*) MODE=pressure;; *labmode=retry*) MODE=retry;; esac
if [ "$MODE" = retry ]; then
 echo 'r:cram/promote_ret alloc_cram_promote_folio result=$retval' > /sys/kernel/tracing/kprobe_events
 echo 'r:cram/fault_ret cram_handle_fault result=$retval' >> /sys/kernel/tracing/kprobe_events
 echo 1 > /sys/kernel/tracing/events/cram/enable
 echo 3 > /sys/module/cram/parameters/test_fail_promote
 echo FAIL_PROMOTE_BUDGET_BEFORE $(cat /sys/module/cram/parameters/test_fail_promote)
 echo 1 > /sys/kernel/tracing/tracing_on
 /bin/probe safety
 rc=$?
 echo 0 > /sys/kernel/tracing/tracing_on
 echo FAIL_PROMOTE_BUDGET_AFTER $(cat /sys/module/cram/parameters/test_fail_promote)
elif [ "$MODE" = pressure ]; then
 echo lz4 > /sys/block/zram0/comp_algorithm
 echo 256M > /sys/block/zram0/disksize
 mkswap /dev/zram0;swapon /dev/zram0
 echo true > /sys/kernel/mm/numa/demotion_enabled
 echo 8192 > /sys/kernel/tracing/buffer_size_kb
 echo > /sys/kernel/tracing/trace
 echo 'r:cram/promote_ret alloc_cram_promote_folio result=$retval' > /sys/kernel/tracing/kprobe_events
 echo PRESSURE_ALLOC_KPROBE_SETUP_EXIT_$?
 echo 'r:cram/fault_ret cram_handle_fault result=$retval' >> /sys/kernel/tracing/kprobe_events
 echo PRESSURE_FAULT_KPROBE_SETUP_EXIT_$?
 echo 1 > /sys/kernel/tracing/events/cram/promote_ret/enable
 echo 1 > /sys/kernel/tracing/events/cram/fault_ret/enable
 echo 1 > /sys/kernel/tracing/tracing_on
 echo PRESSURE_ENABLED_BEGIN
 /bin/stress enabled 2;echo PRESSURE_ENABLED_EXIT_$?
 echo PROBE_INITIAL_BEGIN
 /bin/stress probe 2;echo PROBE_INITIAL_EXIT_$?
 echo INJECT_LOW_READY;sleep 4
 echo PROBE_BLOCKED_BEGIN
 /bin/stress probe 2;echo PROBE_BLOCKED_EXIT_$?
 /bin/stress blocked 2;echo PRESSURE_BLOCKED_EXIT_$?
 echo INJECT_HIGH_READY;sleep 4
 echo PROBE_RESUMED_BEGIN
 /bin/stress probe 2;echo PROBE_RESUMED_EXIT_$?
 echo 0 > /sys/kernel/tracing/tracing_on
 swapoff /dev/zram0
 rc=$?
else
 /bin/probe "$MODE"
 rc=$?
fi
echo PROBE_EXIT_$rc
sleep 2
echo 0 > /sys/kernel/tracing/tracing_on
echo DRAIN_MEMINFO
cat /sys/devices/system/node/node2/meminfo
if [ "$MODE" = fast ] || [ "$MODE" = trace ] || [ "$MODE" = pressure ] || [ "$MODE" = retry ]; then
 cat /sys/kernel/tracing/trace > /tmp/move.trace
 port=
 for p in /sys/class/virtio-ports/*; do
  if [ "$(cat "$p/name")" = lab.trace ]; then port=/dev/${p##*/}; fi
 done
 if [ -z "$port" ]; then echo TRACE_EXPORT_FAIL; poweroff -f; fi
 echo TRACE_EXPORT_BEGIN
 gzip -c /tmp/move.trace > "$port"
 echo TRACE_EXPORT_EXIT_$?
 echo TRACE_SHA256 $(sha256sum /tmp/move.trace)
 cat /sys/kernel/tracing/per_cpu/cpu*/stats
cat /sys/kernel/tracing/kprobe_profile
fi
sleep 2
cat /proc/sys/vm/stat_refresh
cat /proc/vmstat
cat /sys/devices/system/clocksource/clocksource0/current_clocksource
echo FBATCH_DONE
poweroff -f
