Hi all,

It would be great if someone could port ZRAM to AA so it can be used on 16MB devices too. Despite the kernel version doesn't have it, it had several ports that work on that version.

By the way. As BB has it natively (I suppose), has anyone used BB with ZRAM stably on 16MB devices (e.g: WRT54GL) ?

Thanks
Regards,
Fernando


On 02/12/2014 11:16, John Crispin wrote:
i just pushed a an alternate patch that fixes the problem. please test
it and let me know the results

        John

On 22/10/2014 09:20, Tomasz Wasiak wrote:
Devices with less memory are still common so why limit ZRAM usage just to swap
when it could be very useful as for /tmp storage.

This patch changes 3 things:
  - sets default number of ZRAM devices to 2 (1st for /tmp, 2nd for swap)
  - adds ZRAM (default) support to procd's init (TMPFS is used when ZRAM is not
    available
  - changes zram-swap so it will use /dev/zram1 for 1st CPU, /dev/zram2 for 2nd
    and so on as /dev/zram0 is in use for /tmp.

Signed-off-by: Tomasz Wasiak <tjwas...@gmail.com>
---
  package/system/procd/patches/procd-support_for_tmp_on_zram.patch           |  
185 ++++++++++
  package/system/zram-swap/files/zram.init                                   |  
 15
  target/linux/generic/patches-3.10/998_zram_make_2_devices_by_default.patch |  
 11
  3 files changed, 203 insertions(+), 8 deletions(-)

--- a/package/system/procd/patches/procd-support_for_tmo_on_zram.patch
+++ b/package/system/procd/patches/procd-support_for_tmp_on_zram.patch
@@ -0,0 +1,185 @@
+--- a/initd/early.c
++++ b/initd/early.c
+@@ -12,34 +12,130 @@
+  * GNU General Public License for more details.
+  */
+
+-#include <sys/mount.h>
+-#include <sys/types.h>
+-#include <sys/stat.h>
+-
+-#include <stdio.h>
++#include <errno.h>
+ #include <fcntl.h>
+-#include <unistd.h>
++#include <stdio.h>
+ #include <stdlib.h>
++#include <string.h>
++#include <strings.h>
++#include <unistd.h>
++#include <sys/mount.h>
++#include <sys/stat.h>
++#include <sys/types.h>
++#include <sys/wait.h>
+
+ #include "../log.h"
+ #include "init.h"
+
++static long
++check_ramsize(void)
++{
++      FILE *fp;
++      char line[256];
++      char *key;
++      long val = 0;
++
++      fp = fopen("/proc/meminfo", "r");
++      if(fp == NULL)
++      {
++              ERROR("Can't open /proc/meminfo: %s\n", strerror(errno));
++              return errno;
++      }
++
++      while(fgets(line, sizeof(line), fp))
++      {
++              key = strtok(line, ":");
++              val = atol(strtok(NULL, " kB\n"));
++
++              if (!key || !val)
++                      continue;
++
++              if (!strcasecmp(key, "MemTotal"))
++                      break;
++      }
++
++      fclose(fp);
++
++      return val;
++}
++
++static int
++mount_zram_on_tmp(void)
++{
++      FILE *fp;
++      long zramsize = (check_ramsize() / 2);
++      pid_t pid;
++
++      if(!zramsize)
++      {
++              ERROR("Can't read size of RAM. Assuming 16 MB.\n");
++              zramsize = 8192;
++      }
++
++      fp = fopen("/sys/block/zram0/disksize", "r+");
++      if(fp == NULL)
++      {
++              ERROR("Can't open /sys/block/zram0/disksize: %s\n", 
strerror(errno));
++              return errno;
++      }
++
++      fprintf(fp, "%ld", (zramsize * 1024));
++
++      fclose(fp);
++
++      pid = fork();
++
++      if (!pid)
++      {
++              char *mkfs[] = { "/sbin/mke2fs", "-b", "4096", "-F", "-L", "TEMP", "-m", 
"0", "/dev/zram0", NULL };
++              int fd = open("/dev/null", O_RDWR);
++
++              if (fd > -1) {
++                      dup2(fd, STDIN_FILENO);
++                      dup2(fd, STDOUT_FILENO);
++                      dup2(fd, STDERR_FILENO);
++                      if (fd > STDERR_FILENO)
++                              close(fd);
++              }
++
++              execvp(mkfs[0], mkfs);
++              ERROR("Can't exec /sbin/mke2fs\n");
++              exit(-1);
++      }
++
++      if (pid <= 0)
++      {
++              ERROR("Can't exec /sbin/mke2fs\n");
++              return -1;
++      } else {
++              waitpid(pid, NULL, 0);
++      }
++
++      if(mount("/dev/zram0", "/tmp", "ext2", MS_NOSUID | MS_NODEV | MS_NOATIME, 
"check=none,errors=continue,noquota") < 0)
++      {
++              ERROR("Can't mount /dev/zram0 on /tmp: %s\n", strerror(errno));
++              return errno;
++      }
++
++      LOG("Using up to %ld kB of RAM as ZRAM storage on /mnt\n", zramsize);
++      return 0;
++}
++
+ static void
+-early_mounts(void)
++mount_tmpfs_on_tmp(void)
+ {
+-      mount("proc", "/proc", "proc", MS_NOATIME, 0);
+-      mount("sysfs", "/sys", "sysfs", MS_NOATIME, 0);
++      char line[256];
++      long tmpfssize = (check_ramsize() / 2);
+
+-      mount("tmpfs", "/tmp", "tmpfs", MS_NOSUID | MS_NODEV | MS_NOATIME, 
NULL);
+-      mkdir("/tmp/run", 0777);
+-      mkdir("/tmp/lock", 0777);
+-      mkdir("/tmp/state", 0777);
+-      symlink("/tmp", "/var");
++      if(!tmpfssize)
++      {
++              ERROR("Can't read size of RAM. Assuming 16 MB.\n");
++              tmpfssize = 8192;
++      }
+
+-      mount("tmpfs", "/dev", "tmpfs", MS_NOATIME, "mode=0755,size=512K");
+-      mkdir("/dev/shm", 0755);
+-      mkdir("/dev/pts", 0755);
+-      mount("devpts", "/dev/pts", "devpts", MS_NOATIME, "mode=600");
++      snprintf(line, 256, "size=%ldk", tmpfssize);
++      mount("tmpfs", "/tmp", "tmpfs", MS_NOSUID | MS_NODEV | MS_NOATIME, 
line);
++      LOG("Using up to %ld kB of RAM as TMPFS storage on /tmp\n", tmpfssize);
+ }
+
+ static void
+@@ -50,6 +146,25 @@ early_dev(void)
+ }
+
+ static void
++early_mounts(void)
++{
++      mount("proc", "/proc", "proc", MS_NOATIME, 0);
++      mount("sysfs", "/sys", "sysfs", MS_NOATIME, 0);
++      mount("tmpfs", "/dev", "tmpfs", MS_NOATIME, "mode=0755,size=512K");
++      mkdir("/dev/shm", 0755);
++      mkdir("/dev/pts", 0755);
++      mount("devpts", "/dev/pts", "devpts", MS_NOATIME, "mode=600");
++      early_dev();
++
++      if(mount_zram_on_tmp() !=0)
++              mount_tmpfs_on_tmp();
++      mkdir("/tmp/run", 0777);
++      mkdir("/tmp/lock", 0777);
++      mkdir("/tmp/state", 0777);
++      symlink("/tmp", "/var");
++}
++
++static void
+ early_console(const char *dev)
+ {
+       struct stat s;
+@@ -87,7 +202,6 @@ early(void)
+               return;
+
+       early_mounts();
+-      early_dev();
+       early_env();
+       early_console("/dev/console");
+
--- a/package/system/zram-swap/files/zram.init
+++ b/package/system/zram-swap/files/zram.init
@@ -15,10 +15,10 @@ zram_size() # in megabytes
        local ram_size="$( ram_size )"
if [ -z "$zram_size" ]; then
-               # e.g. 6mb for 16mb-routers or 61mb for 128mb-routers
-               echo $(( $ram_size / 2048 ))
+               # e.g. 3200kb for 16mb-routers or 25600kb for 128mb-routers
+               echo $(( $ram_size * 2 / 10 ))
        else
-               echo "$zram_size"
+               echo $(( $zram_size * 1024 ))
        fi
  }
