[Mono] Fix deadlock during gcdump when using interp full AOT fallback. - #89726

Merged
lateralusX merged 4 commits into
dotnet:mainfrom
lateralusX:lateralusX/fix-deadlock-gcdump
Aug 3, 2023
Merged

[Mono] Fix deadlock during gcdump when using interp full AOT fallback.#89726
lateralusX merged 4 commits into
dotnet:mainfrom
lateralusX:lateralusX/fix-deadlock-gcdump

Conversation

@lateralusX

@lateralusXlateralusX commented Jul 31, 2023

Copy link
Copy Markdown
Member

GC thread doing gcdump will dump the EventPipe events after world has restarted but before releasing GC lock. There was one case where we logged a bulk type during that phase where a type didn't have its finalizer data initialized and at the same time main thread running interpreter held loader lock and tried to acquire GC lock, that triggers a deadlock since the GC thread (still holding the GC lock) would trigger logic to initialize the finalizer data, but that in turn requires the GC lock.

Fix delays the fire of GC dump events until after we completed GC. All GC dump events have been cached into a temp file and will be written into EventPipe, the only potential issue with this is that we keep vtable pointers in cache that will be resolved when emitting EventPipe event, after releasing GC lock, but since we currently won't unload vtables, that is not an issue, but needs to be addressed if/when we implement ability to unload vtables. We would then need to root the vtables while stored in temporary cache.

@lateralusX

lateralusX commented Aug 1, 2023

Copy link
Copy Markdown
MemberAuthor

@lambdageek possible to take a look so it can get into RC1?

@lateralusX

Copy link
Copy Markdown
MemberAuthor

Will need to adjust fix a little. Need to move the logging of EventPipe events until after releasing GC lock since there are to many scenarios where we can deadlock holding GC lock (and attempting to acquire loader lock). In theory we would need to root the vtables stored in cache as well to make sure they are not unloaded/freed while keeping them in cache, but since we currently doesn't fully support unloading of class/vtables, I mark it as a future TODO.

GC thread doing gcdump will dump the EventPipe events after world
has restarted but before releasing GC lock. There was one case
where we logged a bulk type during that face where a type didn't
have its finalizer data initialized and at the same time main thread
running interpreter held loader lock and tried to acquire GC lock,
that triggers a deadlock since the GC thread (still holding the GC lock)
would trigger logic to initialize the finalizer data, but that in turn
requires the GC lock.
Fix delays the fire of GC dump events until after we completed GC.
All GC dump events have been cached into a temp file and will be
written into EventPipe, the only potential issue with this is that
we keep vtable pointers in cache that will be resolved when emitting
EventPipe event, after releasing GC lock, but since we currently
won't unload vtables, that is not an issue, but needs to be addressed
if/when we implement ability to unload vtables. We would then need
to root the vtables while stored in temporary cache.
@lateralusX
lateralusXforce-pushed the lateralusX/fix-deadlock-gcdump branch from ccfa932 to c53bd9aCompareAugust 1, 2023 11:00
@lateralusXlateralusX changed the title [Mono] Fix rare deadlock during gcdump when using interp full AOT fallback.[Mono] Fix deadlock during gcdump when using interp full AOT fallback.Aug 1, 2023
@lateralusX

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@lateralusX

lateralusX commented Aug 3, 2023

Copy link
Copy Markdown
MemberAuthor

State of runtime-extra-platforms is currently unstable over several different platforms. Will merge this PR and once we start to fix up runtime-extra-platforms and if we have issues with the gcdump runtime tests added in this PR on some Mono platforms in runtime-extra-platforms, we should disable the test only on identified platform and log issues to investigate/fix.

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@lateralusX@lambdageek
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

[Mono] Fix deadlock during gcdump when using interp full AOT fallback. - #89726

Merged
lateralusX merged 4 commits into
dotnet:mainfrom
lateralusX:lateralusX/fix-deadlock-gcdump
Aug 3, 2023
Merged

[Mono] Fix deadlock during gcdump when using interp full AOT fallback.#89726
lateralusX merged 4 commits into
dotnet:mainfrom
lateralusX:lateralusX/fix-deadlock-gcdump

Conversation

@lateralusX

