Commit | Line | Data |
---|---|---|
33041a0d KS |
1 | The remap_file_pages() system call is used to create a nonlinear mapping, |
2 | that is, a mapping in which the pages of the file are mapped into a | |
3 | nonsequential order in memory. The advantage of using remap_file_pages() | |
4 | over using repeated calls to mmap(2) is that the former approach does not | |
5 | require the kernel to create additional VMA (Virtual Memory Area) data | |
6 | structures. | |
7 | ||
8 | Supporting of nonlinear mapping requires significant amount of non-trivial | |
9 | code in kernel virtual memory subsystem including hot paths. Also to get | |
10 | nonlinear mapping work kernel need a way to distinguish normal page table | |
11 | entries from entries with file offset (pte_file). Kernel reserves flag in | |
12 | PTE for this purpose. PTE flags are scarce resource especially on some CPU | |
13 | architectures. It would be nice to free up the flag for other usage. | |
14 | ||
15 | Fortunately, there are not many users of remap_file_pages() in the wild. | |
16 | It's only known that one enterprise RDBMS implementation uses the syscall | |
17 | on 32-bit systems to map files bigger than can linearly fit into 32-bit | |
18 | virtual address space. This use-case is not critical anymore since 64-bit | |
19 | systems are widely available. | |
20 | ||
c8d78c18 KS |
21 | The syscall is deprecated and replaced it with an emulation now. The |
22 | emulation creates new VMAs instead of nonlinear mappings. It's going to | |
23 | work slower for rare users of remap_file_pages() but ABI is preserved. | |
33041a0d KS |
24 | |
25 | One side effect of emulation (apart from performance) is that user can hit | |
26 | vm.max_map_count limit more easily due to additional VMAs. See comment for | |
27 | DEFAULT_MAX_MAP_COUNT for more details on the limit. |