[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