Title: [292289] trunk/Source/WebKit
Revision
292289
Author
[email protected]
Date
2022-04-04 08:45:40 -0700 (Mon, 04 Apr 2022)

Log Message

RemoteRenderingBackendProxy fails to maintain correct state when gpu process crashes and upon deletion
https://bugs.webkit.org/show_bug.cgi?id=238618

Patch by Kimmo Kinnunen <[email protected]> on 2022-04-04
Reviewed by Simon Fraser.

RemoteRenderingBackendProxy::m_needsWakeUpSemaphoreForDisplayListStream
was not reset when proxy would connect to a new gpu process after a crash.
RemoteRenderingBackendProxy::~RemoteRenderingBackendProxy() would not
remove the GPUConnection::Client registration.

* Platform/IPC/MessageReceiveQueueMap.cpp:
(IPC::MessageReceiveQueueMap::remove):
* Platform/IPC/StreamClientConnection.h:
* WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp:
(WebKit::RemoteRenderingBackendProxy::~RemoteRenderingBackendProxy):
(WebKit::RemoteRenderingBackendProxy::gpuProcessConnectionDidClose):
(WebKit::RemoteRenderingBackendProxy::disconnectGPUProcess):
(WebKit::RemoteRenderingBackendProxy::streamConnection):
(WebKit::RemoteRenderingBackendProxy::didCreateWakeUpSemaphoreForDisplayListStream):
* WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h:

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (292288 => 292289)


--- trunk/Source/WebKit/ChangeLog	2022-04-04 15:40:24 UTC (rev 292288)
+++ trunk/Source/WebKit/ChangeLog	2022-04-04 15:45:40 UTC (rev 292289)
@@ -1,5 +1,28 @@
 2022-04-04  Kimmo Kinnunen  <[email protected]>
 
+        RemoteRenderingBackendProxy fails to maintain correct state when gpu process crashes and upon deletion
+        https://bugs.webkit.org/show_bug.cgi?id=238618
+
+        Reviewed by Simon Fraser.
+
+        RemoteRenderingBackendProxy::m_needsWakeUpSemaphoreForDisplayListStream
+        was not reset when proxy would connect to a new gpu process after a crash.
+        RemoteRenderingBackendProxy::~RemoteRenderingBackendProxy() would not
+        remove the GPUConnection::Client registration.
+
+        * Platform/IPC/MessageReceiveQueueMap.cpp:
+        (IPC::MessageReceiveQueueMap::remove):
+        * Platform/IPC/StreamClientConnection.h:
+        * WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp:
+        (WebKit::RemoteRenderingBackendProxy::~RemoteRenderingBackendProxy):
+        (WebKit::RemoteRenderingBackendProxy::gpuProcessConnectionDidClose):
+        (WebKit::RemoteRenderingBackendProxy::disconnectGPUProcess):
+        (WebKit::RemoteRenderingBackendProxy::streamConnection):
+        (WebKit::RemoteRenderingBackendProxy::didCreateWakeUpSemaphoreForDisplayListStream):
+        * WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h:
+
+2022-04-04  Kimmo Kinnunen  <[email protected]>
+
         StreamClientConnection should have waitForAndDispatchImmediately
         https://bugs.webkit.org/show_bug.cgi?id=238622
 

Modified: trunk/Source/WebKit/Platform/IPC/StreamClientConnection.h (292288 => 292289)


--- trunk/Source/WebKit/Platform/IPC/StreamClientConnection.h	2022-04-04 15:40:24 UTC (rev 292288)
+++ trunk/Source/WebKit/Platform/IPC/StreamClientConnection.h	2022-04-04 15:45:40 UTC (rev 292289)
@@ -61,6 +61,7 @@
 
     StreamConnectionBuffer& streamBuffer() { return m_buffer; }
     void setWakeUpSemaphore(IPC::Semaphore&&);
