Skip to content

Commit

Permalink
Merge pull request #18894 from dsouzai/fsdPreCheckpoint
Browse files Browse the repository at this point in the history
Generate FSD code pre-checkpoint under -XX:+DebugOnRestore
  • Loading branch information
ymanton authored Feb 13, 2024
2 parents b78beae + fba6443 commit 5775ab9
Show file tree
Hide file tree
Showing 8 changed files with 166 additions and 44 deletions.
14 changes: 10 additions & 4 deletions runtime/compiler/control/CompilationThread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7444,13 +7444,15 @@ TR::CompilationInfoPerThreadBase::generatePerfToolEntry()
}
if (getPerfFile())
{
j9jit_fprintf(getPerfFile(), "%p %lX %s_%s\n", getMetadata()->startPC, getMetadata()->endWarmPC - getMetadata()->startPC,
getCompilation()->signature(), getCompilation()->getHotnessName(getCompilation()->getMethodHotness()));
j9jit_fprintf(getPerfFile(), "%p %lX %s_%s%s\n", getMetadata()->startPC, getMetadata()->endWarmPC - getMetadata()->startPC,
getCompilation()->signature(), getCompilation()->getHotnessName(getCompilation()->getMethodHotness()),
getMetadata()->flags & JIT_METADATA_IS_FSD_COMP ? "_fsd" : "");
// If there is a cold section, add another line
if (getMetadata()->startColdPC)
{
j9jit_fprintf(getPerfFile(), "%p %lX %s_%s\n", getMetadata()->startColdPC, getMetadata()->endPC - getMetadata()->startColdPC,
getCompilation()->signature(), getCompilation()->getHotnessName(getCompilation()->getMethodHotness())); // should we change the name of the method?
j9jit_fprintf(getPerfFile(), "%p %lX %s_%s%s\n", getMetadata()->startColdPC, getMetadata()->endPC - getMetadata()->startColdPC,
getCompilation()->signature(), getCompilation()->getHotnessName(getCompilation()->getMethodHotness()),
getMetadata()->flags & JIT_METADATA_IS_FSD_COMP ? "_fsd" : ""); // should we change the name of the method?
}
// Flushing degrades performance, but ensures that we have the data
// written even if the JVM is abruptly terminated
Expand Down Expand Up @@ -9259,6 +9261,7 @@ TR::CompilationInfoPerThreadBase::wrappedCompile(J9PortLibrary *portLib, void *
{
options->setInsertGCRTrees(); // This is a recommendation not a directive
}

// Disable some expensive optimizations
if (options->getOptLevel() <= warm && !options->getOption(TR_EnableExpensiveOptsAtWarm))
{
Expand Down Expand Up @@ -11252,6 +11255,9 @@ void TR::CompilationInfoPerThreadBase::logCompilationSuccess(
if (isJniNative)
TR_VerboseLog::write(" JNI"); // flag JNI compilations

if (compiler->getOption(TR_FullSpeedDebug))
TR_VerboseLog::write(" FSD");

if (compiler->getOption(TR_EnableOSR))
TR_VerboseLog::write(" OSR");

Expand Down
157 changes: 118 additions & 39 deletions runtime/compiler/control/J9Options.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ bool enableCompiledMethodLoadHookOnly = false;
// Static data initialization
// -----------------------------------------------------------------------------

J9::Options::FSDInitStatus J9::Options::_fsdInitStatus = J9::Options::FSDInitStatus::FSDInit_NotInitialized;
bool J9::Options::_doNotProcessEnvVars = false; // set through XX options in Java
bool J9::Options::_reportByteCodeInfoAtCatchBlock = false;
int32_t J9::Options::_samplingFrequencyInIdleMode = 1000; // ms
Expand Down Expand Up @@ -2872,6 +2873,60 @@ J9::Options::fePostProcessAOT(void * base)
return true;
}

bool
J9::Options::isFSDNeeded(J9JavaVM *javaVM, J9HookInterface **vmHooks)
{
return
#if defined(J9VM_JIT_FULL_SPEED_DEBUG)
(javaVM->requiredDebugAttributes & J9VM_DEBUG_ATTRIBUTE_CAN_ACCESS_LOCALS) ||
#endif
#if defined (J9VM_INTERP_HOT_CODE_REPLACEMENT)
(*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_POP_FRAMES_INTERRUPT) ||
#endif
(*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_BREAKPOINT) ||
(*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_FRAME_POPPED) ||
(*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_FRAME_POP) ||
(*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_GET_FIELD) ||
(*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_PUT_FIELD) ||
(*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_GET_STATIC_FIELD) ||
(*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_PUT_STATIC_FIELD) ||
(*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_SINGLE_STEP);
}

J9::Options::FSDInitStatus
J9::Options::initializeFSDIfNeeded(J9JavaVM *javaVM, J9HookInterface **vmHooks, bool &doAOT)
{
if (self()->isFSDNeeded(javaVM, vmHooks))
{
static bool TR_DisableFullSpeedDebug = (feGetEnv("TR_DisableFullSpeedDebug") != NULL);
static bool TR_DisableFullSpeedDebugAOT = (feGetEnv("TR_DisableFullSpeedDebugAOT") != NULL);
#if defined(J9VM_JIT_FULL_SPEED_DEBUG)
if (TR_DisableFullSpeedDebug)
{
return FSDInitStatus::FSDInit_Error;
}
else if (TR_DisableFullSpeedDebugAOT)
{
doAOT = false;
}

self()->setOption(TR_FullSpeedDebug);
self()->setOption(TR_DisableDirectToJNI);
//setOption(TR_DisableNoVMAccess);
//setOption(TR_DisableAsyncCompilation);
//setOption(TR_DisableInterpreterProfiling, true);

initializeFSD(javaVM);

_fsdInitStatus = FSDInitStatus::FSDInit_Initialized;
#else
_fsdInitStatus = FSDInitStatus::FSDInit_Error;
#endif
}

return _fsdInitStatus;
}

bool J9::Options::feLatePostProcess(void * base, TR::OptionSet * optionSet)
{
// vmPostProcess is called indirectly from the JIT_INITIALIZED phase
Expand All @@ -2887,6 +2942,7 @@ bool J9::Options::feLatePostProcess(void * base, TR::OptionSet * optionSet)
J9JITConfig * jitConfig = (J9JITConfig*)base;
J9JavaVM * javaVM = jitConfig->javaVM;
J9HookInterface * * vmHooks = javaVM->internalVMFunctions->getVMHookInterface(javaVM);
J9VMThread * vmThread = javaVM->internalVMFunctions->currentVMThread(javaVM);

TR_J9VMBase * vm = TR_J9VMBase::get(jitConfig, 0);
TR::CompilationInfo * compInfo = TR::CompilationInfo::get(jitConfig);
Expand Down Expand Up @@ -2915,46 +2971,19 @@ bool J9::Options::feLatePostProcess(void * base, TR::OptionSet * optionSet)
#endif

// Determine whether or not to call the hooked helpers
//
if (
#if defined(J9VM_JIT_FULL_SPEED_DEBUG)
(javaVM->requiredDebugAttributes & J9VM_DEBUG_ATTRIBUTE_CAN_ACCESS_LOCALS) ||
#endif
#if defined (J9VM_INTERP_HOT_CODE_REPLACEMENT)
(*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_POP_FRAMES_INTERRUPT) ||
#endif
(*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_BREAKPOINT) ||
(*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_FRAME_POPPED) ||
(*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_FRAME_POP) ||
(*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_GET_FIELD) ||
(*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_PUT_FIELD) ||
(*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_GET_STATIC_FIELD) ||
(*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_PUT_STATIC_FIELD) ||
(*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_SINGLE_STEP))
{
static bool TR_DisableFullSpeedDebug = (feGetEnv("TR_DisableFullSpeedDebug") != NULL);
static bool TR_DisableFullSpeedDebugAOT = (feGetEnv("TR_DisableFullSpeedDebugAOT") != NULL);
#if defined(J9VM_JIT_FULL_SPEED_DEBUG)
if (TR_DisableFullSpeedDebug)
{
return false;
}
else if (TR_DisableFullSpeedDebugAOT)
{
doAOT = false;
}

self()->setOption(TR_FullSpeedDebug);
self()->setOption(TR_DisableDirectToJNI);
//setOption(TR_DisableNoVMAccess);
//setOption(TR_DisableAsyncCompilation);
//setOption(TR_DisableInterpreterProfiling, true);

initializeFSD(javaVM);
#else
return false;
#endif
FSDInitStatus fsdStatus = initializeFSDIfNeeded(javaVM, vmHooks, doAOT);
if (fsdStatus == FSDInitStatus::FSDInit_Error)
{
return false;
}
#if defined(J9VM_OPT_CRIU_SUPPORT)
else if (fsdStatus == FSDInitStatus::FSDInit_NotInitialized
&& javaVM->internalVMFunctions->isDebugOnRestoreEnabled(vmThread))
{
self()->setOption(TR_FullSpeedDebug);
self()->setOption(TR_DisableDirectToJNI);
}
#endif

bool exceptionEventHooked = false;
if ((*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_EXCEPTION_CATCH))
Expand Down Expand Up @@ -3593,3 +3622,53 @@ J9::Options::closeLogFileForClientOptions()
}
}
#endif /* defined(J9VM_OPT_JITSERVER) */

#if defined(J9VM_OPT_CRIU_SUPPORT)
void
J9::Options::resetFSDOptions()
{
// TODO: Need to handle if these options were set/unset as part of
// the post restore options processing.

setOption(TR_EnableHCR);

setOption(TR_FullSpeedDebug, false);
setOption(TR_DisableDirectToJNI, false);

setReportByteCodeInfoAtCatchBlock(false);
setOption(TR_DisableProfiling, false);
setOption(TR_DisableNewInstanceImplOpt, false);
setDisabled(OMR::redundantGotoElimination, false);
setDisabled(OMR::loopReplicator, false);
setOption(TR_DisableMethodHandleThunks, false);
}

void
J9::Options::resetFSDOptionsForAll()
{
resetFSDOptions();
for (auto optionSet = _optionSets; optionSet; optionSet = optionSet->getNext())
{
optionSet->getOptions()->resetFSDOptions();
}
}

J9::Options::FSDInitStatus
J9::Options::resetFSD(J9JavaVM *vm, J9VMThread *vmThread, bool &doAOT)
{
J9HookInterface ** vmHooks = vm->internalVMFunctions->getVMHookInterface(vm);
auto fsdStatusJIT = getCmdLineOptions()->initializeFSDIfNeeded(vm, vmHooks, doAOT);
auto fsdStatusAOT = getAOTCmdLineOptions()->initializeFSDIfNeeded(vm, vmHooks, doAOT);
TR_ASSERT_FATAL (fsdStatusJIT == fsdStatusAOT, "fsdStatusJIT=%d != fsdStatusAOT=%d!\n", fsdStatusJIT, fsdStatusAOT);

if (fsdStatusJIT == TR::Options::FSDInitStatus::FSDInit_NotInitialized
&& !vm->internalVMFunctions->isCheckpointAllowed(vmThread)
&& vm->internalVMFunctions->isDebugOnRestoreEnabled(vmThread))
{
getCmdLineOptions()->resetFSDOptionsForAll();
getAOTCmdLineOptions()->resetFSDOptionsForAll();
}

return fsdStatusJIT;
}
#endif /* defined(J9VM_OPT_CRIU_SUPPORT) */
16 changes: 16 additions & 0 deletions runtime/compiler/control/J9Options.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,14 @@ class OMR_EXTENSIBLE Options : public OMR::OptionsConnector

Options(TR::Options &other) : OMR::OptionsConnector(other) {}

enum FSDInitStatus
{
FSDInit_Error,
FSDInit_NotInitialized,
FSDInit_Initialized
};

static FSDInitStatus _fsdInitStatus;

static bool _doNotProcessEnvVars;

Expand Down Expand Up @@ -611,6 +618,9 @@ class OMR_EXTENSIBLE Options : public OMR::OptionsConnector
bool showPID();
void openLogFiles(J9JITConfig *jitConfig);

bool isFSDNeeded(J9JavaVM *javaVM, J9HookInterface **vmHooks);
FSDInitStatus initializeFSDIfNeeded(J9JavaVM *javaVM, J9HookInterface **vmHooks, bool &doAOT);

#if defined(J9VM_OPT_JITSERVER)
void setupJITServerOptions();

Expand All @@ -623,6 +633,12 @@ class OMR_EXTENSIBLE Options : public OMR::OptionsConnector
void closeLogFileForClientOptions();
#endif /* defined(J9VM_OPT_JITSERVER) */

#if defined(J9VM_OPT_CRIU_SUPPORT)
static FSDInitStatus resetFSD(J9JavaVM *vm, J9VMThread *vmThread, bool &doAOT);
void resetFSDOptions();
void resetFSDOptionsForAll();
#endif /* defined(J9VM_OPT_CRIU_SUPPORT) */

private:

#if defined(J9VM_OPT_JITSERVER)
Expand Down
10 changes: 10 additions & 0 deletions runtime/compiler/control/OptionsPostRestore.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -702,6 +702,16 @@ J9::OptionsPostRestore::postProcessInternalCompilerOptions()
disableAOT = true;
}

bool doAOT = !disableAOT;
TR::Options::FSDInitStatus fsdStatus = TR::Options::resetFSD(vm, _vmThread, doAOT);
disableAOT = !doAOT;

if (fsdStatus == TR::Options::FSDInitStatus::FSDInit_Error)
{
invalidateAll = true;
disableAOT = true;
}

// Invalidate method bodies if needed
invalidateCompiledMethodsIfNeeded(invalidateAll);

Expand Down
1 change: 1 addition & 0 deletions runtime/compiler/runtime/J9Runtime.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,7 @@ typedef struct TR_AOTMethodHeader {
#define TR_AOTMethodHeader_IsNotCapableOfExceptionHook 0x00000100
#define TR_AOTMethodHeader_UsesOSR 0x00000200
#define TR_AOTMethodHeader_MethodTracingEnabled 0x00000400
#define TR_AOTMethodHeader_UsesFSD 0x00000800


typedef struct TR_AOTInliningStats
Expand Down
5 changes: 5 additions & 0 deletions runtime/compiler/runtime/MetaData.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1621,6 +1621,11 @@ createMethodMetaData(
aotMethodHeaderEntry->flags |= TR_AOTMethodHeader_TMDisabled;
}

if (comp->getOption(TR_FullSpeedDebug))
{
aotMethodHeaderEntry->flags |= TR_AOTMethodHeader_UsesFSD;
}

// totalAllocated space is in comp object
TR_ASSERT(comp->getTotalNeededDataCacheSpace() == aotMethodHeaderEntry->compileMethodDataSize, "Size missmatach");
}
Expand Down
2 changes: 1 addition & 1 deletion runtime/compiler/runtime/RelocationRuntime.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -695,7 +695,7 @@ TR_RelocationRuntime::relocateAOTCodeAndData(U_8 *tempDataStart,
excptEntry32->ramMethod = actualMethod;

excptEntry32++;
if (_comp->getOption(TR_FullSpeedDebug))
if (_aotMethodHeaderEntry->flags & TR_AOTMethodHeader_UsesFSD)
excptEntry32 = (J9JIT32BitExceptionTableEntry *) ((uint8_t *) excptEntry32 + 4);

numExcptionRanges--;
Expand Down
5 changes: 5 additions & 0 deletions test/functional/cmdLineTests/criu/playlist.xml
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,8 @@
<variation>-Xgcpolicy:optavgpause</variation>
<variation>-Xgcpolicy:gencon -Xgcthreads64 -XX:CheckpointGCThreads=1</variation>
<variation>-Xgcpolicy:gencon -Xgcthreads1</variation>
<variation>-XX:+DebugOnRestore -Xjit</variation>
<variation>-XX:+DebugOnRestore -Xjit:count=0</variation>
</variations>
<disables>
<disable>
Expand Down Expand Up @@ -140,6 +142,7 @@
<variation>-Xgcpolicy:optavgpause</variation>
<variation>-Xgcpolicy:gencon -Xgcthreads64 -XX:CheckpointGCThreads=1</variation>
<variation>-Xgcpolicy:gencon -Xgcthreads1</variation>
<variation>-XX:+DebugOnRestore</variation>
</variations>
<disables>
<disable>
Expand Down Expand Up @@ -174,6 +177,8 @@
<variation>-Xjit</variation>
<variation>-Xjit:count=0</variation>
<variation>-Xjit:vlog=vlog</variation>
<variation>-XX:+DebugOnRestore -Xjit</variation>
<variation>-XX:+DebugOnRestore -Xjit:count=0</variation>
</variations>
<disables>
<disable>
Expand Down

0 comments on commit 5775ab9

Please sign in to comment.