#!/bin/sh
#
# set_kthread_prio	This shell script takes care of starting / stopping 
#
# chkconfig: 2345 99 10
# description: Sets the real-time priority of kernel threads
#
### BEGIN INIT INFO
# Provides: set_kthread_prio
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop:
# Description: Manages the policy and priority of RT kernel threads on startup
### END INIT INFO

CONF_FILE=/etc/set_kthread_prio.conf

set_kthread_cmds () {
    if ! test -f $CONF_FILE; then
	echo "$CONF_FILE: file not found"
	exit 1
    fi

    ps -eo pid,cmd | \
	awk '/^[a-zA-Z_0-9-]+[ 	]+-[rfox]*[ 	]+[0-9\-]+$/ {
			printf("# '%s' = '%s' (%s)\n", $1, $3, $2);
			config[$1]=$3
			confopts[$1]=$2
		}
		/^ *[0-9]* \[.*\]$/ {
			if ($3 != "") {
				cmd=sprintf("%s_%s", $2, $3)
			} else {
			       cmd=$2
			}
			cmd=substr(cmd, 2, length(cmd)-2); 
			sub(/\/[0-9]*-/,"-",cmd);
			sub(/\/[0-9]*$/,"",cmd); 
			sub(/\[*$/,"",cmd);
			sub(/\/$/,"",cmd); 
			sub(/[/@: ].*$/,"",cmd);
			sub(/ /,"_",cmd);
			prio = "-";
			opts = "";
			if (cmd in config) {
				prio = config[cmd];
				opts = confopts[cmd];
			} else if (cmd ~ /^IRQ[_-]/ &&
				   "IRQ_default" in config) {
				prio = config["IRQ_default"];
				opts = confopts["IRQ_default"];
			} else if (cmd ~ /^irq\// &&
				   "irq_default" in config) {
				prio = config["irq_default"];
				opts = confopts["irq_default"];
			} else if (cmd ~ /^sirq-/ &&
				   "sirq_default" in config) {
				prio = config["sirq_default"];
				opts = confopts["sirq_default"];
			} else if ((cmd ~ /^vhost/ || cmd ~ /^kvm-/) &&
				   "virt_default" in config) {
				prio = config["virt_default"];
				opts = confopts["virt_default"];
			} else if ("default" in config) {
				prio = config["default"];
				opts = confopts["default"];
			}
			if (prio != "-") {
				printf("chrt -p %s %s %s	# %s\n",
					opts, prio, $1, cmd);
			}
				
		}' \
		$CONF_FILE -
}

case "$1" in 
    --file) 
    	CONF_FILE="$2";
	shift; shift;
	;;
esac

case "$1" in
    start)
  	echo -n "Setting kernel thread priorities: "
	set_kthread_cmds | sh
	echo done
	exit 0;
	;;
    stop)
    	exit 0;
	;;
    status)
    	ps -eo pid,cls,rtprio,cmd | grep "[0-9-] \\[.*\\]$"
	exit 0;
	;;
    debug)
    	set_kthread_cmds
	exit 0;
	;;
    *)
    	echo "Usage: $0 [start|stop|status|debug]"
	exit 1;
	;;
esac

exit 0