+    bool hasWakeUpSemaphore() const { return m_wakeUpSemaphore.has_value(); }
 
     void setWakeUpMessageHysteresis(unsigned hysteresis)
     {

Modified: trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp (292288 => 292289)


--- trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp	2022-04-04 15:40:24 UTC (rev 292288)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp	2022-04-04 15:45:40 UTC (rev 292289)
@@ -63,12 +63,8 @@
 {
     if (!m_gpuProcessConnection)
         return;
-
-    // Un-register itself as a MessageReceiver.
-    m_gpuProcessConnection->messageReceiverMap().removeMessageReceiver(*this);
-
-    // Release the RemoteRenderingBackend.
     m_gpuProcessConnection->connection().send(Messages::GPUConnectionToWebProcess::ReleaseRenderingBackend(renderingBackendIdentifier()), 0, IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply);
+    disconnectGPUProcess();
 }
 
 GPUProcessConnection& RemoteRenderingBackendProxy::ensureGPUProcessConnection()
@@ -85,19 +81,27 @@
     return *m_gpuProcessConnection;
 }
 
-void RemoteRenderingBackendProxy::gpuProcessConnectionDidClose(GPUProcessConnection& previousConnection)
+void RemoteRenderingBackendProxy::gpuProcessConnectionDidClose(GPUProcessConnection&)
 {
-    previousConnection.removeClient(*this);
-    previousConnection.messageReceiverMap().removeMessageReceiver(*this);
+    if (!m_gpuProcessConnection)
+        return;
+    disconnectGPUProcess();
+    // Note: The cache will call back to this to setup a new connection.
+    m_remoteResourceCacheProxy.remoteResourceCacheWasDestroyed();
+}
+
+void RemoteRenderingBackendProxy::disconnectGPUProcess()
+{
+    m_gpuProcessConnection->removeClient(*this);
+    m_gpuProcessConnection->messageReceiverMap().removeMessageReceiver(*this);
     m_gpuProcessConnection = nullptr;
 
-    m_remoteResourceCacheProxy.remoteResourceCacheWasDestroyed();
-
     if (m_destroyGetPixelBufferSharedMemoryTimer.isActive())
         m_destroyGetPixelBufferSharedMemoryTimer.stop();
     m_getPixelBufferSharedMemory = nullptr;
     m_renderingUpdateID = { };
     m_didRenderingUpdateID = { };
+    m_streamConnection = nullptr;
 }
 
 RemoteRenderingBackendProxy::DidReceiveBackendCreationResult RemoteRenderingBackendProxy::waitForDidCreateImageBufferBackend()
@@ -411,7 +415,7 @@
 IPC::StreamClientConnection& RemoteRenderingBackendProxy::streamConnection()
 {
     ensureGPUProcessConnection();
-    if (UNLIKELY(m_needsWakeUpSemaphoreForDisplayListStream))
+    if (UNLIKELY(!m_streamConnection->hasWakeUpSemaphore()))
         m_streamConnection->waitForAndDispatchImmediately<Messages::RemoteRenderingBackendProxy::DidCreateWakeUpSemaphoreForDisplayListStream>(renderingBackendIdentifier(), 3_s, IPC::WaitForOption::InterruptWaitingIfSyncMessageArrives);
     return *m_streamConnection;
 }
@@ -422,9 +426,7 @@
         ASSERT_NOT_REACHED();
         return;
     }
-
     m_streamConnection->setWakeUpSemaphore(WTFMove(semaphore));
-    m_needsWakeUpSemaphoreForDisplayListStream = false;
 }
 
 bool RemoteRenderingBackendProxy::isCached(const ImageBuffer& imageBuffer) const

Modified: trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h (292288 => 292289)


--- trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h	2022-04-04 15:40:24 UTC (rev 292288)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h	2022-04-04 15:45:40 UTC (rev 292289)
@@ -159,7 +159,7 @@
 
     // GPUProcessConnection::Client
     void gpuProcessConnectionDidClose(GPUProcessConnection&) final;
-
+    void disconnectGPUProcess();
     GPUProcessConnection& ensureGPUProcessConnection();
 
     // Returns std::nullopt if no update is needed or allocation failed.
@@ -181,8 +181,6 @@
 
     RenderingUpdateID m_renderingUpdateID;
     RenderingUpdateID m_didRenderingUpdateID;
-
-    bool m_needsWakeUpSemaphoreForDisplayListStream { true };
 };
 
 } // namespace WebKit
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to