|
Zdenek Prikryl |
27d3fd2 |
#!/bin/bash
|
|
Zdenek Prikryl |
27d3fd2 |
#
|
|
Zdenek Prikryl |
27d3fd2 |
# Version for APM
|
|
Zdenek Prikryl |
27d3fd2 |
#
|
|
Zdenek Prikryl |
27d3fd2 |
# start or stop laptop_mode, best run by a power management daemon when
|
|
Zdenek Prikryl |
27d3fd2 |
# ac gets connected/disconnected from a laptop
|
|
Zdenek Prikryl |
27d3fd2 |
#
|
|
Zdenek Prikryl |
27d3fd2 |
#
|
|
Zdenek Prikryl |
27d3fd2 |
# Contributors to this script: Kiko Piris
|
|
Zdenek Prikryl |
27d3fd2 |
# Bart Samwel
|
|
Zdenek Prikryl |
27d3fd2 |
# Micha Feigin
|
|
Zdenek Prikryl |
27d3fd2 |
# Andrew Morton
|
|
Zdenek Prikryl |
27d3fd2 |
# Herve Eychenne
|
|
Zdenek Prikryl |
27d3fd2 |
# Dax Kelson
|
|
Zdenek Prikryl |
27d3fd2 |
#
|
|
Zdenek Prikryl |
27d3fd2 |
# Original Linux 2.4 version by: Jens Axboe
|
|
Zdenek Prikryl |
27d3fd2 |
|
|
Zdenek Prikryl |
27d3fd2 |
#############################################################################
|
|
Zdenek Prikryl |
27d3fd2 |
|
|
Zdenek Prikryl |
27d3fd2 |
# Source config
|
|
Zdenek Prikryl |
27d3fd2 |
if [ -f /etc/sysconfig/apmd ] ; then
|
|
Zdenek Prikryl |
27d3fd2 |
. /etc/sysconfig/apmd
|
|
Zdenek Prikryl |
27d3fd2 |
fi
|
|
Zdenek Prikryl |
27d3fd2 |
|
|
Zdenek Prikryl |
27d3fd2 |
# Don't raise an error if the config file is incomplete
|
|
Zdenek Prikryl |
27d3fd2 |
# set defaults instead:
|
|
Zdenek Prikryl |
27d3fd2 |
|
|
Zdenek Prikryl |
27d3fd2 |
# Maximum time, in seconds, of hard drive spindown time that you are
|
|
Zdenek Prikryl |
27d3fd2 |
# comfortable with. Worst case, it's possible that you could lose this
|
|
Zdenek Prikryl |
27d3fd2 |
# amount of work if your battery fails you while in laptop mode.
|
|
Zdenek Prikryl |
27d3fd2 |
MAX_AGE=${MAX_AGE:-'600'}
|
|
Zdenek Prikryl |
27d3fd2 |
|
|
Zdenek Prikryl |
27d3fd2 |
# Read-ahead, in kilobytes
|
|
Zdenek Prikryl |
27d3fd2 |
READAHEAD=${READAHEAD:-'4096'}
|
|
Zdenek Prikryl |
27d3fd2 |
|
|
Zdenek Prikryl |
27d3fd2 |
# Shall we remount journaled fs. with appropriate commit interval? (1=yes)
|
|
Zdenek Prikryl |
27d3fd2 |
DO_REMOUNTS=${DO_REMOUNTS:-'1'}
|
|
Zdenek Prikryl |
27d3fd2 |
|
|
Zdenek Prikryl |
27d3fd2 |
# And shall we add the "noatime" option to that as well? (1=yes)
|
|
Zdenek Prikryl |
27d3fd2 |
DO_REMOUNT_NOATIME=${DO_REMOUNT_NOATIME:-'1'}
|
|
Zdenek Prikryl |
27d3fd2 |
|
|
Zdenek Prikryl |
27d3fd2 |
# Shall we adjust the idle timeout on a hard drive?
|
|
Zdenek Prikryl |
27d3fd2 |
DO_HD=${DO_HD:-'1'}
|
|
Zdenek Prikryl |
27d3fd2 |
|
|
Zdenek Prikryl |
27d3fd2 |
# Adjust idle timeout on which hard drive?
|
|
Zdenek Prikryl |
27d3fd2 |
HD="${HD:-'/dev/hda'}"
|
|
Zdenek Prikryl |
27d3fd2 |
|
|
Zdenek Prikryl |
27d3fd2 |
# spindown time for HD (hdparm -S values)
|
|
Zdenek Prikryl |
27d3fd2 |
AC_HD=${AC_HD:-'244'}
|
|
Zdenek Prikryl |
27d3fd2 |
BATT_HD=${BATT_HD:-'4'}
|
|
Zdenek Prikryl |
27d3fd2 |
|
|
Zdenek Prikryl |
27d3fd2 |
# Dirty synchronous ratio. At this percentage of dirty pages the process which
|
|
Zdenek Prikryl |
27d3fd2 |
# calls write() does its own writeback
|
|
Zdenek Prikryl |
27d3fd2 |
DIRTY_RATIO=${DIRTY_RATIO:-'40'}
|
|
Zdenek Prikryl |
27d3fd2 |
|
|
Zdenek Prikryl |
27d3fd2 |
# cpu frequency scaling
|
|
Zdenek Prikryl |
27d3fd2 |
# See Documentation/cpu-freq/user-guide.txt for more info
|
|
Zdenek Prikryl |
27d3fd2 |
DO_CPU=${CPU_MANAGE:-'0'}
|
|
Zdenek Prikryl |
27d3fd2 |
CPU_MAXFREQ=${CPU_MAXFREQ:-'slowest'}
|
|
Zdenek Prikryl |
27d3fd2 |
|
|
Zdenek Prikryl |
27d3fd2 |
#
|
|
Zdenek Prikryl |
27d3fd2 |
# Allowed dirty background ratio, in percent. Once DIRTY_RATIO has been
|
|
Zdenek Prikryl |
27d3fd2 |
# exceeded, the kernel will wake pdflush which will then reduce the amount
|
|
Zdenek Prikryl |
27d3fd2 |
# of dirty memory to dirty_background_ratio. Set this nice and low, so once
|
|
Zdenek Prikryl |
27d3fd2 |
# some writeout has commenced, we do a lot of it.
|
|
Zdenek Prikryl |
27d3fd2 |
#
|
|
Zdenek Prikryl |
27d3fd2 |
DIRTY_BACKGROUND_RATIO=${DIRTY_BACKGROUND_RATIO:-'5'}
|
|
Zdenek Prikryl |
27d3fd2 |
|
|
Zdenek Prikryl |
27d3fd2 |
# kernel default dirty buffer age
|
|
Zdenek Prikryl |
27d3fd2 |
DEF_AGE=${DEF_AGE:-'30'}
|
|
Zdenek Prikryl |
27d3fd2 |
DEF_UPDATE=${DEF_UPDATE:-'5'}
|
|
Zdenek Prikryl |
27d3fd2 |
DEF_DIRTY_BACKGROUND_RATIO=${DEF_DIRTY_BACKGROUND_RATIO:-'10'}
|
|
Zdenek Prikryl |
27d3fd2 |
DEF_DIRTY_RATIO=${DEF_DIRTY_RATIO:-'40'}
|
|
Zdenek Prikryl |
27d3fd2 |
DEF_XFS_AGE_BUFFER=${DEF_XFS_AGE_BUFFER:-'15'}
|
|
Zdenek Prikryl |
27d3fd2 |
DEF_XFS_SYNC_INTERVAL=${DEF_XFS_SYNC_INTERVAL:-'30'}
|
|
Zdenek Prikryl |
27d3fd2 |
DEF_XFS_BUFD_INTERVAL=${DEF_XFS_BUFD_INTERVAL:-'1'}
|
|
Zdenek Prikryl |
27d3fd2 |
|
|
Zdenek Prikryl |
27d3fd2 |
# This must be adjusted manually to the value of HZ in the running kernel
|
|
Zdenek Prikryl |
27d3fd2 |
# on 2.4, until the XFS people change their 2.4 external interfaces to work in
|
|
Zdenek Prikryl |
27d3fd2 |
# centisecs. This can be automated, but it's a work in progress that still needs
|
|
Zdenek Prikryl |
27d3fd2 |
# some fixes. On 2.6 kernels, XFS uses USER_HZ instead of HZ for external
|
|
Zdenek Prikryl |
27d3fd2 |
# interfaces, and that is currently always set to 100. So you don't need to
|
|
Zdenek Prikryl |
27d3fd2 |
# change this on 2.6.
|
|
Zdenek Prikryl |
27d3fd2 |
XFS_HZ=${XFS_HZ:-'100'}
|
|
Zdenek Prikryl |
27d3fd2 |
|
|
Zdenek Prikryl |
27d3fd2 |
#############################################################################
|
|
Zdenek Prikryl |
27d3fd2 |
|
|
Zdenek Prikryl |
27d3fd2 |
KLEVEL="$(uname -r |
|
|
Zdenek Prikryl |
27d3fd2 |
{
|
|
Zdenek Prikryl |
27d3fd2 |
IFS='.' read a b c
|
|
Zdenek Prikryl |
27d3fd2 |
echo $a.$b
|
|
Zdenek Prikryl |
27d3fd2 |
}
|
|
Zdenek Prikryl |
27d3fd2 |
)"
|
|
Zdenek Prikryl |
27d3fd2 |
case "$KLEVEL" in
|
|
Zdenek Prikryl |
27d3fd2 |
"2.4"|"2.6")
|
|
Zdenek Prikryl |
27d3fd2 |
;;
|
|
Zdenek Prikryl |
27d3fd2 |
*)
|
|
Zdenek Prikryl |
27d3fd2 |
echo "Unhandled kernel version: $KLEVEL ('uname -r' = '$(uname -r)')" >&2
|
|
Zdenek Prikryl |
27d3fd2 |
exit 1
|
|
Zdenek Prikryl |
27d3fd2 |
;;
|
|
Zdenek Prikryl |
27d3fd2 |
esac
|
|
Zdenek Prikryl |
27d3fd2 |
|
|
Zdenek Prikryl |
27d3fd2 |
if [ ! -e /proc/sys/vm/laptop_mode ] ; then
|
|
Zdenek Prikryl |
27d3fd2 |
echo "Kernel is not patched with laptop_mode patch." >&2
|
|
Zdenek Prikryl |
27d3fd2 |
exit 1
|
|
Zdenek Prikryl |
27d3fd2 |
fi
|
|
Zdenek Prikryl |
27d3fd2 |
|
|
Zdenek Prikryl |
27d3fd2 |
if [ ! -w /proc/sys/vm/laptop_mode ] ; then
|
|
Zdenek Prikryl |
27d3fd2 |
echo "You do not have enough privileges to enable laptop_mode." >&2
|
|
Zdenek Prikryl |
27d3fd2 |
exit 1
|
|
Zdenek Prikryl |
27d3fd2 |
fi
|
|
Zdenek Prikryl |
27d3fd2 |
|
|
Zdenek Prikryl |
27d3fd2 |
# Remove an option (the first parameter) of the form option=<number> from
|
|
Zdenek Prikryl |
27d3fd2 |
# a mount options string (the rest of the parameters).
|
|
Zdenek Prikryl |
27d3fd2 |
parse_mount_opts () {
|
|
Zdenek Prikryl |
27d3fd2 |
OPT="$1"
|
|
Zdenek Prikryl |
27d3fd2 |
shift
|
|
Zdenek Prikryl |
27d3fd2 |
echo ",$*," | sed \
|
|
Zdenek Prikryl |
27d3fd2 |
-e 's/,'"$OPT"'=[0-9]*,/,/g' \
|
|
Zdenek Prikryl |
27d3fd2 |
-e 's/,,*/,/g' \
|
|
Zdenek Prikryl |
27d3fd2 |
-e 's/^,//' \
|
|
Zdenek Prikryl |
27d3fd2 |
-e 's/,$//'
|
|
Zdenek Prikryl |
27d3fd2 |
}
|
|
Zdenek Prikryl |
27d3fd2 |
|
|
Zdenek Prikryl |
27d3fd2 |
# Remove an option (the first parameter) without any arguments from
|
|
Zdenek Prikryl |
27d3fd2 |
# a mount option string (the rest of the parameters).
|
|
Zdenek Prikryl |
27d3fd2 |
parse_nonumber_mount_opts () {
|
|
Zdenek Prikryl |
27d3fd2 |
OPT="$1"
|
|
Zdenek Prikryl |
27d3fd2 |
shift
|
|
Zdenek Prikryl |
27d3fd2 |
echo ",$*," | sed \
|
|
Zdenek Prikryl |
27d3fd2 |
-e 's/,'"$OPT"',/,/g' \
|
|
Zdenek Prikryl |
27d3fd2 |
-e 's/,,*/,/g' \
|
|
Zdenek Prikryl |
27d3fd2 |
-e 's/^,//' \
|
|
Zdenek Prikryl |
27d3fd2 |
-e 's/,$//'
|
|
Zdenek Prikryl |
27d3fd2 |
}
|
|
Zdenek Prikryl |
27d3fd2 |
|
|
Zdenek Prikryl |
27d3fd2 |
# Find out the state of a yes/no option (e.g. "atime"/"noatime") in
|
|
Zdenek Prikryl |
27d3fd2 |
# fstab for a given filesystem, and use this state to replace the
|
|
Zdenek Prikryl |
27d3fd2 |
# value of the option in another mount options string. The device
|
|
Zdenek Prikryl |
27d3fd2 |
# is the first argument, the option name the second, and the default
|
|
Zdenek Prikryl |
27d3fd2 |
# value the third. The remainder is the mount options string.
|
|
Zdenek Prikryl |
27d3fd2 |
#
|
|
Zdenek Prikryl |
27d3fd2 |
# Example:
|
|
Zdenek Prikryl |
27d3fd2 |
# parse_yesno_opts_wfstab /dev/hda1 atime atime defaults,noatime
|
|
Zdenek Prikryl |
27d3fd2 |
#
|
|
Zdenek Prikryl |
27d3fd2 |
# If fstab contains, say, "rw" for this filesystem, then the result
|
|
Zdenek Prikryl |
27d3fd2 |
# will be "defaults,atime".
|
|
Zdenek Prikryl |
27d3fd2 |
parse_yesno_opts_wfstab () {
|
|
Zdenek Prikryl |
27d3fd2 |
L_DEV="$1"
|
|
Zdenek Prikryl |
27d3fd2 |
OPT="$2"
|
|
Zdenek Prikryl |
27d3fd2 |
DEF_OPT="$3"
|
|
Zdenek Prikryl |
27d3fd2 |
shift 3
|
|
Zdenek Prikryl |
27d3fd2 |
L_OPTS="$*"
|
|
Zdenek Prikryl |
27d3fd2 |
PARSEDOPTS1="$(parse_nonumber_mount_opts $OPT $L_OPTS)"
|
|
Zdenek Prikryl |
27d3fd2 |
PARSEDOPTS1="$(parse_nonumber_mount_opts no$OPT $PARSEDOPTS1)"
|
|
Zdenek Prikryl |
27d3fd2 |
# Watch for a default atime in fstab
|
|
Zdenek Prikryl |
27d3fd2 |
FSTAB_OPTS="$(awk '$1 == "'$L_DEV'" { print $4 }' /etc/fstab)"
|
|
Zdenek Prikryl |
27d3fd2 |
if echo "$FSTAB_OPTS" | grep "$OPT" > /dev/null ; then
|
|
Zdenek Prikryl |
27d3fd2 |
# option specified in fstab: extract the value and use it
|
|
Zdenek Prikryl |
27d3fd2 |
if echo "$FSTAB_OPTS" | grep "no$OPT" > /dev/null ; then
|
|
Zdenek Prikryl |
27d3fd2 |
echo "$PARSEDOPTS1,no$OPT"
|
|
Zdenek Prikryl |
27d3fd2 |
else
|
|
Zdenek Prikryl |
27d3fd2 |
# no$OPT not found -- so we must have $OPT.
|
|
Zdenek Prikryl |
27d3fd2 |
echo "$PARSEDOPTS1,$OPT"
|
|
Zdenek Prikryl |
27d3fd2 |
fi
|
|
Zdenek Prikryl |
27d3fd2 |
else
|
|
Zdenek Prikryl |
27d3fd2 |
# option not specified in fstab -- choose the default.
|
|
Zdenek Prikryl |
27d3fd2 |
echo "$PARSEDOPTS1,$DEF_OPT"
|
|
Zdenek Prikryl |
27d3fd2 |
fi
|
|
Zdenek Prikryl |
27d3fd2 |
}
|
|
Zdenek Prikryl |
27d3fd2 |
|
|
Zdenek Prikryl |
27d3fd2 |
# Find out the state of a numbered option (e.g. "commit=NNN") in
|
|
Zdenek Prikryl |
27d3fd2 |
# fstab for a given filesystem, and use this state to replace the
|
|
Zdenek Prikryl |
27d3fd2 |
# value of the option in another mount options string. The device
|
|
Zdenek Prikryl |
27d3fd2 |
# is the first argument, and the option name the second. The
|
|
Zdenek Prikryl |
27d3fd2 |
# remainder is the mount options string in which the replacement
|
|
Zdenek Prikryl |
27d3fd2 |
# must be done.
|
|
Zdenek Prikryl |
27d3fd2 |
#
|
|
Zdenek Prikryl |
27d3fd2 |
# Example:
|
|
Zdenek Prikryl |
27d3fd2 |
# parse_mount_opts_wfstab /dev/hda1 commit defaults,commit=7
|
|
Zdenek Prikryl |
27d3fd2 |
#
|
|
Zdenek Prikryl |
27d3fd2 |
# If fstab contains, say, "commit=3,rw" for this filesystem, then the
|
|
Zdenek Prikryl |
27d3fd2 |
# result will be "rw,commit=3".
|
|
Zdenek Prikryl |
27d3fd2 |
parse_mount_opts_wfstab () {
|
|
Zdenek Prikryl |
27d3fd2 |
L_DEV="$1"
|
|
Zdenek Prikryl |
27d3fd2 |
OPT="$2"
|
|
Zdenek Prikryl |
27d3fd2 |
shift 2
|
|
Zdenek Prikryl |
27d3fd2 |
L_OPTS="$*"
|
|
Zdenek Prikryl |
27d3fd2 |
PARSEDOPTS1="$(parse_mount_opts $OPT $L_OPTS)"
|
|
Zdenek Prikryl |
27d3fd2 |
# Watch for a default commit in fstab
|
|
Zdenek Prikryl |
27d3fd2 |
FSTAB_OPTS="$(awk '$1 == "'$L_DEV'" { print $4 }' /etc/fstab)"
|
|
Zdenek Prikryl |
27d3fd2 |
if echo "$FSTAB_OPTS" | grep "$OPT=" > /dev/null ; then
|
|
Zdenek Prikryl |
27d3fd2 |
# option specified in fstab: extract the value, and use it
|
|
Zdenek Prikryl |
27d3fd2 |
echo -n "$PARSEDOPTS1,$OPT="
|
|
Zdenek Prikryl |
27d3fd2 |
echo ",$FSTAB_OPTS," | sed \
|
|
Zdenek Prikryl |
27d3fd2 |
-e 's/.*,'"$OPT"'=//' \
|
|
Zdenek Prikryl |
27d3fd2 |
-e 's/,.*//'
|
|
Zdenek Prikryl |
27d3fd2 |
else
|
|
Zdenek Prikryl |
27d3fd2 |
# option not specified in fstab: set it to 0
|
|
Zdenek Prikryl |
27d3fd2 |
echo "$PARSEDOPTS1,$OPT=0"
|
|
Zdenek Prikryl |
27d3fd2 |
fi
|
|
Zdenek Prikryl |
27d3fd2 |
}
|
|
Zdenek Prikryl |
27d3fd2 |
|
|
Zdenek Prikryl |
27d3fd2 |
deduce_fstype () {
|
|
Zdenek Prikryl |
27d3fd2 |
MP="$1"
|
|
Zdenek Prikryl |
27d3fd2 |
# My root filesystem unfortunately has
|
|
Zdenek Prikryl |
27d3fd2 |
# type "unknown" in /etc/mtab. If we encounter
|
|
Zdenek Prikryl |
27d3fd2 |
# "unknown", we try to get the type from fstab.
|
|
Zdenek Prikryl |
27d3fd2 |
cat /etc/fstab |
|
|
Zdenek Prikryl |
27d3fd2 |
grep -v '^#' |
|
|
Zdenek Prikryl |
27d3fd2 |
while read FSTAB_DEV FSTAB_MP FSTAB_FST FSTAB_OPTS FSTAB_DUMP FSTAB_DUMP ; do
|
|
Zdenek Prikryl |
27d3fd2 |
if [ "$FSTAB_MP" = "$MP" ]; then
|
|
Zdenek Prikryl |
27d3fd2 |
echo $FSTAB_FST
|
|
Zdenek Prikryl |
27d3fd2 |
exit 0
|
|
Zdenek Prikryl |
27d3fd2 |
fi
|
|
Zdenek Prikryl |
27d3fd2 |
done
|
|
Zdenek Prikryl |
27d3fd2 |
}
|
|
Zdenek Prikryl |
27d3fd2 |
|
|
Zdenek Prikryl |
27d3fd2 |
if [ $DO_REMOUNT_NOATIME -eq 1 ] ; then
|
|
Zdenek Prikryl |
27d3fd2 |
NOATIME_OPT=",noatime"
|
|
Zdenek Prikryl |
27d3fd2 |
fi
|
|
Zdenek Prikryl |
27d3fd2 |
|
|
Zdenek Prikryl |
27d3fd2 |
case "$1" in
|
|
Zdenek Prikryl |
27d3fd2 |
start)
|
|
Zdenek Prikryl |
27d3fd2 |
AGE=$((100*$MAX_AGE))
|
|
Zdenek Prikryl |
27d3fd2 |
XFS_AGE=$(($XFS_HZ*$MAX_AGE))
|
|
Zdenek Prikryl |
27d3fd2 |
echo -n "Starting laptop_mode"
|
|
Zdenek Prikryl |
27d3fd2 |
|
|
Zdenek Prikryl |
27d3fd2 |
if [ -d /proc/sys/vm/pagebuf ] ; then
|
|
Zdenek Prikryl |
27d3fd2 |
# (For 2.4 and early 2.6.)
|
|
Zdenek Prikryl |
27d3fd2 |
# This only needs to be set, not reset -- it is only used when
|
|
Zdenek Prikryl |
27d3fd2 |
# laptop mode is enabled.
|
|
Zdenek Prikryl |
27d3fd2 |
echo $XFS_AGE > /proc/sys/vm/pagebuf/lm_flush_age
|
|
Zdenek Prikryl |
27d3fd2 |
echo $XFS_AGE > /proc/sys/fs/xfs/lm_sync_interval
|
|
Zdenek Prikryl |
27d3fd2 |
elif [ -f /proc/sys/fs/xfs/lm_age_buffer ] ; then
|
|
Zdenek Prikryl |
27d3fd2 |
# (A couple of early 2.6 laptop mode patches had these.)
|
|
Zdenek Prikryl |
27d3fd2 |
# The same goes for these.
|
|
Zdenek Prikryl |
27d3fd2 |
echo $XFS_AGE > /proc/sys/fs/xfs/lm_age_buffer
|
|
Zdenek Prikryl |
27d3fd2 |
echo $XFS_AGE > /proc/sys/fs/xfs/lm_sync_interval
|
|
Zdenek Prikryl |
27d3fd2 |
elif [ -f /proc/sys/fs/xfs/age_buffer ] ; then
|
|
Zdenek Prikryl |
27d3fd2 |
# (2.6.6)
|
|
Zdenek Prikryl |
27d3fd2 |
# But not for these -- they are also used in normal
|
|
Zdenek Prikryl |
27d3fd2 |
# operation.
|
|
Zdenek Prikryl |
27d3fd2 |
echo $XFS_AGE > /proc/sys/fs/xfs/age_buffer
|
|
Zdenek Prikryl |
27d3fd2 |
echo $XFS_AGE > /proc/sys/fs/xfs/sync_interval
|
|
Zdenek Prikryl |
27d3fd2 |
elif [ -f /proc/sys/fs/xfs/age_buffer_centisecs ] ; then
|
|
Zdenek Prikryl |
27d3fd2 |
# (2.6.7 upwards)
|
|
Zdenek Prikryl |
27d3fd2 |
# And not for these either. These are in centisecs,
|
|
Zdenek Prikryl |
27d3fd2 |
# not USER_HZ, so we have to use $AGE, not $XFS_AGE.
|
|
Zdenek Prikryl |
27d3fd2 |
echo $AGE > /proc/sys/fs/xfs/age_buffer_centisecs
|
|
Zdenek Prikryl |
27d3fd2 |
echo $AGE > /proc/sys/fs/xfs/xfssyncd_centisecs
|
|
Zdenek Prikryl |
27d3fd2 |
echo 3000 > /proc/sys/fs/xfs/xfsbufd_centisecs
|
|
Zdenek Prikryl |
27d3fd2 |
fi
|
|
Zdenek Prikryl |
27d3fd2 |
|
|
Zdenek Prikryl |
27d3fd2 |
case "$KLEVEL" in
|
|
Zdenek Prikryl |
27d3fd2 |
"2.4")
|
|
Zdenek Prikryl |
27d3fd2 |
echo 1 > /proc/sys/vm/laptop_mode
|
|
Zdenek Prikryl |
27d3fd2 |
echo "30 500 0 0 $AGE $AGE 60 20 0" > /proc/sys/vm/bdflush
|
|
Zdenek Prikryl |
27d3fd2 |
;;
|
|
Zdenek Prikryl |
27d3fd2 |
"2.6")
|
|
Zdenek Prikryl |
27d3fd2 |
echo 5 > /proc/sys/vm/laptop_mode
|
|
Zdenek Prikryl |
27d3fd2 |
echo "$AGE" > /proc/sys/vm/dirty_writeback_centisecs
|
|
Zdenek Prikryl |
27d3fd2 |
echo "$AGE" > /proc/sys/vm/dirty_expire_centisecs
|
|
Zdenek Prikryl |
27d3fd2 |
echo "$DIRTY_RATIO" > /proc/sys/vm/dirty_ratio
|
|
Zdenek Prikryl |
27d3fd2 |
echo "$DIRTY_BACKGROUND_RATIO" > /proc/sys/vm/dirty_background_ratio
|
|
Zdenek Prikryl |
27d3fd2 |
;;
|
|
Zdenek Prikryl |
27d3fd2 |
esac
|
|
Zdenek Prikryl |
27d3fd2 |
if [ $DO_REMOUNTS -eq 1 ]; then
|
|
Zdenek Prikryl |
27d3fd2 |
cat /etc/mtab | while read DEV MP FST OPTS DUMP PASS ; do
|
|
Zdenek Prikryl |
27d3fd2 |
PARSEDOPTS="$(parse_mount_opts "$OPTS")"
|
|
Zdenek Prikryl |
27d3fd2 |
if [ "$FST" = 'unknown' ]; then
|
|
Zdenek Prikryl |
27d3fd2 |
FST=$(deduce_fstype $MP)
|
|
Zdenek Prikryl |
27d3fd2 |
fi
|
|
Zdenek Prikryl |
27d3fd2 |
case "$FST" in
|
|
Zdenek Prikryl |
27d3fd2 |
"ext3"|"reiserfs")
|
|
Zdenek Prikryl |
27d3fd2 |
PARSEDOPTS="$(parse_mount_opts commit "$OPTS")"
|
|
Zdenek Prikryl |
27d3fd2 |
mount $DEV -t $FST $MP -o remount,$PARSEDOPTS,commit=$MAX_AGE$NOATIME_OPT
|
|
Zdenek Prikryl |
27d3fd2 |
;;
|
|
Zdenek Prikryl |
27d3fd2 |
"xfs")
|
|
Zdenek Prikryl |
27d3fd2 |
mount $DEV -t $FST $MP -o remount,$OPTS$NOATIME_OPT
|
|
Zdenek Prikryl |
27d3fd2 |
;;
|
|
Zdenek Prikryl |
27d3fd2 |
esac
|
|
Zdenek Prikryl |
27d3fd2 |
if [ -b $DEV ] ; then
|
|
Zdenek Prikryl |
27d3fd2 |
blockdev --setra $(($READAHEAD * 2)) $DEV
|
|
Zdenek Prikryl |
27d3fd2 |
fi
|
|
Zdenek Prikryl |
27d3fd2 |
done
|
|
Zdenek Prikryl |
27d3fd2 |
fi
|
|
Zdenek Prikryl |
27d3fd2 |
if [ $DO_HD -eq 1 ] ; then
|
|
Zdenek Prikryl |
27d3fd2 |
for THISHD in $HD ; do
|
|
Zdenek Prikryl |
27d3fd2 |
/sbin/hdparm -S $BATT_HD $THISHD > /dev/null 2>&1
|
|
Zdenek Prikryl |
27d3fd2 |
/sbin/hdparm -B 1 $THISHD > /dev/null 2>&1
|
|
Zdenek Prikryl |
27d3fd2 |
done
|
|
Zdenek Prikryl |
27d3fd2 |
fi
|
|
Zdenek Prikryl |
27d3fd2 |
if [ $DO_CPU -eq 1 ]; then
|
|
Zdenek Prikryl |
27d3fd2 |
for THISCPU in /sys/devices/system/cpu/*/; do
|
|
Zdenek Prikryl |
27d3fd2 |
if [ -e $THISCPU/cpufreq/cpuinfo_min_freq ]; then
|
|
Zdenek Prikryl |
27d3fd2 |
if [ $CPU_MAXFREQ = 'slowest' ]; then
|
|
Zdenek Prikryl |
27d3fd2 |
CPU_MAXFREQ=`cat $THISCPU/cpufreq/cpuinfo_min_freq`
|
|
Zdenek Prikryl |
27d3fd2 |
fi
|
|
Zdenek Prikryl |
27d3fd2 |
echo $CPU_MAXFREQ > $THISCPU/cpufreq/scaling_max_freq
|
|
Zdenek Prikryl |
27d3fd2 |
fi
|
|
Zdenek Prikryl |
27d3fd2 |
done
|
|
Zdenek Prikryl |
27d3fd2 |
fi
|
|
Zdenek Prikryl |
27d3fd2 |
echo "."
|
|
Zdenek Prikryl |
27d3fd2 |
;;
|
|
Zdenek Prikryl |
27d3fd2 |
stop)
|
|
Zdenek Prikryl |
27d3fd2 |
U_AGE=$((100*$DEF_UPDATE))
|
|
Zdenek Prikryl |
27d3fd2 |
B_AGE=$((100*$DEF_AGE))
|
|
Zdenek Prikryl |
27d3fd2 |
echo -n "Stopping laptop_mode"
|
|
Zdenek Prikryl |
27d3fd2 |
echo 0 > /proc/sys/vm/laptop_mode
|
|
Zdenek Prikryl |
27d3fd2 |
if [ -f /proc/sys/fs/xfs/age_buffer -a ! -f /proc/sys/fs/xfs/lm_age_buffer ] ; then
|
|
Zdenek Prikryl |
27d3fd2 |
# These need to be restored, if there are no lm_*.
|
|
Zdenek Prikryl |
27d3fd2 |
echo $(($XFS_HZ*$DEF_XFS_AGE_BUFFER)) > /proc/sys/fs/xfs/age_buffer
|
|
Zdenek Prikryl |
27d3fd2 |
echo $(($XFS_HZ*$DEF_XFS_SYNC_INTERVAL)) > /proc/sys/fs/xfs/sync_interval
|
|
Zdenek Prikryl |
27d3fd2 |
elif [ -f /proc/sys/fs/xfs/age_buffer_centisecs ] ; then
|
|
Zdenek Prikryl |
27d3fd2 |
# These need to be restored as well.
|
|
Zdenek Prikryl |
27d3fd2 |
echo $((100*$DEF_XFS_AGE_BUFFER)) > /proc/sys/fs/xfs/age_buffer_centisecs
|
|
Zdenek Prikryl |
27d3fd2 |
echo $((100*$DEF_XFS_SYNC_INTERVAL)) > /proc/sys/fs/xfs/xfssyncd_centisecs
|
|
Zdenek Prikryl |
27d3fd2 |
echo $((100*$DEF_XFS_BUFD_INTERVAL)) > /proc/sys/fs/xfs/xfsbufd_centisecs
|
|
Zdenek Prikryl |
27d3fd2 |
fi
|
|
Zdenek Prikryl |
27d3fd2 |
case "$KLEVEL" in
|
|
Zdenek Prikryl |
27d3fd2 |
"2.4")
|
|
Zdenek Prikryl |
27d3fd2 |
echo "30 500 0 0 $U_AGE $B_AGE 60 20 0" > /proc/sys/vm/bdflush
|
|
Zdenek Prikryl |
27d3fd2 |
;;
|
|
Zdenek Prikryl |
27d3fd2 |
"2.6")
|
|
Zdenek Prikryl |
27d3fd2 |
echo "$U_AGE" > /proc/sys/vm/dirty_writeback_centisecs
|
|
Zdenek Prikryl |
27d3fd2 |
echo "$B_AGE" > /proc/sys/vm/dirty_expire_centisecs
|
|
Zdenek Prikryl |
27d3fd2 |
echo "$DEF_DIRTY_RATIO" > /proc/sys/vm/dirty_ratio
|
|
Zdenek Prikryl |
27d3fd2 |
echo "$DEF_DIRTY_BACKGROUND_RATIO" > /proc/sys/vm/dirty_background_ratio
|
|
Zdenek Prikryl |
27d3fd2 |
;;
|
|
Zdenek Prikryl |
27d3fd2 |
esac
|
|
Zdenek Prikryl |
27d3fd2 |
if [ $DO_REMOUNTS -eq 1 ] ; then
|
|
Zdenek Prikryl |
27d3fd2 |
cat /etc/mtab | while read DEV MP FST OPTS DUMP PASS ; do
|
|
Zdenek Prikryl |
27d3fd2 |
# Reset commit and atime options to defaults.
|
|
Zdenek Prikryl |
27d3fd2 |
if [ "$FST" = 'unknown' ]; then
|
|
Zdenek Prikryl |
27d3fd2 |
FST=$(deduce_fstype $MP)
|
|
Zdenek Prikryl |
27d3fd2 |
fi
|
|
Zdenek Prikryl |
27d3fd2 |
case "$FST" in
|
|
Zdenek Prikryl |
27d3fd2 |
"ext3"|"reiserfs")
|
|
Zdenek Prikryl |
27d3fd2 |
PARSEDOPTS="$(parse_mount_opts_wfstab $DEV commit $OPTS)"
|
|
Zdenek Prikryl |
27d3fd2 |
PARSEDOPTS="$(parse_yesno_opts_wfstab $DEV atime atime $PARSEDOPTS)"
|
|
Zdenek Prikryl |
27d3fd2 |
mount $DEV -t $FST $MP -o remount,$PARSEDOPTS
|
|
Zdenek Prikryl |
27d3fd2 |
;;
|
|
Zdenek Prikryl |
27d3fd2 |
"xfs")
|
|
Zdenek Prikryl |
27d3fd2 |
PARSEDOPTS="$(parse_yesno_opts_wfstab $DEV atime atime $OPTS)"
|
|
Zdenek Prikryl |
27d3fd2 |
mount $DEV -t $FST $MP -o remount,$PARSEDOPTS
|
|
Zdenek Prikryl |
27d3fd2 |
;;
|
|
Zdenek Prikryl |
27d3fd2 |
esac
|
|
Zdenek Prikryl |
27d3fd2 |
if [ -b $DEV ] ; then
|
|
Zdenek Prikryl |
27d3fd2 |
blockdev --setra 256 $DEV
|
|
Zdenek Prikryl |
27d3fd2 |
fi
|
|
Zdenek Prikryl |
27d3fd2 |
done
|
|
Zdenek Prikryl |
27d3fd2 |
fi
|
|
Zdenek Prikryl |
27d3fd2 |
if [ $DO_HD -eq 1 ] ; then
|
|
Zdenek Prikryl |
27d3fd2 |
for THISHD in $HD ; do
|
|
Zdenek Prikryl |
27d3fd2 |
/sbin/hdparm -S $AC_HD $THISHD > /dev/null 2>&1
|
|
Zdenek Prikryl |
27d3fd2 |
/sbin/hdparm -B 255 $THISHD > /dev/null 2>&1
|
|
Zdenek Prikryl |
27d3fd2 |
done
|
|
Zdenek Prikryl |
27d3fd2 |
fi
|
|
Zdenek Prikryl |
27d3fd2 |
if [ $DO_CPU -eq 1 ]; then
|
|
Zdenek Prikryl |
27d3fd2 |
for THISCPU in /sys/devices/system/cpu/*/; do
|
|
Zdenek Prikryl |
27d3fd2 |
if [ -e $THISCPU/cpufreq/cpuinfo_min_freq ]; then
|
|
Zdenek Prikryl |
27d3fd2 |
echo `cat $THISCPU/cpufreq/cpuinfo_max_freq` > $THISCPU/cpufreq/scaling_max_freq
|
|
Zdenek Prikryl |
27d3fd2 |
fi
|
|
Zdenek Prikryl |
27d3fd2 |
done
|
|
Zdenek Prikryl |
27d3fd2 |
fi
|
|
Zdenek Prikryl |
27d3fd2 |
echo "."
|
|
Zdenek Prikryl |
27d3fd2 |
;;
|
|
Zdenek Prikryl |
27d3fd2 |
*)
|
|
Zdenek Prikryl |
27d3fd2 |
echo "Usage: $0 {start|stop}" 2>&1
|
|
Zdenek Prikryl |
27d3fd2 |
exit 1
|
|
Zdenek Prikryl |
27d3fd2 |
;;
|
|
Zdenek Prikryl |
27d3fd2 |
|
|
Zdenek Prikryl |
27d3fd2 |
esac
|
|
Zdenek Prikryl |
27d3fd2 |
|
|
Zdenek Prikryl |
27d3fd2 |
exit 0
|