summaryrefslogtreecommitdiff
path: root/pcr/zramswap/zramctrl
blob: 0165e769ccef0aecc84272e8e30d919614ce816d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#!/bin/sh


start() {
  exec awk -v ZRAM_SIZE=$ZRAM_SIZE -v ZRAM_PARM="$(modinfo zram | grep -E -o '(num_devices|zram_num_devices)')" '

  FILENAME == "/proc/cpuinfo" && ($1 == "processor" || $1 == "Processor") {
    cpucount++
    next
  }

  FILENAME == "/proc/meminfo" && $1 == "MemTotal:" {
    if (ZRAM_SIZE == "")
      ZRAM_SIZE = 20
    mem_total = int( (0 + $2) * 1024 * ( ZRAM_SIZE/100 ) )
    next
  }

  END {
    mem_per_cpu = int(mem_total / cpucount)

    system("modprobe zram "ZRAM_PARM"=" cpucount)

    for (i = 0; i < cpucount; i++) {
      print mem_per_cpu > "/sys/block/zram" i "/disksize"
      system("mkswap /dev/zram" i " -L zram" i)
      swapdevs = swapdevs " /dev/zram" i
    }

    system("swapon -p 100" swapdevs)
  }
  ' /proc/cpuinfo /proc/meminfo
}

stop() {
  exec awk '
  FNR > 1 && $1 ~ /^\/dev\/zram[0-9]+$/ {
    activeswaps = activeswaps " " $1
  }

  END {
    system("swapoff" activeswaps)
    system("rmmod zram")
  }
  ' /proc/swaps
}

case $1 in
  start|stop) "$1" ;;
esac