Hi,

a few comments inline. i am not sure if we want this inside procd
directly. maybe we should put this into fstools and then call that code
from early init. i need to think about that before i can make a decision.

        John



On 22/10/2014 10:30, Tomasz Wasiak wrote:
> Hello,
> 
> Here you are (of course it is just 1/3 of the original patch).
> ---
> diff --git a/initd/early.c b/initd/early.c
> index a9f6afb..b4a375f 100644
> --- 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)
> +     {

please use this coding style ->

if (fp == NULL) {

}


> +             ERROR("Can't open /proc/meminfo: %s\n", strerror(errno));
> +             return errno;
> +     }
> +
> +     while(fgets(line, sizeof(line), fp))
> +     {

and here aswell

while () {

}

> +             key = strtok(line, ":");
> +             val = atol(strtok(NULL, " kB\n"));

what happens if strtok return NULL ?

> +
> +             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);

where does the /2 come from ? is this just "a good value to use" or is
there a technical reason that is must always be /2 and not /X

> +     pid_t pid;
> +
> +     if(!zramsize)
> +     {
> +             ERROR("Can't read size of RAM. Assuming 16 MB.\n");
> +             zramsize = 8192;

dangerous, if the memory was not detected properly we have mayor issues
and should not do any magic with the memory. in this case we should just
continue without zram

> +     }
> +
> +     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);

same here

>  
> -     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;

same here

> +     }
>  
> -     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;
> @@ -89,7 +204,6 @@ early(void)
>               return;
>  
>       early_mounts();
> -     early_dev();
>       early_env();
>       early_console("/dev/console");
>  
> 
> 
> W dniu 22.10.2014 o 09:38, John Crispin pisze:
>> Hi,
>>
>> please send patches directly against the procd git tree.
>>
>>      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