#!/system/bin/sh

#Super Tweak init script

################################################
#You can change the specified parameters below #
################################################
#script mode:
#Values: on, off
#If this set to off the script will dont do any changes,
#but it will read the current values and log to /cache/tweaklog.txt
#It is handy if you want to compare the original and the tweaked values.
#tweaklog.txt overwrited when the script is running again!
SMODE="on"

#########################
#Low Memory Killer mode #
#########################
#LMK Values are: auto, opt, str, aggr
#auto: manage lowmemorykiller parameter automatically, depending on the total RAM
#opt: optimum values 2048,3072,10240,12288,14080,16128 (Recommended for the most)
#str: strict values 2048,3584,10240,12800,15360,19200 (Best for heavy multitasking)
#aggr: aggressive values 2048,3584,14080,17920,21760,25600 (Your phone will handle this without problem)
LMKMODE="on"
LMKVAL="opt"

#################
#Network Tweaks #
#################
#Values are: on, off
NETTWEAKS="on"

##################################
#VM Management and kernel tweaks #
##################################
#Compcache option pre-requiered that the kernel support the zram devices. 
#You can adjust the compcache/swap zram device size and cache clear interval time.
#Values are: on, off
VMTWEAKS="on"
COMPCACHE="on"
#Static size in MB or 'auto' for auto management
CS_SIZE="auto"
#Compcache ratio is only applyed if the CS_SIZE set to auto. Value in percent.
CS_RATIO="25"
#Interval in hour
INTERVAL="3"

######################
#Mount Option Tweaks #
######################
#Mount tweak remount all partition with noatime, nodiratime option and fine tune some IO parameters
#You can adjust the default IO scheduler too.
#CM7 default scheduler is the bfq scheduler.
#Its a good compromise between the old anticipatory and the cfq scheduler
#however cfq scheduler provide the better performance
#Values are: on, off
#Scheduler values are: noop, deadline, cfq, bfq, sio
MTWEAKS="on"
SCHEDULER="cfq"

################################
#Parameters settings end here! #
################################
etweak()
{
	if [[ "${SMODE}" == "on" ]]; then
		if [ -e $1 ]; then
			echo "Original: $1 = "`cat $1` >> /cache/tweaklog.txt
			echo "$2" > $1
			echo -e "Tweaked: $1 = "`cat $1`"\n" >> /cache/tweaklog.txt
		fi
	elif [ -e $1 ]; then
		echo "Original: $1 = "`cat $1` >> /cache/tweaklog.txt
	fi
}

etweak_nc()
{
	if [[ "${SMODE}" == "on" ]]; then
			echo "Original: $1 = "`cat $1` >> /cache/tweaklog.txt
			echo "$2" > $1
			echo -e "Tweaked: $1 = "`cat $1`"\n" >> /cache/tweaklog.txt
		else
			echo "Original: $1 = "`cat $1` >> /cache/tweaklog.txt
	fi
}

#########################################
#Basic Memory Management and LMK Tweaks #
#########################################
TOTALMEM=`free | grep Mem | awk 'BEGIN { FS = " " } ; { print $2 }'`

basic_mem_tweaks()
{
	#Strict minfree handler tweak
	etweak /sys/module/lowmemorykiller/parameters/adj 0,3,6,10,12,15
	lmk()
		{
			if [[ "${LMKVAL}" == "$1" ]]; then
				echo "Lowmemorykiller mode is: $LMKVAL" >> /cache/tweaklog.txt
				etweak /sys/module/lowmemorykiller/parameters/minfree $2
			fi
		}

	#lowmemorykiller auto management
	if [[ "${LMKVAL}" == "auto" ]]; then	
		echo "Using lowmemorykiller auto management mode..." >> /cache/tweaklog.txt
			if [ "$TOTALMEM" -gt "470000" ]; then
				LMKVAL="opt"
			elif [ "$TOTALMEM" -gt "440000" ]; then
				LMKVAL="str"
			elif [ "$TOTALMEM" -gt "410000" ]; then
				LMKVAL="aggr"
			fi
	fi
	#Define minfree 
	lmk opt 2048,3072,10240,12288,14080,16128
	lmk str 2048,3584,10240,12800,15360,19200
	lmk aggr 2048,3584,14080,17920,21760,25600
}

