@@ -645,8 +645,13 @@ gcParseXlpOption(J9JavaVM *vm)
645645 IDATA xlpGCIndex = -1 ;
646646 UDATA requestedPageSize = 0 ;
647647 UDATA requestedPageFlags = J9PORT_VMEM_PAGE_FLAG_NOT_USED;
648+ UDATA *pageSizes;
649+ UDATA *pageFlags;
648650 PORT_ACCESS_FROM_JAVAVM (vm);
649651
652+ pageSizes = j9vmem_supported_page_sizes ();
653+ pageFlags = j9vmem_supported_page_flags ();
654+
650655 /* Parse -Xlp option.
651656 * -Xlp option enables large pages with the default large page size, but will not
652657 * override any -Xlp<size> or -Xlp:objectheap:pagesize=<size> option.
@@ -782,18 +787,16 @@ gcParseXlpOption(J9JavaVM *vm)
782787 }
783788
784789 /*
785- * Check for -Xlp:gc : and handle it if necessary
790+ * Check for -Xlp:gcmetadata : and handle it if necessary
786791 */
787792 xlpGCIndex = FIND_AND_CONSUME_VMARG (STARTSWITH_MATCH, " -Xlp:gcmetadata:" , NULL );
788793
789794 if (-1 != xlpGCIndex) {
790795 UDATA gcmetadataPageSize = 0 ;
791796 UDATA gcmetadataPageFlags = J9PORT_VMEM_PAGE_FLAG_NOT_USED;
792- UDATA *pageSizes;
793- UDATA *pageFlags;
794797 bool found = false ;
795798 /*
796- * Parse sub options for -Xlp:gc :
799+ * Parse sub options for -Xlp:gcmetadata :
797800 */
798801 xlpErrorState = xlpSubOptionsParser (vm, xlpGCIndex, &xlpError, &gcmetadataPageSize, &gcmetadataPageFlags, NULL , NULL );
799802
@@ -809,15 +812,12 @@ gcParseXlpOption(J9JavaVM *vm)
809812 /*
810813 * Update values in case of exact match only
811814 */
812- pageSizes = j9vmem_supported_page_sizes ();
813- pageFlags = j9vmem_supported_page_flags ();
814-
815815 for (UDATA pageIndex = 0 ; 0 != pageSizes[pageIndex]; ++pageIndex) {
816816 if ((pageSizes[pageIndex] == gcmetadataPageSize) && (pageFlags[pageIndex] == gcmetadataPageFlags)) {
817817 found = true ;
818818 extensions->gcmetadataPageSize = gcmetadataPageSize;
819819 extensions->gcmetadataPageFlags = gcmetadataPageFlags;
820- break ;
820+ break ;
821821 }
822822 }
823823
@@ -834,6 +834,54 @@ gcParseXlpOption(J9JavaVM *vm)
834834 }
835835 }
836836
837+ /*
838+ * Check for -Xlp:offheap: and handle it if necessary
839+ */
840+ xlpGCIndex = FIND_AND_CONSUME_VMARG (STARTSWITH_MATCH, " -Xlp:offheap:" , NULL );
841+
842+ if (-1 != xlpGCIndex) {
843+ UDATA offheapPageSize = 0 ;
844+ UDATA offheapPageFlags = J9PORT_VMEM_PAGE_FLAG_NOT_USED;
845+ bool found = false ;
846+ /*
847+ * Parse sub options for -Xlp:offheap:
848+ */
849+ xlpErrorState = xlpSubOptionsParser (vm, xlpGCIndex, &xlpError, &offheapPageSize, &offheapPageFlags, NULL , NULL );
850+
851+ if (XLP_NO_ERROR != xlpErrorState) {
852+ goto _reportXlpError;
853+ }
854+
855+ if (xlpError.extraCommaWarning ) {
856+ /* print extra comma ignored warning */
857+ j9nls_printf (PORTLIB, J9NLS_INFO, J9NLS_GC_OPTIONS_XLP_EXTRA_COMMA);
858+ }
859+
860+ /*
861+ * Update values in case of exact match only
862+ */
863+ for (UDATA pageIndex = 0 ; 0 != pageSizes[pageIndex]; ++pageIndex) {
864+ if ((pageSizes[pageIndex] == offheapPageSize) && (pageFlags[pageIndex] == offheapPageFlags)) {
865+ found = true ;
866+ extensions->sparseHeapPageSize = offheapPageSize;
867+ extensions->sparseHeapPageFlags = offheapPageFlags;
868+ break ;
869+ }
870+ }
871+
872+ if (!found) {
873+ const char *oldQualifier, *newQualifier;
874+ UDATA oldSize = offheapPageSize;
875+ UDATA newSize = extensions->sparseHeapPageSize ;
876+ const char *oldPageType = getPageTypeStringWithLeadingSpace (oldSize);
877+ const char *newPageType = getPageTypeStringWithLeadingSpace (newSize);
878+ qualifiedSize (&oldSize, &oldQualifier);
879+ qualifiedSize (&newSize, &newQualifier);
880+
881+ j9nls_printf (PORTLIB, J9NLS_INFO, J9NLS_GC_OPTIONS_XLP_PAGE_NOT_SUPPORTED, " offheap" , oldSize, oldQualifier, oldPageType, newSize, newQualifier, newPageType);
882+ }
883+ }
884+
837885_reportXlpError:
838886 /* If error occurred during parsing of -Xlp options, report it here. */
839887 if (XLP_NO_ERROR != xlpErrorState) {
0 commit comments