@lateralusXlateralusX commented Jul 31, 2023

Copy link
Copy Markdown
Member

GC thread doing gcdump will dump the EventPipe events after world has restarted but before releasing GC lock. There was one case where we logged a bulk type during that phase where a type didn't have its finalizer data initialized and at the same time main thread running interpreter held loader lock and tried to acquire GC lock, that triggers a deadlock since the GC thread (still holding the GC lock) would trigger logic to initialize the finalizer data, but that in turn requires the GC lock.

Fix delays the fire of GC dump events until after we completed GC. All GC dump events have been cached into a temp file and will be written into EventPipe, the only potential issue with this is that we keep vtable pointers in cache that will be resolved when emitting EventPipe event, after releasing GC lock, but since we currently won't unload vtables, that is not an issue, but needs to be addressed if/when we implement ability to unload vtables. We would then need to root the vtables while stored in temporary cache.

@lateralusX

lateralusX commented Aug 1, 2023

Copy link
Copy Markdown
MemberAuthor

@lambdageek possible to take a look so it can get into RC1?

@lateralusX

Copy link
Copy Markdown
MemberAuthor

Will need to adjust fix a little. Need to move the logging of EventPipe events until after releasing GC lock since there are to many scenarios where we can deadlock holding GC lock (and attempting to acquire loader lock). In theory we would need to root the vtables stored in cache as well to make sure they are not unloaded/freed while keeping them in cache, but since we currently doesn't fully support unloading of class/vtables, I mark it as a future TODO.

GC thread doing gcdump will dump the EventPipe events after world
has restarted but before releasing GC lock. There was one case
where we logged a bulk type during that face where a type didn't
have its finalizer data initialized and at the same time main thread
running interpreter held loader lock and tried to acquire GC lock,
that triggers a deadlock since the GC thread (still holding the GC lock)
would trigger logic to initialize the finalizer data, but that in turn
requires the GC lock.
Fix delays the fire of GC dump events until after we completed GC.
All GC dump events have been cached into a temp file and will be
written into EventPipe, the only potential issue with this is that
we keep vtable pointers in cache that will be resolved when emitting
EventPipe event, after releasing GC lock, but since we currently
won't unload vtables, that is not an issue, but needs to be addressed
if/when we implement ability to unload vtables. We would then need
to root the vtables while stored in temporary cache.
@lateralusX
lateralusXforce-pushed the lateralusX/fix-deadlock-gcdump branch from ccfa932 to c53bd9aCompareAugust 1, 2023 11:00
@lateralusXlateralusX changed the title [Mono] Fix rare deadlock during gcdump when using interp full AOT fallback.[Mono] Fix deadlock during gcdump when using interp full AOT fallback.Aug 1, 2023
@lateralusX

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@lateralusX

lateralusX commented Aug 3, 2023

Copy link
Copy Markdown
MemberAuthor

State of runtime-extra-platforms is currently unstable over several different platforms. Will merge this PR and once we start to fix up runtime-extra-platforms and if we have issues with the gcdump runtime tests added in this PR on some Mono platforms in runtime-extra-platforms, we should disable the test only on identified platform and log issues to investigate/fix.

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@lateralusX@lambdageek
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[Mono] Fix deadlock during gcdump when using interp full AOT fallback. - #89726

Merged
lateralusX merged 4 commits into
dotnet:mainfrom
lateralusX:lateralusX/fix-deadlock-gcdump
Aug 3, 2023
Merged

[Mono] Fix deadlock during gcdump when using interp full AOT fallback.#89726
lateralusX merged 4 commits into
dotnet:mainfrom
lateralusX:lateralusX/fix-deadlock-gcdump

Conversation

@lateralusX

@lateralusXlateralusX commented Jul 31, 2023

Copy link
Copy Markdown
Member

GC thread doing gcdump will dump the EventPipe events after world has restarted but before releasing GC lock. There was one case where we logged a bulk type during that phase where a type didn't have its finalizer data initialized and at the same time main thread running interpreter held loader lock and tried to acquire GC lock, that triggers a deadlock since the GC thread (still holding the GC lock) would trigger logic to initialize the finalizer data, but that in turn requires the GC lock.