#################
#Network Tweaks #
#################
network_tweaks()
{
	etweak_nc /proc/sys/net/ipv4/tcp_timestamps 0
	etweak_nc /proc/sys/net/ipv4/tcp_no_metrics_save 1
	etweak_nc /proc/sys/net/ipv4/tcp_tw_reuse 1
	etweak_nc /proc/sys/net/ipv4/tcp_sack 1
	etweak_nc /proc/sys/net/ipv4/tcp_window_scaling 0
	etweak_nc /proc/sys/net/ipv4/tcp_keepalive_time 1200
	etweak_nc /proc/sys/net/ipv4/tcp_keepalive_probes 5
	etweak_nc /proc/sys/net/ipv4/tcp_keepalive_intvl 30
	etweak_nc /proc/sys/net/ipv4/tcp_fin_timeout 15
	etweak_nc /proc/sys/net/ipv4/tcp_max_tw_buckets 360000
	etweak_nc /proc/sys/net/ipv4/tcp_moderate_rcvbuf 1
	etweak_nc /proc/sys/net/ipv4/tcp_reordering 5
	etweak_nc /proc/sys/net/ipv4/tcp_slow_start_after_idle 0
	etweak_nc /proc/sys/net/ipv4/tcp_syn_retries 3
	etweak_nc /proc/sys/net/ipv4/tcp_synack_retries 2
	etweak_nc /proc/sys/net/ipv4/tcp_tw_recycle 1
	etweak_nc /proc/sys/net/ipv4/tcp_rmem 6144,87380,524288
	etweak_nc /proc/sys/net/ipv4/tcp_wmem 6144,87380,524288
	etweak_nc /proc/sys/net/ipv4/conf/all/accept_redirects 0
	etweak_nc /proc/sys/net/ipv4/conf/default/accept_redirects 0
	etweak_nc /proc/sys/net/ipv4/route.flush 1	
	etweak_nc /proc/sys/net/core/wmem_default 65535
	etweak_nc /proc/sys/net/core/wmem_max 524288
	etweak_nc /proc/sys/net/core/rmem_default 65535
	etweak_nc /proc/sys/net/core/rmem_max 524288
	etweak_nc /proc/sys/net/core/netdev_max_backlog 262144
	etweak_nc /proc/sys/net/core/somaxconn 262144
}

############
#VM Tweaks #
############
vm_tweaks()
{
	#Disable normalized sleeper
	mount -t debugfs none /sys/kernel/debug
	echo NO_NORMALIZED_SLEEPER > /sys/kernel/debug/sched_features
	#Force Enable CPU second core
	chmod 666 /sys/devices/system/cpu/cpu1/online
	etweak /sys/devices/system/cpu/cpu1/online 1
	chmod 444 /sys/devices/system/cpu/cpu1/online
	#Memory management
	etweak /proc/sys/vm/oom_kill_allocating_task 0
	etweak /proc/sys/vm/panic_on_oom 0
	etweak /proc/sys/vm/laptop_mode 0
	etweak /proc/sys/vm/swappiness 20
	etweak /proc/sys/vm/dirty_background_ratio 60
	etweak /proc/sys/vm/dirty_ratio 95
	etweak /proc/sys/vm/min_free_kbytes 8192
	etweak /proc/sys/vm/vfs_cache_pressure 10
	etweak /proc/sys/vm/overcommit_memory 1
	etweak /proc/sys/vm/page-cluster 3
	etweak /proc/sys/vm/min_free_order_shift 4
	etweak /proc/sys/vm/dirty_writeback_centisecs 2000
	etweak /proc/sys/vm/dirty_expire_centisecs 1000
	etweak /proc/sys/fs/lease-break-time 45
	etweak_nc /proc/sys/kernel/hung_task_timeout_secs 30
	etweak_nc /proc/sys/kernel/panic 30
	etweak_nc /proc/sys/kernel/panic_on_oops 1
	etweak_nc /proc/sys/kernel/sched_compat_yield 1
	etweak_nc /proc/sys/kernel/sched_child_runs_first 0
	etweak_nc /proc/sys/kernel/sched_features 24189
	etweak_nc /proc/sys/kernel/sched_latency_ns 18000000
	etweak_nc /proc/sys/kernel/sched_min_granularity_ns 1500000
	etweak_nc /proc/sys/kernel/sched_wakeup_granularity_ns 3000000
	etweak_nc /proc/sys/kernel/sched_shares_ratelimit 256000
	etweak_nc /proc/sys/kernel/threads-max 5000
}

