daily pastebin goal
2%
SHARE
TWEET

zswap

a guest May 21st, 2012 29 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #! /bin/sh
  2. ### BEGIN INIT INFO
  3. # Provides:          zswap
  4. # Required-Start:    $syslog
  5. # Required-Stop:     $syslog
  6. # Default-Start:     2 3 4 5
  7. # Default-Stop:      0 1 6
  8. # Short-Description:       Activate compressed swap
  9. ### END INIT INFO
  10. #
  11. #
  12. # Version:      1.0 john.r.moser@gmail.com
  13. #
  14.  
  15. # Changelog:
  16. # v1.1:
  17. #   - Detect multi-core and use dm_raid to allow multiple threads
  18. #   - Reorder some of the start routine to do nothing until late
  19.  
  20. #
  21. # It's also possible to resize the zswap by device hopping, i.e.
  22. # making a new one on /dev/zram1, swapon /dev/zram1, and then
  23. # swapoff /dev/zram0.  This would be CPU intensive...
  24. #
  25.  
  26. PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
  27. DESC="Sets up compressed swap"
  28. NAME=zswap
  29. SCRIPTNAME=/etc/init.d/$NAME
  30.  
  31. # Default value
  32. MULTITHREAD=1
  33. ZRAM_NUM_DEVICES=4
  34. ZSWAP_DEVICE="zram0"
  35. ZSWAP_SIZE="quarter"
  36.  
  37. # Read config file if it is present.
  38. if [ -r /etc/default/$NAME ]; then
  39.         . /etc/default/$NAME
  40. fi
  41.  
  42. # Gracefully exit if disabled
  43. [ "$ZSWAP_DISABLED" = "1" ] && exit 0
  44.  
  45. is_numeric() {
  46.         echo "$@" | grep -q -v "[^0-9]"
  47. }
  48.  
  49. get_num_cores() {
  50.         awk '/^processor/{f=$3} END{print f+1}' /proc/cpuinfo
  51. }
  52.  
  53. # Disable multithreading if on one CPU
  54. if [ "${MULTITHREAD}" = "1" ]; then
  55.         NUM_CPUS=$(get_num_cores)
  56.         if [ "${NUM_CPUS}" = "1" ]; then
  57.                 MULTITHREAD=0
  58.         fi
  59. fi
  60.  
  61. #Takes:
  62. # zswap_to_bytes 524288
  63. # zswap_to_bytes 512K
  64. # zswap_to_bytes 128M
  65. # zswap_to_bytes 2G
  66. # otherwise formed parameters are errors.
  67. zswap_to_bytes() {
  68.         MODIFIER="${1#${1%?}}"
  69.         ZR_SIZE="${1: -1}"
  70.  
  71.         # Numeric:  just pass as-is
  72.         if ( is_numeric ${1} ) ; then
  73.                 echo ${1}
  74.                 return 0
  75.         fi
  76.  
  77.         # If size isn't a number,
  78.         if ! ( is_numeric ${ZR_SIZE} ) ; then
  79.                 echo "0"
  80.                 return 1
  81.         fi
  82.  
  83.         if [ "${MODIFIER}" = "K" ]; then
  84.                 ZR_SIZE=$(( ZR_SIZE * 1024 ))
  85.         elif [ "${MODIFIER}" = "M" ]; then
  86.                 ZR_SIZE=$(( ZR_SIZE * 1024 * 1024 ))
  87.         elif [ "${MODIFIER}" = "G" ]; then
  88.                 ZR_SIZE=$(( ZR_SIZE * 1024 * 1024 * 1024 ))
  89.         elif [ ! is_numeric "${MODIFIER}" ]; then
  90.                 echo "0"
  91.                 return 1
  92.         fi
  93.         echo $ZR_SIZE
  94. }
  95.  
  96. #
  97. #       Function that starts the daemon/service.
  98. #
  99. d_start_multithread() {
  100.         # Two loops because the first is a sanity check
  101.         for i in `seq 0 $((NUM_CPUS - 1))`; do
  102.                 if [ "$(cat /sys/block/zram${i}/disksize)" != "0" ]; then
  103.                         echo "Device zram${i} in use!"
  104.                         return 1
  105.                 fi
  106.         done
  107.         # split up the size
  108.         ZSWAP_SIZE=$((ZSWAP_SIZE / NUM_CPUS))
  109.         # Fix to chunk size
  110.         ZSWAP_SIZE=$((ZSWAP_SIZE / (1024 * CHUNK_SIZE) ))
  111.         ZSWAP_SIZE=$((ZSWAP_SIZE * (1024 * CHUNK_SIZE) ))
  112.         # Initialize
  113.         # Create device mapper, size in 512 byte sectors
  114.         DM_TABLE="0 $(( (ZSWAP_SIZE / 512) * NUM_CPUS )) striped ${NUM_CPUS} ${CHUNK_SIZE}"
  115.         for i in `seq 0 $((NUM_CPUS - 1))`; do
  116.                 echo "Initializing /dev/zram${i}..."
  117.                 echo $ZSWAP_SIZE > /sys/block/zram${i}/disksize
  118.                 DM_TABLE="${DM_TABLE} /dev/zram${i} 0"
  119.         done
  120.        
  121. #       echo "DM_TABLE=[${DM_TABLE}]"
  122.         echo "${DM_TABLE}" | dmsetup create zswap
  123.         ZSWAP_DEVICE="mapper/zswap"
  124.         if [ ! -b "/dev/${ZSWAP_DEVICE}" ]; then
  125.                 echo "Device mapper creation failed!"
  126.                 return 1
  127.         fi
  128.        
  129. }
  130.  
  131. d_start() {
  132.         ZSWAP_LOADED=0
  133.         swapon -s | cut -f 1 | grep "/dev/${ZSWAP_DEVICE}" && ZSWAP_LOADED=1
  134.         if [ "${ZSWAP_LOADED}" -eq "1" ]; then
  135.                 echo "zswap already in use"
  136.                 return 1
  137.         fi
  138.  
  139.         # Override ZRAM_NUM_DEVICES if multithreading
  140.         if [ "${MULTITHREAD}" = "1" ]; then
  141.                 echo "Creating multi-threaded zswap for $((NUM_CPUS)) cores..."
  142.                 CHUNK_SIZE=$((4 * NUM_CPUS))
  143.                 ZRAM_NUM_DEVICES=$((ZRAM_NUM_DEVICES + NUM_CPUS))
  144.                 ZSWAP_DEVICE="zram$((NUM_CPUS - 1))"
  145.         fi
  146.  
  147.         # half or quarter size
  148.         if [ "${ZSWAP_SIZE}" = "half" ]; then
  149.                 ZSWAP_SIZE=$(awk '/^MemTotal:/{f=$2} END{print f * 512}' /proc/meminfo)
  150.         elif [ "${ZSWAP_SIZE}" = "quarter" ]; then
  151.                 ZSWAP_SIZE=$(awk '/^MemTotal:/{f=$2} END{print f * 256}' /proc/meminfo)
  152.         else
  153.                 ZSWAP_SIZE=$( zswap_to_bytes $ZSWAP_SIZE )
  154.                 if [ "${ZSWAP_SIZE}" = "0" ]; then
  155.                         echo "Invalid ZSWAP_SIZE"
  156.                         return 1
  157.                 fi
  158.         fi
  159.  
  160.         # this parameter name keeps changing with new kernel versions
  161.         modprobe zram zram_num_devices=${ZRAM_NUM_DEVICES}
  162.  
  163.         # Does it now exist?
  164.         if [ ! -b /dev/${ZSWAP_DEVICE} ]; then
  165.                 echo "/dev/${ZSWAP_DEVICE} does not exist!"
  166.                 return 1
  167.         fi
  168.  
  169.         # if we're multi-threading, use device mapper to raid
  170.         if [ "${MULTITHREAD}" = "1" ]; then
  171.                 d_start_multithread
  172.                 ZSWAP_DEVICE="mapper/zswap"
  173.         else
  174.                 echo $ZSWAP_SIZE > /sys/block/${ZSWAP_DEVICE}/disksize
  175.         fi
  176. #       echo "Created!"
  177.         mkswap /dev/${ZSWAP_DEVICE}
  178.         swapon /dev/${ZSWAP_DEVICE}
  179. }
  180.  
  181. #
  182. #       Function that stops the daemon/service.
  183. #
  184. d_stop_multithread() {
  185.         dmsetup remove zswap
  186.         if [ -b "/dev/${ZSWAP_DEVICE}" ]; then
  187.                 echo "Device mapper did not remove zswap!"
  188.                 return 1
  189.         fi
  190.         for i in `seq 0 $((NUM_CPUS - 1))`; do
  191.                 echo "Clearing /dev/zram${i}..."
  192.                 echo 1 > /sys/block/zram${i}/reset
  193.         done
  194. }
  195.  
  196. d_stop() {
  197.         ZSWAP_LOADED=0
  198.         if [ "${MULTITHREAD}" = "1" ]; then
  199.                 ZSWAP_DEVICE="mapper/zswap"
  200.         fi     
  201.  
  202.         swapon -s | cut -f 1 | grep -q "/dev/${ZSWAP_DEVICE}" && ZSWAP_LOADED=1
  203.         if [ "${ZSWAP_LOADED}" != "1" ]; then
  204.                 echo "zswap not in use"
  205.                 return 1
  206.         fi
  207.  
  208.         if ! ( swapoff /dev/${ZSWAP_DEVICE} ); then
  209.                 echo "Cannot de-activate compressed swap /dev/${ZSWAP_DEVICE}!"
  210.                 return 1
  211.         fi
  212.  
  213.         # Double check this
  214.         ZSWAP_LOADED=0
  215.         swapon -s | cut -f 1 | grep -q "/dev/${ZSWAP_DEVICE}" && ZSWAP_LOADED=1
  216.         if [ "${ZSWAP_LOADED}" = "1" ]; then
  217.                 echo "zswap /dev/${ZSWAP_DEVICE} did not de-activate!"
  218.                 return 1
  219.         fi
  220.  
  221.         if [ "${MULTITHREAD}" = "1" ]; then
  222.                 d_stop_multithread
  223.         else
  224.         # free the block device's memory
  225.                 echo 1 > /sys/block/${ZSWAP_DEVICE}/reset
  226.         fi
  227.         modprobe -r zram
  228. }
  229.  
  230.  
  231. case "$1" in
  232.   start)
  233.  
  234.         echo -n "Starting $DESC: $NAME"
  235.         d_start
  236.         echo "."
  237.         ;;
  238.   stop)
  239.         echo -n "Stopping $DESC: $NAME"
  240.         d_stop
  241.         echo "."
  242.         ;;
  243.   #reload)
  244.         #
  245.         #       No reload target
  246.         #
  247.   #;;
  248.   restart|force-reload)
  249.         echo -n "Restarting $DESC: $NAME"
  250.         d_stop
  251.         #sleep 1
  252.         d_start
  253.         echo "."
  254.         ;;
  255.   *)
  256.         echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
  257.         exit 1
  258.         ;;
  259. esac
  260.  
  261. exit 0
RAW Paste Data
Pastebin PRO WINTER Special!
Get 40% OFF Pastebin PRO accounts!
Top