Fix delays the fire of GC dump events until after we completed GC. All GC dump events have been cached into a temp file and will be written into EventPipe, the only potential issue with this is that we keep vtable pointers in cache that will be resolved when emitting EventPipe event, after releasing GC lock, but since we currently won't unload vtables, that is not an issue, but needs to be addressed if/when we implement ability to unload vtables. We would then need to root the vtables while stored in temporary cache.

@lateralusX

lateralusX commented Aug 1, 2023

Copy link
Copy Markdown
MemberAuthor

@lambdageek possible to take a look so it can get into RC1?

@lateralusX

Copy link
Copy Markdown
MemberAuthor

Will need to adjust fix a little. Need to move the logging of EventPipe events until after releasing GC lock since there are to many scenarios where we can deadlock holding GC lock (and attempting to acquire loader lock). In theory we would need to root the vtables stored in cache as well to make sure they are not unloaded/freed while keeping them in cache, but since we currently doesn't fully support unloading of class/vtables, I mark it as a future TODO.

GC thread doing gcdump will dump the EventPipe events after world
has restarted but before releasing GC lock. There was one case
where we logged a bulk type during that face where a type didn't
have its finalizer data initialized and at the same time main thread
running interpreter held loader lock and tried to acquire GC lock,
that triggers a deadlock since the GC thread (still holding the GC lock)
would trigger logic to initialize the finalizer data, but that in turn
requires the GC lock.
Fix delays the fire of GC dump events until after we completed GC.
All GC dump events have been cached into a temp file and will be
written into EventPipe, the only potential issue with this is that
we keep vtable pointers in cache that will be resolved when emitting
EventPipe event, after releasing GC lock, but since we currently
won't unload vtables, that is not an issue, but needs to be addressed
if/when we implement ability to unload vtables. We would then need
to root the vtables while stored in temporary cache.
@lateralusX
lateralusXforce-pushed the lateralusX/fix-deadlock-gcdump branch from ccfa932 to c53bd9aCompareAugust 1, 2023 11:00
@lateralusXlateralusX changed the title [Mono] Fix rare deadlock during gcdump when using interp full AOT fallback.[Mono] Fix deadlock during gcdump when using interp full AOT fallback.Aug 1, 2023
@lateralusX

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@lateralusX

lateralusX commented Aug 3, 2023

Copy link
Copy Markdown
MemberAuthor

State of runtime-extra-platforms is currently unstable over several different platforms. Will merge this PR and once we start to fix up runtime-extra-platforms and if we have issues with the gcdump runtime tests added in this PR on some Mono platforms in runtime-extra-platforms, we should disable the test only on identified platform and log issues to investigate/fix.

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@lateralusX@lambdageek
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[Mono] Fix deadlock during gcdump when using interp full AOT fallback. - #89726

Merged
lateralusX merged 4 commits into
dotnet:mainfrom
lateralusX:lateralusX/fix-deadlock-gcdump
Aug 3, 2023
Merged

[Mono] Fix deadlock during gcdump when using interp full AOT fallback.#89726
lateralusX merged 4 commits into
dotnet:mainfrom
lateralusX:lateralusX/fix-deadlock-gcdump

Conversation

@lateralusX

@lateralusXlateralusX commented Jul 31, 2023

Copy link
Copy Markdown
Member

GC thread doing gcdump will dump the EventPipe events after world has restarted but before releasing GC lock. There was one case where we logged a bulk type during that phase where a type didn't have its finalizer data initialized and at the same time main thread running interpreter held loader lock and tried to acquire GC lock, that triggers a deadlock since the GC thread (still holding the GC lock) would trigger logic to initialize the finalizer data, but that in turn requires the GC lock.

Fix delays the fire of GC dump events until after we completed GC. All GC dump events have been cached into a temp file and will be written into EventPipe, the only potential issue with this is that we keep vtable pointers in cache that will be resolved when emitting EventPipe event, after releasing GC lock, but since we currently won't unload vtables, that is not an issue, but needs to be addressed if/when we implement ability to unload vtables. We would then need to root the vtables while stored in temporary cache.

@lateralusX

lateralusX commented Aug 1, 2023

Copy link
Copy Markdown
MemberAuthor

@lambdageek possible to take a look so it can get into RC1?

@lateralusX