ccache()
{
	#Compcache management
	ccache_proc()
	{
		echo 1 > /sys/block/zram0/reset
		setprop persist.compcache.user 1
		setprop persist.service.compcache 1
		sync; sysctl -w vm.drop_caches=3 > /dev/null
		echo $(($1*1024*1024)) > /sys/block/zram0/disksize
		mkswap /dev/block/zram0 > /dev/nul
		swapon /dev/block/zram0
		#Cron job for periodically cache drop
		mkdir -p /data/cron
		echo "* */$INTERVAL * * * sync; sysctl -w vm.drop_caches=3" > /data/cron/root
		/system/xbin/crond -b -l 0 -c /data/cron -L /data/cron/cron.log
	}
		if [[ "${CS_SIZE}" == "auto" ]]; then
			CS_SIZE=$(($TOTALMEM*$CS_RATIO/102400))
			echo "Using compcache auto management mode..." >> /cache/tweaklog.txt
			echo "Compcache ratio is $CS_RATIO%" >> /cache/tweaklog.txt
			echo "Total memory is $(($TOTALMEM/1024))MB" >> /cache/tweaklog.txt
			echo "Used compcache size is $(($CS_SIZE))MB" >> /cache/tweaklog.txt
			ccache_proc $CS_SIZE
		else
			echo "Compcache in static mode size is $CS_SIZEMB" >> /cache/tweaklog.txt
			ccache_proc $CS_SIZE
		fi
}

######################
#Mount Option Tweaks #
######################

mount_tweaks()
{
	# Remount with noatime and nodiratime
	busybox mount -o remount,noatime,nodiratime,commit=180,noauto_da_alloc /system
	busybox mount -o remount,noatime,nodiratime,commit=180,noauto_da_alloc /data
	busybox mount -o remount,noatime,nodiratime,commit=180,noauto_da_alloc /cache 
	m0()
	{
		etweak /sys/block/$1/queue/rotational 0
		etweak /sys/block/$1/queue/optimal_io_size 1024
		etweak /sys/block/$1/queue/read_ahead_kb 2048
		etweak /sys/block/$1/queue/iostats 0
		etweak /sys/block/$1/queue/iosched/fifo_batch 1
		etweak /sys/block/$1/queue/iosched/group_isolation 1
		etweak /sys/block/$1/queue/iosched/quantum 4
		etweak /sys/block/$1/queue/iosched/low_latency 1
		etweak /sys/block/$1/queue/iosched/slice_idle 5
		etweak /sys/block/$1/queue/iosched/back_seek_penalty 1
		etweak /sys/block/$1/queue/iosched/back_seek_max 1000000000
		etweak /sys/block/$1/queue/nr_requests 128
		etweak /sys/block/$1/queue/scheduler $SCHEDULER
	}
	m0 mmcblk0 && m0 mmcblk1
	etweak /sys/devices/virtual/bdi/179:0/read_ahead_kb 2048
}

######################
#Procedures end here #
######################

if [ -f /cache/tweaklog.txt ]; then
	rm -rf /cache/tweaklog.txt
fi
touch /cache/tweaklog.txt
echo "#################################" >> /cache/tweaklog.txt
echo "## Super tweak script log file ##" >> /cache/tweaklog.txt
echo "#################################" >> /cache/tweaklog.txt
echo -e "##Kernel version: "`uname -r`"\n" >> /cache/tweaklog.txt

sysctl -p /etc/sysctl.conf
if [[ "${LMKMODE}" == "on" ]]; then
	basic_mem_tweaks
fi
if [[ "${NETTWEAKS}" == "on" ]]; then
	network_tweaks
fi
if [[ "${VMTWEAKS}" == "on" ]]; then
	vm_tweaks
fi
if [[ "${COMPCACHE}" == "on" ]]; then
	ccache
fi
if [[ "${MTWEAKS}" == "on" ]]; then
	mount_tweaks
fi
if [ -e /dev/log/main ]; then
	rm /dev/log/main
fi

exit 1