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