[OpenWrt-Devel] [PATCH] ZRAM: enhacements including /tmp on ZRAM for Barrier Breaker

Tomasz Wasiak tjwasiak at gmail.com
Wed Oct 22 15:49:29 EDT 2014


I am going to test a totally not supported device with only 16MB of RAM if time permits. Unfortunately now I am having some strange issues with my development device - tmp on ZRAM works without any issues but I have to switch off swap on ZRAM as it was getting some random oops'es which might be connected to compressing one more time files on ZRAM device mounted as /tmp when they got swapped out. This device has 32 MB of RAM, and after booting shows ~ 15-16MB RAM available (~ 2-3 MB + caches and buffers). I have ~ 14 MB limit on /tmp ZRAM device and tried different swap on ZRAM size settings - from rather small (3200 kB) to 14 MB. It does not look like a no memory issue because it is able to work normally without swap even using unrestricted RAMFS or TMPFS volume mounted as /tmp.


Thomas

W dniu 22.10.2014 o 16:07, Fernando Frediani pisze:
> By the way. Has anyone compiled and used BB 14.07 for devices with 16MB of RAM that went unsupported with AA release because of lack of ZRAM ?
> 
> Fernando
> 
> On 22/10/2014 08: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
_______________________________________________
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