blob: e55db7b949577ea0f8fb038b9001b30348b38581 [file] [log] [blame]
commit fdeaf7b867fda0760a1d965496f288401039f092
Author: pliard <pliard@google.com>
Date: Tue Jul 23 09:54:41 2019 +0900
Support readahead() calls larger than 32 pages
diff --git a/src/pack.c b/src/pack.c
index 7903870..d7c6c8e 100644
--- a/src/pack.c
+++ b/src/pack.c
@@ -79,6 +79,13 @@
**/
#define NUM_THREADS 4
+/**
+ * READAHEAD_MAX_LENGTH:
+ *
+ * Maximum length that can be passed to readahead(). On kernels older than v4.10
+ * readahead() reads up to 32 pages regardless of the provided length.
+ **/
+#define READAHEAD_MAX_LENGTH (32 * 4096)
typedef enum pack_flags {
PACK_ROTATIONAL = 0x01,
@@ -221,6 +228,23 @@ pack_file_name_for_device (const void *parent,
nih_return_system_error (NULL);
}
+static int
+load_pages_in_core (int fd,
+ off_t offset,
+ off_t length)
+{
+ while (length > 0) {
+ const off_t read_length = length <= READAHEAD_MAX_LENGTH ?
+ length : READAHEAD_MAX_LENGTH;
+ int ret = readahead (fd, offset, read_length);
+ if (ret < 0) {
+ return ret;
+ }
+ offset += read_length;
+ length -= read_length;
+ }
+ return 0;
+}
PackFile *
read_pack (const void *parent,
@@ -246,7 +270,7 @@ read_pack (const void *parent,
/* Obvious really... */
if (fstat (fileno (fp), &stat) == 0)
- readahead (fileno (fp), 0, stat.st_size);
+ load_pages_in_core (fileno (fp), 0, stat.st_size);
file = NIH_MUST (nih_new (parent, PackFile));
@@ -744,9 +768,9 @@ do_readahead_hdd (PackFile *file,
|| (file->blocks[i].pathidx >= file->num_paths))
continue;
- readahead (fds[file->blocks[i].pathidx],
- file->blocks[i].offset,
- file->blocks[i].length);
+ load_pages_in_core (fds[file->blocks[i].pathidx],
+ file->blocks[i].offset,
+ file->blocks[i].length);
}
print_time ("Readahead", &start);
@@ -859,9 +883,9 @@ ra_thread (void *ptr)
}
do {
- readahead (fd,
- ctx->file->blocks[i].offset,
- ctx->file->blocks[i].length);
+ load_pages_in_core (fd,
+ ctx->file->blocks[i].offset,
+ ctx->file->blocks[i].length);
} while ((++i < ctx->file->num_blocks)
&& (ctx->file->blocks[i].pathidx == pathidx));
}