0

I am trying to mmap a 64M file into memory, then read & write into it. But sometimes a certain range within this file will no longer be used, so I called fallocate(fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, 16 << 20, 16 << 20); to release a 16M range inside it.

However, I find that the memory consumption seems not changed(both from free -m and from cat /proc/meminfo).

I understand that fallocate will dig some holes inside the file and return such range back to the filesystem. But I'm not sure whether it will reduce memory consumption for mmaped files.

If it does not reduce the memory consumption, where does such range go? Can another process get the underlying memory previously allocated to it?

The big.file is a normal 64M file instead of a sparse file

#define _GNU_SOURCE

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <linux/falloc.h>
#include <stdint.h>

int main(int argc, char *argv[])
{
        uint8_t *addr;

        int fd = open("home/big.file", O_RDWR | O_CREAT, 0777);
        if (fd < 0)
                return -1;

        addr = (uint8_t *)mmap(NULL, MMAP_SIZE , PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
        if (addr < 0)
                return -1;

        printf("data[0x%x] = %d\n", offset, addr[offset]);
        getchar();
        fallocate(fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, 16 << 20, 16 << 20);
        getchar();

        close(fd);
        return 0;
}
Zihan
  • 405
  • 3
  • 13
  • Why aren't you using `munmap()`? – Shawn Jul 19 '19 at 08:27
  • Because other parts of the file will still be used. The "holed" part might be accessed, but will return 0 to avoid breaking the execution of programs. This is just an example code, the real code is embedded in a large project. – Zihan Jul 19 '19 at 09:38

0 Answers0