From 7f6d6b69b45ffc35b9345e5814384e9fdcbc58fe Mon Sep 17 00:00:00 2001 From: David Mason Date: Thu, 21 Apr 2022 18:06:21 -0700 Subject: [PATCH 1/2] WIP --- src/coreclr/inc/clrconfigvalues.h | 1 + src/coreclr/vm/ceemain.cpp | 5 +++++ src/coreclr/vm/eeconfig.cpp | 2 ++ src/coreclr/vm/eeconfig.h | 23 ++++++++++++++--------- src/coreclr/vm/rejit.inl | 4 ++-- 5 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/coreclr/inc/clrconfigvalues.h b/src/coreclr/inc/clrconfigvalues.h index f8ffae0672e8a6..d06900034778ae 100644 --- a/src/coreclr/inc/clrconfigvalues.h +++ b/src/coreclr/inc/clrconfigvalues.h @@ -513,6 +513,7 @@ RETAIL_CONFIG_DWORD_INFO(EXTERNAL_ProfAPI_DetachMinSleepMs, W("ProfAPI_DetachMin RETAIL_CONFIG_DWORD_INFO(EXTERNAL_ProfAPI_DetachMaxSleepMs, W("ProfAPI_DetachMaxSleepMs"), 0, "The maximum time, in milliseconds, the CLR will wait before checking whether a profiler that is in the process of detaching is ready to be unloaded.") RETAIL_CONFIG_DWORD_INFO(EXTERNAL_ProfAPI_RejitOnAttach, W("ProfApi_RejitOnAttach"), 1, "Enables the ability for profilers to rejit methods on attach.") RETAIL_CONFIG_DWORD_INFO(EXTERNAL_ProfAPI_InliningTracking, W("ProfApi_InliningTracking"), 1, "Enables the runtime's tracking of inlining for profiler ReJIT.") +RETAIL_CONFIG_DWORD_INFO(EXTERNAL_DebuggerLaunchDisablesCodeVersioning, W("EXTERNAL_DebuggerLaunchDisablesCodeVersioning"), 1, "Attaching a debugger at startup will disable TieredCompilation and RejitOnAttach.") CONFIG_DWORD_INFO(INTERNAL_ProfAPI_EnableRejitDiagnostics, W("ProfAPI_EnableRejitDiagnostics"), 0, "Enable extra dumping to stdout of rejit structures") CONFIG_DWORD_INFO(INTERNAL_ProfAPIFault, W("ProfAPIFault"), 0, "Test-only bitmask to inject various types of faults in the profapi code") CONFIG_DWORD_INFO(INTERNAL_TestOnlyAllowedEventMask, W("TestOnlyAllowedEventMask"), 0, "Test-only bitmask to allow profiler tests to override CLR enforcement of COR_PRF_ALLOWABLE_AFTER_ATTACH and COR_PRF_MONITOR_IMMUTABLE") diff --git a/src/coreclr/vm/ceemain.cpp b/src/coreclr/vm/ceemain.cpp index bce2d8ae807776..ed7fbeda5a72a6 100644 --- a/src/coreclr/vm/ceemain.cpp +++ b/src/coreclr/vm/ceemain.cpp @@ -2001,6 +2001,11 @@ static void InitializeDebugger(void) } } + static ConfigDWORD debuggerDisablesCodeVersioning; + if( (debuggerDisablesCodeVersioning.val(CLRConfig::EXTERNAL_DebuggerLaunchDisablesCodeVersioning) != 0) && CORDebuggerAttached()) + { + g_pConfig->DisableDefaultCodeVersioning(); + } LOG((LF_CORDB, LL_INFO10, "Left-side debugging services setup.\n")); diff --git a/src/coreclr/vm/eeconfig.cpp b/src/coreclr/vm/eeconfig.cpp index dd180f3abe760e..01ddbc873b940f 100644 --- a/src/coreclr/vm/eeconfig.cpp +++ b/src/coreclr/vm/eeconfig.cpp @@ -237,6 +237,8 @@ HRESULT EEConfig::Init() bDiagnosticSuspend = false; #endif + fDisableDefaultCodeVersioning = false; + #if defined(FEATURE_TIERED_COMPILATION) fTieredCompilation = false; fTieredCompilation_QuickJit = false; diff --git a/src/coreclr/vm/eeconfig.h b/src/coreclr/vm/eeconfig.h index bfb9ba16756120..8d387ce87e54fe 100644 --- a/src/coreclr/vm/eeconfig.h +++ b/src/coreclr/vm/eeconfig.h @@ -77,17 +77,20 @@ class EEConfig bool JitFramed(void) const {LIMITED_METHOD_CONTRACT; return fJitFramed; } bool JitMinOpts(void) const {LIMITED_METHOD_CONTRACT; return fJitMinOpts; } + void DisableDefaultCodeVersioning() { fDisableDefaultCodeVersioning = TRUE; } + bool DefaultCodeVersioningDisabled() const {LIMITED_METHOD_CONTRACT; return fDisableDefaultCodeVersioning; } + // Tiered Compilation config #if defined(FEATURE_TIERED_COMPILATION) - bool TieredCompilation(void) const { LIMITED_METHOD_CONTRACT; return fTieredCompilation; } - bool TieredCompilation_QuickJit() const { LIMITED_METHOD_CONTRACT; return fTieredCompilation_QuickJit; } - bool TieredCompilation_QuickJitForLoops() const { LIMITED_METHOD_CONTRACT; return fTieredCompilation_QuickJitForLoops; } - DWORD TieredCompilation_BackgroundWorkerTimeoutMs() const { LIMITED_METHOD_CONTRACT; return tieredCompilation_BackgroundWorkerTimeoutMs; } - bool TieredCompilation_CallCounting() const { LIMITED_METHOD_CONTRACT; return fTieredCompilation_CallCounting; } - UINT16 TieredCompilation_CallCountThreshold() const { LIMITED_METHOD_CONTRACT; return tieredCompilation_CallCountThreshold; } - DWORD TieredCompilation_CallCountingDelayMs() const { LIMITED_METHOD_CONTRACT; return tieredCompilation_CallCountingDelayMs; } - bool TieredCompilation_UseCallCountingStubs() const { LIMITED_METHOD_CONTRACT; return fTieredCompilation_UseCallCountingStubs; } - DWORD TieredCompilation_DeleteCallCountingStubsAfter() const { LIMITED_METHOD_CONTRACT; return tieredCompilation_DeleteCallCountingStubsAfter; } + bool TieredCompilation(void) const { LIMITED_METHOD_CONTRACT; return fTieredCompilation && !fDisableDefaultCodeVersioning; } + bool TieredCompilation_QuickJit() const { LIMITED_METHOD_CONTRACT; return fTieredCompilation_QuickJit && !fDisableDefaultCodeVersioning; } + bool TieredCompilation_QuickJitForLoops() const { LIMITED_METHOD_CONTRACT; return fTieredCompilation_QuickJitForLoops && !fDisableDefaultCodeVersioning; } + DWORD TieredCompilation_BackgroundWorkerTimeoutMs() const { LIMITED_METHOD_CONTRACT; return fDisableDefaultCodeVersioning ? 0 : tieredCompilation_BackgroundWorkerTimeoutMs; } + bool TieredCompilation_CallCounting() const { LIMITED_METHOD_CONTRACT; return fTieredCompilation_CallCounting && !fDisableDefaultCodeVersioning; } + UINT16 TieredCompilation_CallCountThreshold() const { LIMITED_METHOD_CONTRACT; return fDisableDefaultCodeVersioning ? 1 : tieredCompilation_CallCountThreshold; } + DWORD TieredCompilation_CallCountingDelayMs() const { LIMITED_METHOD_CONTRACT; return fDisableDefaultCodeVersioning ? 0 : tieredCompilation_CallCountingDelayMs; } + bool TieredCompilation_UseCallCountingStubs() const { LIMITED_METHOD_CONTRACT; return fTieredCompilation_UseCallCountingStubs && !fDisableDefaultCodeVersioning; } + DWORD TieredCompilation_DeleteCallCountingStubsAfter() const { LIMITED_METHOD_CONTRACT; return fDisableDefaultCodeVersioning ? 0 : tieredCompilation_DeleteCallCountingStubsAfter; } #endif #if defined(FEATURE_ON_STACK_REPLACEMENT) @@ -677,6 +680,8 @@ class EEConfig DWORD testThreadAbort; #endif + bool fDisableDefaultCodeVersioning; + #if defined(FEATURE_TIERED_COMPILATION) bool fTieredCompilation; bool fTieredCompilation_QuickJit; diff --git a/src/coreclr/vm/rejit.inl b/src/coreclr/vm/rejit.inl index f59c536af7893b..ad1d1f788644ac 100644 --- a/src/coreclr/vm/rejit.inl +++ b/src/coreclr/vm/rejit.inl @@ -28,7 +28,7 @@ inline BOOL ReJitManager::IsReJITEnabled() static bool profilerStartupRejit = CORProfilerEnableRejit() != FALSE; static ConfigDWORD rejitOnAttachEnabled; - return profilerStartupRejit || (rejitOnAttachEnabled.val(CLRConfig::EXTERNAL_ProfAPI_RejitOnAttach) != 0); + return profilerStartupRejit || ((rejitOnAttachEnabled.val(CLRConfig::EXTERNAL_ProfAPI_RejitOnAttach) != 0) && !g_pConfig->DefaultCodeVersioningDisabled()); } inline BOOL ReJitManager::IsReJITInlineTrackingEnabled() @@ -36,7 +36,7 @@ inline BOOL ReJitManager::IsReJITInlineTrackingEnabled() LIMITED_METHOD_CONTRACT; static ConfigDWORD rejitInliningEnabled; - return rejitInliningEnabled.val(CLRConfig::EXTERNAL_ProfAPI_RejitOnAttach) != 0; + return rejitInliningEnabled.val(CLRConfig::EXTERNAL_ProfAPI_RejitOnAttach) != 0 && !g_pConfig->DefaultCodeVersioningDisabled(); } #ifndef DACCESS_COMPILE From d8d9145d82cd10e6258c5d510aa82038e11654e5 Mon Sep 17 00:00:00 2001 From: David Mason Date: Tue, 10 May 2022 01:21:21 -0700 Subject: [PATCH 2/2] add logging Update ceemain.cpp --- src/coreclr/vm/ceemain.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/coreclr/vm/ceemain.cpp b/src/coreclr/vm/ceemain.cpp index ed7fbeda5a72a6..0d17a54fd09c9f 100644 --- a/src/coreclr/vm/ceemain.cpp +++ b/src/coreclr/vm/ceemain.cpp @@ -2004,6 +2004,7 @@ static void InitializeDebugger(void) static ConfigDWORD debuggerDisablesCodeVersioning; if( (debuggerDisablesCodeVersioning.val(CLRConfig::EXTERNAL_DebuggerLaunchDisablesCodeVersioning) != 0) && CORDebuggerAttached()) { + LOG((LF_CORDB, LL_INFO10, "Debugger is active at startup, disabling code versioning to prevent a potential deadlock.\n")); g_pConfig->DisableDefaultCodeVersioning(); }