Copy link
Copy Markdown
MemberAuthor

Will need to adjust fix a little. Need to move the logging of EventPipe events until after releasing GC lock since there are to many scenarios where we can deadlock holding GC lock (and attempting to acquire loader lock). In theory we would need to root the vtables stored in cache as well to make sure they are not unloaded/freed while keeping them in cache, but since we currently doesn't fully support unloading of class/vtables, I mark it as a future TODO.

GC thread doing gcdump will dump the EventPipe events after world
has restarted but before releasing GC lock. There was one case
where we logged a bulk type during that face where a type didn't
have its finalizer data initialized and at the same time main thread
running interpreter held loader lock and tried to acquire GC lock,
that triggers a deadlock since the GC thread (still holding the GC lock)
would trigger logic to initialize the finalizer data, but that in turn
requires the GC lock.
Fix delays the fire of GC dump events until after we completed GC.
All GC dump events have been cached into a temp file and will be
written into EventPipe, the only potential issue with this is that
we keep vtable pointers in cache that will be resolved when emitting
EventPipe event, after releasing GC lock, but since we currently
won't unload vtables, that is not an issue, but needs to be addressed
if/when we implement ability to unload vtables. We would then need
to root the vtables while stored in temporary cache.
@lateralusX
lateralusXforce-pushed the lateralusX/fix-deadlock-gcdump branch from ccfa932 to c53bd9aCompareAugust 1, 2023 11:00
@lateralusXlateralusX changed the title [Mono] Fix rare deadlock during gcdump when using interp full AOT fallback.[Mono] Fix deadlock during gcdump when using interp full AOT fallback.Aug 1, 2023
@lateralusX

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@lateralusX

lateralusX commented Aug 3, 2023

Copy link
Copy Markdown
MemberAuthor

State of runtime-extra-platforms is currently unstable over several different platforms. Will merge this PR and once we start to fix up runtime-extra-platforms and if we have issues with the gcdump runtime tests added in this PR on some Mono platforms in runtime-extra-platforms, we should disable the test only on identified platform and log issues to investigate/fix.

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@lateralusX@lambdageek
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

[Mono] Fix deadlock during gcdump when using interp full AOT fallback. - #89726

Merged
lateralusX merged 4 commits into
dotnet:mainfrom
lateralusX:lateralusX/fix-deadlock-gcdump
Aug 3, 2023
Merged

[Mono] Fix deadlock during gcdump when using interp full AOT fallback.#89726
lateralusX merged 4 commits into
dotnet:mainfrom
lateralusX:lateralusX/fix-deadlock-gcdump

Conversation

@lateralusX

@lateralusXlateralusX commented Jul 31, 2023

Copy link
Copy Markdown
Member

GC thread doing gcdump will dump the EventPipe events after world has restarted but before releasing GC lock. There was one case where we logged a bulk type during that phase where a type didn't have its finalizer data initialized and at the same time main thread running interpreter held loader lock and tried to acquire GC lock, that triggers a deadlock since the GC thread (still holding the GC lock) would trigger logic to initialize the finalizer data, but that in turn requires the GC lock.

Fix delays the fire of GC dump events until after we completed GC. All GC dump events have been cached into a temp file and will be written into EventPipe, the only potential issue with this is that we keep vtable pointers in cache that will be resolved when emitting EventPipe event, after releasing GC lock, but since we currently won't unload vtables, that is not an issue, but needs to be addressed if/when we implement ability to unload vtables. We would then need to root the vtables while stored in temporary cache.

@lateralusX

lateralusX commented Aug 1, 2023

Copy link
Copy Markdown
MemberAuthor

@lambdageek possible to take a look so it can get into RC1?

@lateralusX

Copy link
Copy Markdown
MemberAuthor

Will need to adjust fix a little. Need to move the logging of EventPipe events until after releasing GC lock since there are to many scenarios where we can deadlock holding GC lock (and attempting to acquire loader lock). In theory we would need to root the vtables stored in cache as well to make sure they are not unloaded/freed while keeping them in cache, but since we currently doesn't fully support unloading of class/vtables, I mark it as a future TODO.

