Skip to content

Commit 5775ab9

Browse files
authored
Merge pull request #18894 from dsouzai/fsdPreCheckpoint
Generate FSD code pre-checkpoint under -XX:+DebugOnRestore
2 parents b78beae + fba6443 commit 5775ab9

File tree

8 files changed

+166
-44
lines changed

8 files changed

+166
-44
lines changed

runtime/compiler/control/CompilationThread.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7444,13 +7444,15 @@ TR::CompilationInfoPerThreadBase::generatePerfToolEntry()
74447444
}
74457445
if (getPerfFile())
74467446
{
7447-
j9jit_fprintf(getPerfFile(), "%p %lX %s_%s\n", getMetadata()->startPC, getMetadata()->endWarmPC - getMetadata()->startPC,
7448-
getCompilation()->signature(), getCompilation()->getHotnessName(getCompilation()->getMethodHotness()));
7447+
j9jit_fprintf(getPerfFile(), "%p %lX %s_%s%s\n", getMetadata()->startPC, getMetadata()->endWarmPC - getMetadata()->startPC,
7448+
getCompilation()->signature(), getCompilation()->getHotnessName(getCompilation()->getMethodHotness()),
7449+
getMetadata()->flags & JIT_METADATA_IS_FSD_COMP ? "_fsd" : "");
74497450
// If there is a cold section, add another line
74507451
if (getMetadata()->startColdPC)
74517452
{
7452-
j9jit_fprintf(getPerfFile(), "%p %lX %s_%s\n", getMetadata()->startColdPC, getMetadata()->endPC - getMetadata()->startColdPC,
7453-
getCompilation()->signature(), getCompilation()->getHotnessName(getCompilation()->getMethodHotness())); // should we change the name of the method?
7453+
j9jit_fprintf(getPerfFile(), "%p %lX %s_%s%s\n", getMetadata()->startColdPC, getMetadata()->endPC - getMetadata()->startColdPC,
7454+
getCompilation()->signature(), getCompilation()->getHotnessName(getCompilation()->getMethodHotness()),
7455+
getMetadata()->flags & JIT_METADATA_IS_FSD_COMP ? "_fsd" : ""); // should we change the name of the method?
74547456
}
74557457
// Flushing degrades performance, but ensures that we have the data
74567458
// written even if the JVM is abruptly terminated
@@ -9259,6 +9261,7 @@ TR::CompilationInfoPerThreadBase::wrappedCompile(J9PortLibrary *portLib, void *
92599261
{
92609262
options->setInsertGCRTrees(); // This is a recommendation not a directive
92619263
}
9264+
92629265
// Disable some expensive optimizations
92639266
if (options->getOptLevel() <= warm && !options->getOption(TR_EnableExpensiveOptsAtWarm))
92649267
{
@@ -11252,6 +11255,9 @@ void TR::CompilationInfoPerThreadBase::logCompilationSuccess(
1125211255
if (isJniNative)
1125311256
TR_VerboseLog::write(" JNI"); // flag JNI compilations
1125411257

11258+
if (compiler->getOption(TR_FullSpeedDebug))
11259+
TR_VerboseLog::write(" FSD");
11260+
1125511261
if (compiler->getOption(TR_EnableOSR))
1125611262
TR_VerboseLog::write(" OSR");
1125711263

runtime/compiler/control/J9Options.cpp

Lines changed: 118 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ bool enableCompiledMethodLoadHookOnly = false;
6969
// Static data initialization
7070
// -----------------------------------------------------------------------------
7171

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

2876+
bool
2877+
J9::Options::isFSDNeeded(J9JavaVM *javaVM, J9HookInterface **vmHooks)
2878+
{
2879+
return
2880+
#if defined(J9VM_JIT_FULL_SPEED_DEBUG)
2881+
(javaVM->requiredDebugAttributes & J9VM_DEBUG_ATTRIBUTE_CAN_ACCESS_LOCALS) ||
2882+
#endif
2883+
#if defined (J9VM_INTERP_HOT_CODE_REPLACEMENT)
2884+
(*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_POP_FRAMES_INTERRUPT) ||
2885+
#endif
2886+
(*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_BREAKPOINT) ||
2887+
(*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_FRAME_POPPED) ||
2888+
(*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_FRAME_POP) ||
2889+
(*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_GET_FIELD) ||
2890+
(*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_PUT_FIELD) ||
2891+
(*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_GET_STATIC_FIELD) ||
2892+
(*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_PUT_STATIC_FIELD) ||
2893+
(*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_SINGLE_STEP);
2894+
}
2895+
2896+
J9::Options::FSDInitStatus
2897+
J9::Options::initializeFSDIfNeeded(J9JavaVM *javaVM, J9HookInterface **vmHooks, bool &doAOT)
2898+
{
2899+
if (self()->isFSDNeeded(javaVM, vmHooks))
2900+
{
2901+
static bool TR_DisableFullSpeedDebug = (feGetEnv("TR_DisableFullSpeedDebug") != NULL);
2902+
static bool TR_DisableFullSpeedDebugAOT = (feGetEnv("TR_DisableFullSpeedDebugAOT") != NULL);
2903+
#if defined(J9VM_JIT_FULL_SPEED_DEBUG)
2904+
if (TR_DisableFullSpeedDebug)
2905+
{
2906+
return FSDInitStatus::FSDInit_Error;
2907+
}
2908+
else if (TR_DisableFullSpeedDebugAOT)
2909+
{
2910+
doAOT = false;
2911+
}
2912+
2913+
self()->setOption(TR_FullSpeedDebug);
2914+
self()->setOption(TR_DisableDirectToJNI);
2915+
//setOption(TR_DisableNoVMAccess);
2916+
//setOption(TR_DisableAsyncCompilation);
2917+
//setOption(TR_DisableInterpreterProfiling, true);
2918+
2919+
initializeFSD(javaVM);
2920+
2921+
_fsdInitStatus = FSDInitStatus::FSDInit_Initialized;
2922+
#else
2923+
_fsdInitStatus = FSDInitStatus::FSDInit_Error;
2924+
#endif
2925+
}
2926+
2927+
return _fsdInitStatus;
2928+
}
2929+
28752930
bool J9::Options::feLatePostProcess(void * base, TR::OptionSet * optionSet)
28762931
{
28772932
// vmPostProcess is called indirectly from the JIT_INITIALIZED phase
@@ -2887,6 +2942,7 @@ bool J9::Options::feLatePostProcess(void * base, TR::OptionSet * optionSet)
28872942
J9JITConfig * jitConfig = (J9JITConfig*)base;
28882943
J9JavaVM * javaVM = jitConfig->javaVM;
28892944
J9HookInterface * * vmHooks = javaVM->internalVMFunctions->getVMHookInterface(javaVM);
2945+
J9VMThread * vmThread = javaVM->internalVMFunctions->currentVMThread(javaVM);
28902946

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

29172973
// Determine whether or not to call the hooked helpers
2918-
//
2919-
if (
2920-
#if defined(J9VM_JIT_FULL_SPEED_DEBUG)
2921-
(javaVM->requiredDebugAttributes & J9VM_DEBUG_ATTRIBUTE_CAN_ACCESS_LOCALS) ||
2922-
#endif
2923-
#if defined (J9VM_INTERP_HOT_CODE_REPLACEMENT)
2924-
(*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_POP_FRAMES_INTERRUPT) ||
2925-
#endif
2926-
(*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_BREAKPOINT) ||
2927-
(*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_FRAME_POPPED) ||
2928-
(*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_FRAME_POP) ||
2929-
(*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_GET_FIELD) ||
2930-
(*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_PUT_FIELD) ||
2931-
(*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_GET_STATIC_FIELD) ||
2932-
(*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_PUT_STATIC_FIELD) ||
2933-
(*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_SINGLE_STEP))
2934-
{
2935-
static bool TR_DisableFullSpeedDebug = (feGetEnv("TR_DisableFullSpeedDebug") != NULL);
2936-
static bool TR_DisableFullSpeedDebugAOT = (feGetEnv("TR_DisableFullSpeedDebugAOT") != NULL);
2937-
#if defined(J9VM_JIT_FULL_SPEED_DEBUG)
2938-
if (TR_DisableFullSpeedDebug)
2939-
{
2940-
return false;
2941-
}
2942-
else if (TR_DisableFullSpeedDebugAOT)
2943-
{
2944-
doAOT = false;
2945-
}
2946-
2947-
self()->setOption(TR_FullSpeedDebug);
2948-
self()->setOption(TR_DisableDirectToJNI);
2949-
//setOption(TR_DisableNoVMAccess);
2950-
//setOption(TR_DisableAsyncCompilation);
2951-
//setOption(TR_DisableInterpreterProfiling, true);
2952-
2953-
initializeFSD(javaVM);
2954-
#else
2955-
return false;
2956-
#endif
2974+
FSDInitStatus fsdStatus = initializeFSDIfNeeded(javaVM, vmHooks, doAOT);
2975+
if (fsdStatus == FSDInitStatus::FSDInit_Error)
2976+
{
2977+
return false;
29572978
}
2979+
#if defined(J9VM_OPT_CRIU_SUPPORT)
2980+
else if (fsdStatus == FSDInitStatus::FSDInit_NotInitialized
2981+
&& javaVM->internalVMFunctions->isDebugOnRestoreEnabled(vmThread))
2982+
{
2983+
self()->setOption(TR_FullSpeedDebug);
2984+
self()->setOption(TR_DisableDirectToJNI);
2985+
}
2986+
#endif
29582987

29592988
bool exceptionEventHooked = false;
29602989
if ((*vmHooks)->J9HookDisable(vmHooks, J9HOOK_VM_EXCEPTION_CATCH))
@@ -3593,3 +3622,53 @@ J9::Options::closeLogFileForClientOptions()
35933622
}
35943623
}
35953624
#endif /* defined(J9VM_OPT_JITSERVER) */
3625+
3626+
#if defined(J9VM_OPT_CRIU_SUPPORT)
3627+
void
3628+
J9::Options::resetFSDOptions()
3629+
{
3630+
// TODO: Need to handle if these options were set/unset as part of
3631+
// the post restore options processing.
3632+
3633+
setOption(TR_EnableHCR);
3634+
3635+
setOption(TR_FullSpeedDebug, false);
3636+
setOption(TR_DisableDirectToJNI, false);
3637+
3638+
setReportByteCodeInfoAtCatchBlock(false);
3639+
setOption(TR_DisableProfiling, false);
3640+
setOption(TR_DisableNewInstanceImplOpt, false);
3641+
setDisabled(OMR::redundantGotoElimination, false);
3642+
setDisabled(OMR::loopReplicator, false);
3643+
setOption(TR_DisableMethodHandleThunks, false);
3644+
}
3645+
3646+
void
3647+
J9::Options::resetFSDOptionsForAll()
3648+
{
3649+
resetFSDOptions();
3650+
for (auto optionSet = _optionSets; optionSet; optionSet = optionSet->getNext())
3651+
{
3652+
optionSet->getOptions()->resetFSDOptions();
3653+
}
3654+
}
3655+
3656+
J9::Options::FSDInitStatus
3657+
J9::Options::resetFSD(J9JavaVM *vm, J9VMThread *vmThread, bool &doAOT)
3658+
{
3659+
J9HookInterface ** vmHooks = vm->internalVMFunctions->getVMHookInterface(vm);
3660+
auto fsdStatusJIT = getCmdLineOptions()->initializeFSDIfNeeded(vm, vmHooks, doAOT);
3661+
auto fsdStatusAOT = getAOTCmdLineOptions()->initializeFSDIfNeeded(vm, vmHooks, doAOT);
3662+
TR_ASSERT_FATAL (fsdStatusJIT == fsdStatusAOT, "fsdStatusJIT=%d != fsdStatusAOT=%d!\n", fsdStatusJIT, fsdStatusAOT);
3663+
3664+
if (fsdStatusJIT == TR::Options::FSDInitStatus::FSDInit_NotInitialized
3665+
&& !vm->internalVMFunctions->isCheckpointAllowed(vmThread)
3666+
&& vm->internalVMFunctions->isDebugOnRestoreEnabled(vmThread))
3667+
{
3668+
getCmdLineOptions()->resetFSDOptionsForAll();
3669+
getAOTCmdLineOptions()->resetFSDOptionsForAll();
3670+
}
3671+
3672+
return fsdStatusJIT;
3673+
}
3674+
#endif /* defined(J9VM_OPT_CRIU_SUPPORT) */

runtime/compiler/control/J9Options.hpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,14 @@ class OMR_EXTENSIBLE Options : public OMR::OptionsConnector
147147

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

150+
enum FSDInitStatus
151+
{
152+
FSDInit_Error,
153+
FSDInit_NotInitialized,
154+
FSDInit_Initialized
155+
};
150156

157+
static FSDInitStatus _fsdInitStatus;
151158

152159
static bool _doNotProcessEnvVars;
153160

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

621+
bool isFSDNeeded(J9JavaVM *javaVM, J9HookInterface **vmHooks);
622+
FSDInitStatus initializeFSDIfNeeded(J9JavaVM *javaVM, J9HookInterface **vmHooks, bool &doAOT);
623+
614624
#if defined(J9VM_OPT_JITSERVER)
615625
void setupJITServerOptions();
616626

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

636+
#if defined(J9VM_OPT_CRIU_SUPPORT)
637+
static FSDInitStatus resetFSD(J9JavaVM *vm, J9VMThread *vmThread, bool &doAOT);
638+
void resetFSDOptions();
639+
void resetFSDOptionsForAll();
640+
#endif /* defined(J9VM_OPT_CRIU_SUPPORT) */
641+
626642
private:
627643

628644
#if defined(J9VM_OPT_JITSERVER)

runtime/compiler/control/OptionsPostRestore.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -702,6 +702,16 @@ J9::OptionsPostRestore::postProcessInternalCompilerOptions()
702702
disableAOT = true;
703703
}
704704

705+
bool doAOT = !disableAOT;
706+
TR::Options::FSDInitStatus fsdStatus = TR::Options::resetFSD(vm, _vmThread, doAOT);
707+
disableAOT = !doAOT;
708+
709+
if (fsdStatus == TR::Options::FSDInitStatus::FSDInit_Error)
710+
{
711+
invalidateAll = true;
712+
disableAOT = true;
713+
}
714+
705715
// Invalidate method bodies if needed
706716
invalidateCompiledMethodsIfNeeded(invalidateAll);
707717

runtime/compiler/runtime/J9Runtime.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,7 @@ typedef struct TR_AOTMethodHeader {
198198
#define TR_AOTMethodHeader_IsNotCapableOfExceptionHook 0x00000100
199199
#define TR_AOTMethodHeader_UsesOSR 0x00000200
200200
#define TR_AOTMethodHeader_MethodTracingEnabled 0x00000400
201+
#define TR_AOTMethodHeader_UsesFSD 0x00000800
201202

202203

203204
typedef struct TR_AOTInliningStats

runtime/compiler/runtime/MetaData.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1621,6 +1621,11 @@ createMethodMetaData(
16211621
aotMethodHeaderEntry->flags |= TR_AOTMethodHeader_TMDisabled;
16221622
}
16231623

1624+
if (comp->getOption(TR_FullSpeedDebug))
1625+
{
1626+
aotMethodHeaderEntry->flags |= TR_AOTMethodHeader_UsesFSD;
1627+
}
1628+
16241629
// totalAllocated space is in comp object
16251630
TR_ASSERT(comp->getTotalNeededDataCacheSpace() == aotMethodHeaderEntry->compileMethodDataSize, "Size missmatach");
16261631
}

runtime/compiler/runtime/RelocationRuntime.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -695,7 +695,7 @@ TR_RelocationRuntime::relocateAOTCodeAndData(U_8 *tempDataStart,
695695
excptEntry32->ramMethod = actualMethod;
696696

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

701701
numExcptionRanges--;

test/functional/cmdLineTests/criu/playlist.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@
104104
<variation>-Xgcpolicy:optavgpause</variation>
105105
<variation>-Xgcpolicy:gencon -Xgcthreads64 -XX:CheckpointGCThreads=1</variation>
106106
<variation>-Xgcpolicy:gencon -Xgcthreads1</variation>
107+
<variation>-XX:+DebugOnRestore -Xjit</variation>
108+
<variation>-XX:+DebugOnRestore -Xjit:count=0</variation>
107109
</variations>
108110
<disables>
109111
<disable>
@@ -140,6 +142,7 @@
140142
<variation>-Xgcpolicy:optavgpause</variation>
141143
<variation>-Xgcpolicy:gencon -Xgcthreads64 -XX:CheckpointGCThreads=1</variation>
142144
<variation>-Xgcpolicy:gencon -Xgcthreads1</variation>
145+
<variation>-XX:+DebugOnRestore</variation>
143146
</variations>
144147
<disables>
145148
<disable>
@@ -174,6 +177,8 @@
174177
<variation>-Xjit</variation>
175178
<variation>-Xjit:count=0</variation>
176179
<variation>-Xjit:vlog=vlog</variation>
180+
<variation>-XX:+DebugOnRestore -Xjit</variation>
181+
<variation>-XX:+DebugOnRestore -Xjit:count=0</variation>
177182
</variations>
178183
<disables>
179184
<disable>

0 commit comments

Comments
 (0)