@@ -722,6 +722,114 @@ TEST_VM(os_windows, processor_count) {
722722 }
723723}
724724
725+ TEST_VM (os_windows, large_page_init_multiple_sizes) {
726+ // Call request_lock_memory_privilege() and check the result
727+ if (!os::win32::request_lock_memory_privilege ()) {
728+ GTEST_SKIP () << " Skipping test because lock memory privilege is not granted." ;
729+ }
730+ // Set globals to make sure we hit the correct code path
731+ AutoSaveRestore<bool > guardUseLargePages (UseLargePages);
732+ AutoSaveRestore<bool > guardEnableAllLargePageSizesForWindows (EnableAllLargePageSizesForWindows);
733+ AutoSaveRestore<size_t > guardLargePageSizeInBytes (LargePageSizeInBytes);
734+ FLAG_SET_CMDLINE (UseLargePages, true );
735+ FLAG_SET_CMDLINE (EnableAllLargePageSizesForWindows, true );
736+
737+ // Determine the minimum page size
738+ const size_t min_size = GetLargePageMinimum ();
739+
740+ // End the test if GetLargePageMinimum returns 0
741+ if (min_size == 0 ) {
742+ GTEST_SKIP () << " Large pages are not supported on this system." ;
743+ return ;
744+ }
745+
746+ // Set LargePageSizeInBytes to 4 times the minimum page size
747+ FLAG_SET_CMDLINE (LargePageSizeInBytes, 4 * min_size); // Set a value for multiple page sizes
748+
749+ // Initialize large page settings
750+ os::large_page_init ();
751+
752+ // Verify that large pages are enabled
753+ EXPECT_TRUE (UseLargePages) << " UseLargePages should be true after initialization for LargePageSizeInBytes = 4 * min_size" ;
754+
755+ // Verify that decided_large_page_size is greater than the default page size
756+ const size_t default_page_size = os::vm_page_size ();
757+ size_t decided_large_page_size = os::win32::large_page_init_decide_size ();
758+ EXPECT_GT (decided_large_page_size, default_page_size) << " Large page size should be greater than the default page size for LargePageSizeInBytes = 4 * min_size" ;
759+
760+ #if !defined(IA32)
761+ size_t page_size_count = 0 ;
762+ size_t page_size = os::page_sizes ().largest ();
763+
764+ do {
765+ ++page_size_count;
766+ page_size = os::page_sizes ().next_smaller (page_size);
767+ } while (page_size >= os::page_sizes ().smallest ());
768+
769+ EXPECT_GT (page_size_count, 1u ) << " There should be multiple large page sizes available." ;
770+
771+ size_t large_page_size = decided_large_page_size;
772+
773+ for (size_t page_size = os::page_sizes ().largest (); page_size >= min_size; page_size = os::page_sizes ().next_smaller (page_size)) {
774+ EXPECT_TRUE (page_size % min_size == 0 ) << " Each page size should be a multiple of the minimum large page size." ;
775+ EXPECT_LE (page_size, large_page_size) << " Page size should not exceed the determined large page size." ;
776+ }
777+ #endif
778+ }
779+
780+ TEST_VM (os_windows, large_page_init_decide_size) {
781+ // Initial setup
782+ // Call request_lock_memory_privilege() and check the result
783+ if (!os::win32::request_lock_memory_privilege ()) {
784+ GTEST_SKIP () << " Skipping test because lock memory privilege is not granted." ;
785+ }
786+ AutoSaveRestore<bool > guardUseLargePages (UseLargePages);
787+ AutoSaveRestore<size_t > guardLargePageSizeInBytes (LargePageSizeInBytes);
788+ FLAG_SET_CMDLINE (UseLargePages, true );
789+ FLAG_SET_CMDLINE (LargePageSizeInBytes, 0 ); // Reset to default
790+
791+ // Test for large page support
792+ size_t decided_size = os::win32::large_page_init_decide_size ();
793+ size_t min_size = GetLargePageMinimum ();
794+ if (min_size == 0 ) {
795+ EXPECT_EQ (decided_size, 0 ) << " Expected decided size to be 0 when large page is not supported by the processor" ;
796+ return ;
797+ }
798+
799+ // Scenario 1: Test with 2MB large page size
800+ if (min_size == 2 * M) {
801+ FLAG_SET_CMDLINE (LargePageSizeInBytes, 2 * M); // Set large page size to 2MB
802+ decided_size = os::win32::large_page_init_decide_size (); // Recalculate decided size
803+ EXPECT_EQ (decided_size, 2 * M) << " Expected decided size to be 2M when large page and OS reported size are both 2M" ;
804+ }
805+
806+ // Scenario 2: Test with 1MB large page size
807+ if (min_size == 2 * M) {
808+ FLAG_SET_CMDLINE (LargePageSizeInBytes, 1 * M); // Set large page size to 1MB
809+ decided_size = os::win32::large_page_init_decide_size (); // Recalculate decided size
810+ EXPECT_EQ (decided_size, 2 * M) << " Expected decided size to be 2M when large page is 1M and OS reported size is 2M" ;
811+ }
812+
813+ #if defined(IA32) || defined(AMD64)
814+ FLAG_SET_CMDLINE (LargePageSizeInBytes, 5 * M); // Set large page size to 5MB
815+ if (!EnableAllLargePageSizesForWindows) {
816+ decided_size = os::win32::large_page_init_decide_size (); // Recalculate decided size
817+ EXPECT_EQ (decided_size, 0 ) << " Expected decided size to be 0 for large pages bigger than 4mb on IA32 or AMD64" ;
818+ }
819+ #endif
820+
821+ // Additional check for non-multiple of minimum size
822+ // Set an arbitrary large page size which is not a multiple of min_size
823+ FLAG_SET_CMDLINE (LargePageSizeInBytes, 5 * min_size + 1 );
824+
825+ // Recalculate decided size
826+ decided_size = os::win32::large_page_init_decide_size ();
827+
828+ // Assert that the decided size defaults to minimum page size when LargePageSizeInBytes
829+ // is not a multiple of the minimum size, assuming conditions are always met
830+ EXPECT_EQ (decided_size, 0 ) << " Expected decided size to default to 0 when LargePageSizeInBytes is not a multiple of minimum size" ;
831+ }
832+
725833class ReserveMemorySpecialRunnable : public TestRunnable {
726834public:
727835 void runUnitTest () const {
0 commit comments