Skip to content

Commit dac6dea

Browse files
committed
Add -Xlp:offheap:
There is a new option to set physical page size/flags for Sparse Heap. Currently this option is going to accept any valid page size, even it is not recommended for Sparse Heap. Any specific limitations can be added later. Signed-off-by: Dmitri Pivkine <Dmitri_Pivkine@ca.ibm.com>
1 parent 82081e2 commit dac6dea

File tree

1 file changed

+56
-8
lines changed

1 file changed

+56
-8
lines changed

runtime/gc_modron_startup/mmparse.cpp

Lines changed: 56 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)