[CRIU] [PATCH] image: Use POSIX_FADV_NOREUSE to do not store images in page cache after read
Kirill Tkhai
ktkhai at virtuozzo.com
Wed Jul 12 17:57:26 MSK 2017
We read every image block only once, so let's tell the kernel
not to store pages in page cache for the future.
[We may also need POSIX_FADV_SEQUENTIAL here, but fadvise fails
if it's called for DAX files, and it seems there is no way
to check the file is in such mode].
Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
criu/image.c | 18 ++++++++++++++++--
1 file changed, 16 insertions(+), 2 deletions(-)
diff --git a/criu/image.c b/criu/image.c
index 62e8e7109..4508da858 100644
--- a/criu/image.c
+++ b/criu/image.c
@@ -370,11 +370,12 @@ int do_open_remote_image(int dfd, char *path, int flags)
static int do_open_image(struct cr_img *img, int dfd, int type, unsigned long oflags, char *path)
{
- int ret, flags;
+ int ret, flags, remote;
flags = oflags & ~(O_NOBUF | O_SERVICE | O_FORCE_LOCAL);
+ remote = (opts.remote && !(oflags & O_FORCE_LOCAL));
- if (opts.remote && !(oflags & O_FORCE_LOCAL))
+ if (remote)
ret = do_open_remote_image(dfd, path, flags);
else
ret = openat(dfd, path, flags, CR_FD_PERM);
@@ -390,6 +391,19 @@ static int do_open_image(struct cr_img *img, int dfd, int type, unsigned long of
}
img->_x.fd = ret;
+
+ if (flags == O_RDONLY && !remote) {
+ /*
+ * Do not keep image pages in page cache after we read them,
+ * as we read every block only once.
+ */
+ errno = posix_fadvise(img->_x.fd, 0, 0, POSIX_FADV_NOREUSE);
+ if (errno) {
+ pr_perror("Can't fadvice image %s", path);
+ goto err;
+ }
+ }
+
if (oflags & O_NOBUF)
bfd_setraw(&img->_x);
else {
More information about the CRIU
mailing list