Fixed bnc#753589 - sysctl.conf settings are lost when changing powerstate
[opensuse:pm-utils.git] / pm / power.d / laptop-mode
1 #!/bin/sh
2
3 . "${PM_FUNCTIONS}"
4
5 VM="/proc/sys/vm"
6 vmfiles="laptop_mode dirty_ratio dirty_background_ratio 
7          dirty_writeback_centisecs"
8
9 LAPTOP_MODE=${LAPTOP_MODE:-5}
10 LAPTOP_DIRTY_RATIO=${LAPTOP_DIRTY_RATIO:-60}
11 LAPTOP_DIRTY_BG_RATIO=${LAPTOP_DIRTY_BG_RATIO:-40}
12 LAPTOP_DIRTY_WRITEBACK=${LAPTOP_DIRTY_WRITEBACK:-60000}
13
14 help() {
15     cat <<EOF
16 --------
17 $0: Laptop mode tuning parameters.
18 This hook controls how agressive the system is at trying to avoid
19 writing to disk.  The longer the disk is idle, the more power you can save.
20
21 This hook is only active on battery power, and it restores these values
22 to kernel defaults when on AC power.
23
24 It has 4 tuneable parameters: 
25 LAPTOP_MODE = value for laptop_mode on battery.
26 Defaults to 5, which enables laptop mode and forces the system to wait 
27 5 seconds whenever something asks to write to disk to flush out as much
28 data as we can.
29
30 LAPTOP_DIRTY_RATIO = the ratio of dirty memory to all memory that 
31 processes start doing their own writeout.  
32 Defaults to 60, which means that the kernel will not start forcing process
33 to write out file information that has been changed but not saved until 60%
34 of usable system memory is filled with dirty information.
35
36 LAPTOP_DIRTY_BG_RATIO = The ratio of dirty memory to all memory that 
37 pdflush will wake up and start writing to disk.  
38 Defaults to 40, which means that the kernel will wake up a helper process
39 to try and write out dirty memory once 40% of usable system memory is dirty.
40
41 LAPTOP_DIRTY_WRITEBACK = The number of centiseconds between periodic
42 wakeups of the pdflush daemons.  
43 Defaults to 60000 (10 minutes), which menas that the kernel will flush dirty
44 memory every 10 minutes if dirty memory never hits 40% of system memory.
45
46 EOF
47 }
48
49 [ -w $VM/laptop_mode -a -w $VM/dirty_ratio ] || exit $NA
50
51 read_values() {
52     for f in $vmfiles; do
53         [ -r "$VM/$f" ] && cat "$VM/$f" || echo 0
54     done
55 }
56
57 write_values() {
58     for f in $vmfiles; do
59         [ -w "$VM/$f" ] && echo $1 > "$VM/$f"
60         shift
61     done
62 }
63
64 laptop_mode_ac() {
65     # disable laptop mode, set vm parameters back to sane defaults
66     if state_exists laptop_mode_default; then
67         write_values $(restorestate laptop_mode_default)
68     else
69         write_values 0 10 5 500
70     fi  
71     sysctl -e --system
72     echo "Laptop mode disabled."
73 }
74
75 laptop_mode_battery() {
76     # enable laptop mode, set vm parameters to buffer as many writes as 
77     # possible.
78     state_exists laptop_mode_default || \
79         read_values | savestate laptop_mode_default
80     write_values "$LAPTOP_MODE" "$LAPTOP_DIRTY_RATIO" \
81         "$LAPTOP_DIRTY_BG_RATIO" "$LAPTOP_DIRTY_WRITEBACK"
82     echo "Laptop mode enabled."
83 }
84
85 case $1 in
86     true) laptop_mode_battery ;;
87     false) laptop_mode_ac ;;
88     help) help;;
89     *) exit $NA ;;
90 esac
91
92 exit 0