From: Vibhav Pant vibhavp@gmail.com
Instead, use the LargePageMinimum field in user_shared_data to get the minimum large page size. --- dlls/kernelbase/memory.c | 7 +--- dlls/ntdll/ntdll.spec | 3 -- dlls/ntdll/ntsyscalls.h | 6 +-- dlls/ntdll/unix/sync.c | 12 ++---- dlls/ntdll/unix/unix_private.h | 1 - dlls/ntdll/unix/virtual.c | 71 ---------------------------------- 6 files changed, 7 insertions(+), 93 deletions(-)
diff --git a/dlls/kernelbase/memory.c b/dlls/kernelbase/memory.c index b4efa765c15..316aec7d40a 100644 --- a/dlls/kernelbase/memory.c +++ b/dlls/kernelbase/memory.c @@ -41,6 +41,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(heap); WINE_DECLARE_DEBUG_CHANNEL(virtual); WINE_DECLARE_DEBUG_CHANNEL(globalmem);
+static const struct _KUSER_SHARED_DATA *user_shared_data = (struct _KUSER_SHARED_DATA *)0x7ffe0000;
/*********************************************************************** * Virtual memory functions @@ -77,11 +78,7 @@ BOOL WINAPI DECLSPEC_HOTPATCH FlushViewOfFile( const void *base, SIZE_T size ) */ SIZE_T WINAPI GetLargePageMinimum(void) { - NTSTATUS status; - SIZE_T min_size; - - status = wine_unix_get_min_large_page_size( &min_size ); - return status == STATUS_SUCCESS ? min_size : 0; + return user_shared_data->LargePageMinimum; }
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index 07fc0150926..3471905c762 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -1741,6 +1741,3 @@ # Filesystem @ stdcall -syscall wine_nt_to_unix_file_name(ptr ptr ptr long) @ stdcall -syscall wine_unix_to_nt_file_name(str ptr ptr) - -# Memory management -@ stdcall -syscall wine_unix_get_min_large_page_size(ptr) diff --git a/dlls/ntdll/ntsyscalls.h b/dlls/ntdll/ntsyscalls.h index 8f7619a4866..55e1436848b 100644 --- a/dlls/ntdll/ntsyscalls.h +++ b/dlls/ntdll/ntsyscalls.h @@ -242,8 +242,7 @@ SYSCALL_ENTRY( 0x00ee, NtWriteVirtualMemory, 20 ) \ SYSCALL_ENTRY( 0x00ef, NtYieldExecution, 0 ) \ SYSCALL_ENTRY( 0x00f0, wine_nt_to_unix_file_name, 16 ) \ - SYSCALL_ENTRY( 0x00f1, wine_unix_get_min_large_page_size, 4 ) \ - SYSCALL_ENTRY( 0x00f2, wine_unix_to_nt_file_name, 12 ) + SYSCALL_ENTRY( 0x00f1, wine_unix_to_nt_file_name, 12 )
#define ALL_SYSCALLS64 \ SYSCALL_ENTRY( 0x0000, NtAcceptConnectPort, 48 ) \ @@ -482,5 +481,4 @@ SYSCALL_ENTRY( 0x00e9, NtWriteVirtualMemory, 40 ) \ SYSCALL_ENTRY( 0x00ea, NtYieldExecution, 0 ) \ SYSCALL_ENTRY( 0x00eb, wine_nt_to_unix_file_name, 32 ) \ - SYSCALL_ENTRY( 0x00ec, wine_unix_get_min_large_page_size, 8 ) \ - SYSCALL_ENTRY( 0x00ed, wine_unix_to_nt_file_name, 24 ) + SYSCALL_ENTRY( 0x00ec, wine_unix_to_nt_file_name, 24 ) diff --git a/dlls/ntdll/unix/sync.c b/dlls/ntdll/unix/sync.c index 3727ff28acb..055aa4ce85d 100644 --- a/dlls/ntdll/unix/sync.c +++ b/dlls/ntdll/unix/sync.c @@ -2019,20 +2019,14 @@ NTSTATUS WINAPI NtCreateSection( HANDLE *handle, ACCESS_MASK access, const OBJEC
if (sec_flags & SEC_LARGE_PAGES) { - SIZE_T min_size; - NTSTATUS status; - + SIZE_T min_size = user_shared_data->LargePageMinimum; + if (file != NULL || size == NULL) { return STATUS_INVALID_PARAMETER; }
- status = virtual_get_min_large_page_size( &min_size ); - if (status != STATUS_SUCCESS) - { - return status == STATUS_NOT_SUPPORTED ? STATUS_INVALID_PARAMETER : status; - } - if (size->QuadPart % min_size != 0) + if (min_size == 0 || size->QuadPart % min_size != 0) { return STATUS_INVALID_PARAMETER; } diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h index 80b366f8b74..b278ab8df84 100644 --- a/dlls/ntdll/unix/unix_private.h +++ b/dlls/ntdll/unix/unix_private.h @@ -256,7 +256,6 @@ extern void *anon_mmap_alloc( size_t size, int prot ); extern void virtual_init(void); extern ULONG_PTR get_system_affinity_mask(void); extern void virtual_get_system_info( SYSTEM_BASIC_INFORMATION *info, BOOL wow64 ); -extern NTSTATUS virtual_get_min_large_page_size( SIZE_T *size ); extern NTSTATUS virtual_map_builtin_module( HANDLE mapping, void **module, SIZE_T *size, SECTION_IMAGE_INFORMATION *info, ULONG_PTR limit_low, ULONG_PTR limit_high, WORD machine, BOOL prefer_native ); diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c index 0d8f905e578..0b4eef422c9 100644 --- a/dlls/ntdll/unix/virtual.c +++ b/dlls/ntdll/unix/virtual.c @@ -3398,77 +3398,6 @@ void virtual_get_system_info( SYSTEM_BASIC_INFORMATION *info, BOOL wow64 ) else info->HighestUserAddress = (char *)user_space_limit - 1; }
-NTSTATUS WINAPI wine_unix_get_min_large_page_size( SIZE_T *size ) -{ - return virtual_get_min_large_page_size( size ); -} - -NTSTATUS virtual_get_min_large_page_size( SIZE_T *size ) -{ -#ifdef __linux__ - DIR *sysfs_hugepages; - struct dirent *supported_size; - SIZE_T min_size = 0; - SIZE_T total_supported_sizes = 0; -#endif - - if (size == NULL) - { - return STATUS_INVALID_PARAMETER; - } - -#ifdef __linux__ - errno = 0; - sysfs_hugepages = opendir( "/sys/kernel/mm/hugepages" ); - if (sysfs_hugepages == NULL) - { - switch (errno) - { - case ENOENT: /* No huge pages support */ - return STATUS_NOT_SUPPORTED; - case ENOMEM: - return STATUS_NO_MEMORY; - default: - return STATUS_INTERNAL_ERROR; - } - } - supported_size = readdir( sysfs_hugepages ); - while (supported_size != NULL) - { - SIZE_T page_size; - - /* Entries are of the form "hugepages-${size}kB" */ - if (strncmp( supported_size->d_name, "hugepages-", 10 ) != 0) - { - supported_size = readdir( sysfs_hugepages ); - continue; - } - page_size = strtol( &supported_size->d_name[10], NULL, 10 ); - if (page_size == 0 || page_size == LONG_MAX || page_size == LONG_MIN) - { - ERR( "could not parse page size from /sys/kernel/mm/hugepages entry %s\n", - supported_size->d_name ); - supported_size = readdir( sysfs_hugepages ); - continue; - } - page_size *= 1024; - min_size = ( total_supported_sizes == 0 ) ? page_size - : ( page_size < min_size ? page_size : min_size ); - total_supported_sizes++; - supported_size = readdir( sysfs_hugepages ); - } - - closedir(sysfs_hugepages); - if (total_supported_sizes == 0) - return STATUS_NOT_SUPPORTED; - *size = min_size; -#else /* __linux__ */ - *size = 2 * 1024 * 1024; -#endif /* !defined(__linux) */ - return STATUS_SUCCESS; -} - - /*********************************************************************** * virtual_map_builtin_module */