GC thread doing gcdump will dump the EventPipe events after world
has restarted but before releasing GC lock. There was one case
where we logged a bulk type during that face where a type didn't
have its finalizer data initialized and at the same time main thread
running interpreter held loader lock and tried to acquire GC lock,
that triggers a deadlock since the GC thread (still holding the GC lock)
would trigger logic to initialize the finalizer data, but that in turn
requires the GC lock.
Fix delays the fire of GC dump events until after we completed GC.
All GC dump events have been cached into a temp file and will be
written into EventPipe, the only potential issue with this is that
we keep vtable pointers in cache that will be resolved when emitting
EventPipe event, after releasing GC lock, but since we currently
won't unload vtables, that is not an issue, but needs to be addressed
if/when we implement ability to unload vtables. We would then need
to root the vtables while stored in temporary cache.
@lateralusX
lateralusXforce-pushed the lateralusX/fix-deadlock-gcdump branch from ccfa932 to c53bd9aCompareAugust 1, 2023 11:00
@lateralusXlateralusX changed the title [Mono] Fix rare deadlock during gcdump when using interp full AOT fallback.[Mono] Fix deadlock during gcdump when using interp full AOT fallback.Aug 1, 2023
@lateralusX

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@lateralusX

lateralusX commented Aug 3, 2023

Copy link
Copy Markdown
MemberAuthor

State of runtime-extra-platforms is currently unstable over several different platforms. Will merge this PR and once we start to fix up runtime-extra-platforms and if we have issues with the gcdump runtime tests added in this PR on some Mono platforms in runtime-extra-platforms, we should disable the test only on identified platform and log issues to investigate/fix.

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@lateralusX@lambdageek
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[Mono] Fix deadlock during gcdump when using interp full AOT fallback. - #89726

Merged
lateralusX merged 4 commits into
dotnet:mainfrom
lateralusX:lateralusX/fix-deadlock-gcdump
Aug 3, 2023
Merged

[Mono] Fix deadlock during gcdump when using interp full AOT fallback.#89726
lateralusX merged 4 commits into
dotnet:mainfrom
lateralusX:lateralusX/fix-deadlock-gcdump

Conversation

@lateralusX

@lateralusXlateralusX commented Jul 31, 2023

Copy link
Copy Markdown
Member

GC thread doing gcdump will dump the EventPipe events after world has restarted but before releasing GC lock. There was one case where we logged a bulk type during that phase where a type didn't have its finalizer data initialized and at the same time main thread running interpreter held loader lock and tried to acquire GC lock, that triggers a deadlock since the GC thread (still holding the GC lock) would trigger logic to initialize the finalizer data, but that in turn requires the GC lock.

Fix delays the fire of GC dump events until after we completed GC. All GC dump events have been cached into a temp file and will be written into EventPipe, the only potential issue with this is that we keep vtable pointers in cache that will be resolved when emitting EventPipe event, after releasing GC lock, but since we currently won't unload vtables, that is not an issue, but needs to be addressed if/when we implement ability to unload vtables. We would then need to root the vtables while stored in temporary cache.

@lateralusX

lateralusX commented Aug 1, 2023

Copy link
Copy Markdown
MemberAuthor

@lambdageek possible to take a look so it can get into RC1?

@lateralusX

Copy link
Copy Markdown
MemberAuthor

Will need to adjust fix a little. Need to move the logging of EventPipe events until after releasing GC lock since there are to many scenarios where we can deadlock holding GC lock (and attempting to acquire loader lock). In theory we would need to root the vtables stored in cache as well to make sure they are not unloaded/freed while keeping them in cache, but since we currently doesn't fully support unloading of class/vtables, I mark it as a future TODO.

GC thread doing gcdump will dump the EventPipe events after world
has restarted but before releasing GC lock. There was one case
where we logged a bulk type during that face where a type didn't
have its finalizer data initialized and at the same time main thread
running interpreter held loader lock and tried to acquire GC lock,
that triggers a deadlock since the GC thread (still holding the GC lock)
would trigger logic to initialize the finalizer data, but that in turn
requires the GC lock.
Fix delays the fire of GC dump events until after we completed GC.
All GC dump events have been cached into a temp file and will be
written into EventPipe, the only potential issue with this is that
we keep vtable pointers in cache that will be resolved when emitting
EventPipe event, after releasing GC lock, but since we currently
won't unload vtables, that is not an issue, but needs to be addressed
if/when we implement ability to unload vtables. We would then need
to root the vtables while stored in temporary cache.
@lateralusX
lateralusXforce-pushed the lateralusX/fix-deadlock-gcdump branch from ccfa932 to c53bd9aCompareAugust 1, 2023 11:00
@lateralusXlateralusX changed the title [Mono] Fix rare deadlock during gcdump when using interp full AOT fallback.[Mono] Fix deadlock during gcdump when using interp full AOT fallback.Aug 1, 2023
@lateralusX

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@lateralusX

