Add support for large page backed file mapping objects on Linux.
This MR adds support for creating file mapping objects backed by large pages on Linux, by making the following changes:
wineserver
- On Linux,
create_temp_filewill first attempt to use memfds as the backing fd. If it fails, it'll return to the current codepath, creating a temporary file in either the server or config directory. - The created memfd will be sealed against writes, if the caller requesting the appropriate page protection flags.
- This removes the requirement that FDs be only created on filesystems/directories that aren't
noexec. - In the server method
create_mapping, if large pages have been requested by the caller, hold that the calling thread's token holdsSeLockMemoryPrivilege. - Additionally, add
SeLockMemoryPrivilegeto the list of privileges enabled for the Administrator.
ntdll
- Add
virtual_get_min_large_page_sizeand its exported wrapperwine_unix_get_min_large_page_size. - On Linux, the minimum page size is determined by going through
/sys/kernel/mm/hugepages. If hugepage support was not detected,STATUS_NOT_SUPPORTEDis returned instead. On other platforms, the older hard-coded value of 2*1024*1024 is returned instead. -
NtCreateSectionwill validate certain parameters if large pages are requested. Specifically, it will return STATUS_INVALID_PARAMETER if the requested mapping is not anonymous/unnamed, or the size is not a multiple of the minimum supported page size.
kernelbase
-
GetLargePageMinimumwill usewine_unix_get_min_large_page_size.
kernel32/tests
- Add new test test_large_page_file_mapping, which validates privilege enforcements and parameter validation while creating large pages backed file mapping obejcts. The tests are skipped if
GetLargePageMinimumreturns 0.
Edited by Vibhav Pant