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