lateralusX commented Aug 3, 2023

Copy link
Copy Markdown
MemberAuthor

State of runtime-extra-platforms is currently unstable over several different platforms. Will merge this PR and once we start to fix up runtime-extra-platforms and if we have issues with the gcdump runtime tests added in this PR on some Mono platforms in runtime-extra-platforms, we should disable the test only on identified platform and log issues to investigate/fix.

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@lateralusX@lambdageek
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[Mono] Fix deadlock during gcdump when using interp full AOT fallback. - #89726

Merged
lateralusX merged 4 commits into
dotnet:mainfrom
lateralusX:lateralusX/fix-deadlock-gcdump
Aug 3, 2023
Merged

[Mono] Fix deadlock during gcdump when using interp full AOT fallback.#89726
lateralusX merged 4 commits into
dotnet:mainfrom
lateralusX:lateralusX/fix-deadlock-gcdump

Conversation

@lateralusX

@lateralusXlateralusX commented Jul 31, 2023

Copy link
Copy Markdown
Member

GC thread doing gcdump will dump the EventPipe events after world has restarted but before releasing GC lock. There was one case where we logged a bulk type during that phase where a type didn't have its finalizer data initialized and at the same time main thread running interpreter held loader lock and tried to acquire GC lock, that triggers a deadlock since the GC thread (still holding the GC lock) would trigger logic to initialize the finalizer data, but that in turn requires the GC lock.

Fix delays the fire of GC dump events until after we completed GC. All GC dump events have been cached into a temp file and will be written into EventPipe, the only potential issue with this is that we keep vtable pointers in cache that will be resolved when emitting EventPipe event, after releasing GC lock, but since we currently won't unload vtables, that is not an issue, but needs to be addressed if/when we implement ability to unload vtables. We would then need to root the vtables while stored in temporary cache.

@lateralusX

lateralusX commented Aug 1, 2023

Copy link
Copy Markdown
MemberAuthor

@lambdageek possible to take a look so it can get into RC1?

@lateralusX

Copy link
Copy Markdown
MemberAuthor

Will need to adjust fix a little. Need to move the logging of EventPipe events until after releasing GC lock since there are to many scenarios where we can deadlock holding GC lock (and attempting to acquire loader lock). In theory we would need to root the vtables stored in cache as well to make sure they are not unloaded/freed while keeping them in cache, but since we currently doesn't fully support unloading of class/vtables, I mark it as a future TODO.

GC thread doing gcdump will dump the EventPipe events after world
has restarted but before releasing GC lock. There was one case
where we logged a bulk type during that face where a type didn't
have its finalizer data initialized and at the same time main thread
running interpreter held loader lock and tried to acquire GC lock,
that triggers a deadlock since the GC thread (still holding the GC lock)
would trigger logic to initialize the finalizer data, but that in turn
requires the GC lock.
Fix delays the fire of GC dump events until after we completed GC.
All GC dump events have been cached into a temp file and will be
written into EventPipe, the only potential issue with this is that
we keep vtable pointers in cache that will be resolved when emitting
EventPipe event, after releasing GC lock, but since we currently
won't unload vtables, that is not an issue, but needs to be addressed
if/when we implement ability to unload vtables. We would then need
to root the vtables while stored in temporary cache.
@lateralusX
lateralusXforce-pushed the lateralusX/fix-deadlock-gcdump branch from ccfa932 to c53bd9aCompareAugust 1, 2023 11:00
@lateralusXlateralusX changed the title [Mono] Fix rare deadlock during gcdump when using interp full AOT fallback.[Mono] Fix deadlock during gcdump when using interp full AOT fallback.Aug 1, 2023
@lateralusX

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@lateralusX

