[OpenWrt-Devel] [PATCH] ZRAM: enhacements including /tmp on ZRAM for Barrier Breaker
John Crispin
blogic at openwrt.org
Tue Dec 2 06:16:41 EST 2014
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 <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
>
_______________________________________________
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