@@ -54,9 +54,9 @@ zram_applicable() zram_dev()
  {
-       local core="$1"
+       local core=$(( $1 + 1 ))
- echo "/dev/zram${core:-0}"
+       echo "/dev/zram${core:-1}"
  }
zram_reset()
@@ -95,10 +95,10 @@ start()
                zram_dev="$( zram_dev "$core" )"
                zram_applicable "$zram_dev" || return 1
- logger -s -t zram_start -p daemon.debug "activating '$zram_dev' for swapping ($zram_size MegaBytes)"
+               logger -s -t zram_start -p daemon.debug "activating '$zram_dev' for 
swapping ($zram_size KiloBytes)"
zram_reset "$zram_dev" "enforcing defaults"
-               echo $(( $zram_size * 1024 * 1024 )) >"/sys/block/$( basename 
$zram_dev )/disksize"
+               echo $(( $zram_size * 1024 )) >"/sys/block/$( basename $zram_dev 
)/disksize"
                mkswap "$zram_dev"
                swapon "$zram_dev"
        } done
@@ -120,4 +120,3 @@ stop()
                zram_reset "$zram_dev" "claiming memory back"
        } done
  }
-
--- a/target/linux/generic/patches-3.10/998_zram_make_2_devices_by_default.patch
+++ b/target/linux/generic/patches-3.10/998_zram_make_2_devices_by_default.patch
@@ -0,0 +1,11 @@
+--- a/drivers/staging/zram/zram_drv.c
++++ b/drivers/staging/zram/zram_drv.c
+@@ -40,7 +40,7 @@ static int zram_major;
+ struct zram *zram_devices;
+
+ /* Module params (documentation at end) */
+-static unsigned int num_devices = 1;
++static unsigned int num_devices = 2;
+
+ static void zram_stat64_add(struct zram *zram, u64 *v, u64 inc)
+ {
_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel
_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

Reply via email to