lateralusX commented Aug 3, 2023

Copy link
Copy Markdown
MemberAuthor

State of runtime-extra-platforms is currently unstable over several different platforms. Will merge this PR and once we start to fix up runtime-extra-platforms and if we have issues with the gcdump runtime tests added in this PR on some Mono platforms in runtime-extra-platforms, we should disable the test only on identified platform and log issues to investigate/fix.

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@lateralusX@lambdageek
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

[Mono] Fix deadlock during gcdump when using interp full AOT fallback. - #89726

Merged
lateralusX merged 4 commits into
dotnet:mainfrom
lateralusX:lateralusX/fix-deadlock-gcdump
Aug 3, 2023
Merged

[Mono] Fix deadlock during gcdump when using interp full AOT fallback.#89726
lateralusX merged 4 commits into
dotnet:mainfrom
lateralusX:lateralusX/fix-deadlock-gcdump

Conversation

@lateralusX

@lateralusXlateralusX commented Jul 31, 2023

Copy link
Copy Markdown
Member

GC thread doing gcdump will dump the EventPipe events after world has restarted but before releasing GC lock. There was one case where we logged a bulk type during that phase where a type didn't have its finalizer data initialized and at the same time main thread running interpreter held loader lock and tried to acquire GC lock, that triggers a deadlock since the GC thread (still holding the GC lock) would trigger logic to initialize the finalizer data, but that in turn requires the GC lock.

Fix delays the fire of GC dump events until after we completed GC. All GC dump events have been cached into a temp file and will be written into EventPipe, the only potential issue with this is that we keep vtable pointers in cache that will be resolved when emitting EventPipe event, after releasing GC lock, but since we currently won't unload vtables, that is not an issue, but needs to be addressed if/when we implement ability to unload vtables. We would then need to root the vtables while stored in temporary cache.

@lateralusX

lateralusX commented Aug 1, 2023

Copy link
Copy Markdown
MemberAuthor

@lambdageek possible to take a look so it can get into RC1?

@lateralusX

Copy link
Copy Markdown
MemberAuthor

Will need to adjust fix a little. Need to move the logging of EventPipe events until after releasing GC lock since there are to many scenarios where we can deadlock holding GC lock (and attempting to acquire loader lock). In theory we would need to root the vtables stored in cache as well to make sure they are not unloaded/freed while keeping them in cache, but since we currently doesn't fully support unloading of class/vtables, I mark it as a future TODO.

GC thread doing gcdump will dump the EventPipe events after world
has restarted but before releasing GC lock. There was one case
where we logged a bulk type during that face where a type didn't
have its finalizer data initialized and at the same time main thread
running interpreter held loader lock and tried to acquire GC lock,
that triggers a deadlock since the GC thread (still holding the GC lock)
would trigger logic to initialize the finalizer data, but that in turn
requires the GC lock.
Fix delays the fire of GC dump events until after we completed GC.
All GC dump events have been cached into a temp file and will be
written into EventPipe, the only potential issue with this is that
we keep vtable pointers in cache that will be resolved when emitting
EventPipe event, after releasing GC lock, but since we currently
won't unload vtables, that is not an issue, but needs to be addressed
if/when we implement ability to unload vtables. We would then need
to root the vtables while stored in temporary cache.
@lateralusX
lateralusXforce-pushed the lateralusX/fix-deadlock-gcdump branch from ccfa932 to c53bd9aCompareAugust 1, 2023 11:00
@lateralusXlateralusX changed the title [Mono] Fix rare deadlock during gcdump when using interp full AOT fallback.[Mono] Fix deadlock during gcdump when using interp full AOT fallback.Aug 1, 2023
@lateralusX

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@lateralusX

lateralusX commented Aug 3, 2023

Copy link
Copy Markdown
MemberAuthor

State of runtime-extra-platforms is currently unstable over several different platforms. Will merge this PR and once we start to fix up runtime-extra-platforms and if we have issues with the gcdump runtime tests added in this PR on some Mono platforms in runtime-extra-platforms, we should disable the test only on identified platform and log issues to investigate/fix.

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@lateralusX@lambdageek