chiark / gitweb /
readahead: disable on low memory machines
authorLennart Poettering <lennart@poettering.net>
Sat, 25 Sep 2010 11:32:54 +0000 (13:32 +0200)
committerLennart Poettering <lennart@poettering.net>
Sat, 25 Sep 2010 11:32:54 +0000 (13:32 +0200)
src/readahead-collect.c
src/readahead-common.c
src/readahead-common.h
src/readahead-replay.c

index 937231ca4282d46355b01b738c51c6cbccf896ef..fe35da7004ff73374555b67d2c9c20c81ff506e4 100644 (file)
 
 #define MINCORE_VEC_SIZE (READAHEAD_FILE_SIZE_MAX/PAGE_SIZE)
 
 
 #define MINCORE_VEC_SIZE (READAHEAD_FILE_SIZE_MAX/PAGE_SIZE)
 
+/* fixme:
+ *
+ * - detect ssd/lvm/... on btrfs
+ * - read ahead directories
+ */
+
 static int btrfs_defrag(int fd) {
         struct btrfs_ioctl_vol_args data;
 
 static int btrfs_defrag(int fd) {
         struct btrfs_ioctl_vol_args data;
 
@@ -302,10 +308,7 @@ static int collect(const char *root) {
                                                 ul = fd_first_block(m->fd);
 
                                                 if ((k = hashmap_put(files, p, ULONG_TO_PTR(ul))) < 0) {
                                                 ul = fd_first_block(m->fd);
 
                                                 if ((k = hashmap_put(files, p, ULONG_TO_PTR(ul))) < 0) {
-
-                                                        if (k != -EEXIST)
-                                                                log_warning("set_put() failed: %s", strerror(-k));
-
+                                                        log_warning("set_put() failed: %s", strerror(-k));
                                                         free(p);
                                                 }
                                         }
                                                         free(p);
                                                 }
                                         }
@@ -355,7 +358,7 @@ static int collect(const char *root) {
         if (on_ssd || on_btrfs) {
 
                 /* On SSD or on btrfs, just write things out in the
         if (on_ssd || on_btrfs) {
 
                 /* On SSD or on btrfs, just write things out in the
-                 * order the files where accessed. */
+                 * order the files were accessed. */
 
                 HASHMAP_FOREACH_KEY(q, p, files, i)
                         pack_file(pack, p, on_btrfs);
 
                 HASHMAP_FOREACH_KEY(q, p, files, i)
                         pack_file(pack, p, on_btrfs);
@@ -442,6 +445,11 @@ int main(int argc, char *argv[]) {
         log_parse_environment();
         log_open();
 
         log_parse_environment();
         log_open();
 
+        if (!enough_ram()) {
+                log_info("Disabling readahead collector due to low memory.");
+                return 0;
+        }
+
         if (collect(argc >= 2 ? argv[1] : "/") < 0)
                 return 1;
 
         if (collect(argc >= 2 ? argv[1] : "/") < 0)
                 return 1;
 
index 8533717d479ae7aa8befb3b4812aea5b537ec649..88441dbe1c913e35ae1e21245a760650347485af 100644 (file)
@@ -23,6 +23,7 @@
 #include <libudev.h>
 #include <stdlib.h>
 #include <string.h>
 #include <libudev.h>
 #include <stdlib.h>
 #include <string.h>
+#include <sys/sysinfo.h>
 
 #include "log.h"
 #include "readahead-common.h"
 
 #include "log.h"
 #include "readahead-common.h"
@@ -105,3 +106,13 @@ finish:
 
         return b;
 }
 
         return b;
 }
+
+bool enough_ram(void) {
+        struct sysinfo si;
+
+        assert_se(sysinfo(&si) >= 0);
+
+        return si.totalram > 127 * 1024*1024; /* Enable readahead only
+                                               * with at least 128MB
+                                               * memory */
+}
index 5d8f1a34fa26b9e3e97988eaaeebd7149d0eaee3..d39dd5b41d7464b35e9f529c25109ae4fa5111cd 100644 (file)
@@ -31,4 +31,6 @@ int file_verify(int fd, const char *fn, struct stat *st);
 
 int fs_on_ssd(const char *p);
 
 
 int fs_on_ssd(const char *p);
 
+bool enough_ram(void);
+
 #endif
 #endif
index 1f1ec523fa66c43ed4092dc8561c7c8757f6c3fc..58d9468c43010d04d17ed9120608f907ff4ec5db 100644 (file)
@@ -206,6 +206,11 @@ int main(int argc, char*argv[]) {
         log_parse_environment();
         log_open();
 
         log_parse_environment();
         log_open();
 
+        if (!enough_ram()) {
+                log_info("Disabling readahead replay due to low memory.");
+                return 0;
+        }
+
         if (replay(argc >= 2 ? argv[1] : "/") < 0)
                 return 1;
 
         if (replay(argc >= 2 ? argv[1] : "/") < 0)
                 return 1;