[OpenWrt-Devel] [PATCH] ZRAM: enhacements including /tmp on ZRAM for Barrier Breaker
Tomasz Wasiak
tjwasiak at gmail.com
Wed Oct 22 03:20:19 EDT 2014
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 <tjwasiak at 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 at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel
More information about the openwrt-devel
mailing list