#!/usr/bin/env bash

function fetch_scheds {
    echo "$(journalctl --output cat -k | grep -i scheduler | grep -Pv '^(?=.*sched_ext: BPF scheduler)(?=.*enabled)')"

    ENABLED_SCHEDULER_LINE=$(journalctl --output cat -k | grep -i "sched_ext: BPF scheduler" | tail -n1 | grep "enabled")

    if [ -z "$ENABLED_SCHEDULER_LINE" ]; then
        # No sched_ext BPF scheduler found as enabled.
        exit 0
    fi

    # Find scheduler used
    SCHEDULER_NAME=$(echo "$ENABLED_SCHEDULER_LINE" | sed -n 's/.*BPF scheduler "\([^"]*\)".*/\1/p')

    if [ -z "$SCHEDULER_NAME" ]; then
        echo "Could not parse scheduler name from: $ENABLED_SCHEDULER_LINE"
        exit 1
    fi

    # Find the scx scheduler process
    PROCESS_HINT=$(echo "$SCHEDULER_NAME" | cut -d'_' -f1)

    # Get the args
    PROCESS_CMD_LINE=$(pgrep -fo "$PROCESS_HINT" | xargs -r ps -o cmd --pid | tr -d '\n')

    OPTIONS=""
    if [ -n "$PROCESS_CMD_LINE" ]; then
        OPTIONS=$(echo -n "$PROCESS_CMD_LINE" | sed -E "s/^[^[:space:]]+//; s/^[[:space:]]+//")
        if [ -n "$OPTIONS" ]; then
            OPTIONS="with options $OPTIONS"
        fi
    fi

    echo "$ENABLED_SCHEDULER_LINE $OPTIONS"
}

cat << EOF
Check kernel version:

$(cat /proc/version && uname -a)


Check x86_64 support:

$(/lib64/ld-linux-x86-64.so.2 --help | grep "(supported, searched)")


Check CPU config:

$(zgrep -iE 'CONFIG_(GENERIC_CPU(=| is)|X86_64_VERSION|MZEN|MBULLDOZER|MPILEDRIVER|MSTREAMROLLER|MEXCAVATOR|MBOBCAT|MJAGUAR|MK10|MK8SSE3|MATOM|MGOLDMONTPLUS|MSKYLAKE2|MIVYBRIDGE|MICELAKE|MNATIVE_INTEL|MNATIVE_AMD|X86_NATIVE_CPU)' /proc/config.gz)


Current disk schedulers:

$(for disk in /sys/block/*/
do [ -f "$disk/queue/scheduler" ] \
    && echo "$(basename "$disk"): $(cat "$disk/queue/scheduler")"
done)

Check available schedulers:

$(fetch_scheds)
EOF

