⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 292289 in webkit


Ignore:
Timestamp:
Apr 4, 2022, 8:45:40 AM (4 years ago)
Author:
commit-queue@webkit.org
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 <kkinnunen@apple.com> 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:
Location:
trunk/Source/WebKit
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r292282 r292289  
     12022-04-04  Kimmo Kinnunen  <kkinnunen@apple.com>
     2
     3        RemoteRenderingBackendProxy fails to maintain correct state when gpu process crashes and upon deletion
     4        https://bugs.webkit.org/show_bug.cgi?id=238618
     5
     6        Reviewed by Simon Fraser.
     7
     8        RemoteRenderingBackendProxy::m_needsWakeUpSemaphoreForDisplayListStream
     9        was not reset when proxy would connect to a new gpu process after a crash.
     10        RemoteRenderingBackendProxy::~RemoteRenderingBackendProxy() would not
     11        remove the GPUConnection::Client registration.
     12
     13        * Platform/IPC/MessageReceiveQueueMap.cpp:
     14        (IPC::MessageReceiveQueueMap::remove):
     15        * Platform/IPC/StreamClientConnection.h:
     16        * WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp:
     17        (WebKit::RemoteRenderingBackendProxy::~RemoteRenderingBackendProxy):
     18        (WebKit::RemoteRenderingBackendProxy::gpuProcessConnectionDidClose):
     19        (WebKit::RemoteRenderingBackendProxy::disconnectGPUProcess):
     20        (WebKit::RemoteRenderingBackendProxy::streamConnection):
     21        (WebKit::RemoteRenderingBackendProxy::didCreateWakeUpSemaphoreForDisplayListStream):
     22        * WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h:
     23
    1242022-04-04  Kimmo Kinnunen  <kkinnunen@apple.com>
    225
  • trunk/Source/WebKit/Platform/IPC/StreamClientConnection.h

    r292282 r292289  
    6262    StreamConnectionBuffer& streamBuffer() { return m_buffer; }
    6363    void setWakeUpSemaphore(IPC::Semaphore&&);
     64    bool hasWakeUpSemaphore() const { return m_wakeUpSemaphore.has_value(); }
    6465
    6566    void setWakeUpMessageHysteresis(unsigned hysteresis)
  • trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp

    r292282 r292289  
    6464    if (!m_gpuProcessConnection)
    6565        return;
    66 
    67     // Un-register itself as a MessageReceiver.
    68     m_gpuProcessConnection->messageReceiverMap().removeMessageReceiver(*this);
    69 
    70     // Release the RemoteRenderingBackend.
    7166    m_gpuProcessConnection->connection().send(Messages::GPUConnectionToWebProcess::ReleaseRenderingBackend(renderingBackendIdentifier()), 0, IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply);
     67    disconnectGPUProcess();
    7268}
    7369
     
    8682}
    8783
    88 void RemoteRenderingBackendProxy::gpuProcessConnectionDidClose(GPUProcessConnection& previousConnection)
    89 {
    90     previousConnection.removeClient(*this);
    91     previousConnection.messageReceiverMap().removeMessageReceiver(*this);
     84void RemoteRenderingBackendProxy::gpuProcessConnectionDidClose(GPUProcessConnection&)
     85{
     86    if (!m_gpuProcessConnection)
     87        return;
     88    disconnectGPUProcess();
     89    // Note: The cache will call back to this to setup a new connection.
     90    m_remoteResourceCacheProxy.remoteResourceCacheWasDestroyed();
     91}
     92
     93void RemoteRenderingBackendProxy::disconnectGPUProcess()
     94{
     95    m_gpuProcessConnection->removeClient(*this);
     96    m_gpuProcessConnection->messageReceiverMap().removeMessageReceiver(*this);
    9297    m_gpuProcessConnection = nullptr;
    93 
    94     m_remoteResourceCacheProxy.remoteResourceCacheWasDestroyed();
    9598
    9699    if (m_destroyGetPixelBufferSharedMemoryTimer.isActive())
     
    99102    m_renderingUpdateID = { };
    100103    m_didRenderingUpdateID = { };
     104    m_streamConnection = nullptr;
    101105}
    102106
     
    412416{
    413417    ensureGPUProcessConnection();
    414     if (UNLIKELY(m_needsWakeUpSemaphoreForDisplayListStream))
     418    if (UNLIKELY(!m_streamConnection->hasWakeUpSemaphore()))
    415419        m_streamConnection->waitForAndDispatchImmediately<Messages::RemoteRenderingBackendProxy::DidCreateWakeUpSemaphoreForDisplayListStream>(renderingBackendIdentifier(), 3_s, IPC::WaitForOption::InterruptWaitingIfSyncMessageArrives);
    416420    return *m_streamConnection;
     
    423427        return;
    424428    }
    425 
    426429    m_streamConnection->setWakeUpSemaphore(WTFMove(semaphore));
    427     m_needsWakeUpSemaphoreForDisplayListStream = false;
    428430}
    429431
  • trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h

    r292282 r292289  
    160160    // GPUProcessConnection::Client
    161161    void gpuProcessConnectionDidClose(GPUProcessConnection&) final;
    162 
     162    void disconnectGPUProcess();
    163163    GPUProcessConnection& ensureGPUProcessConnection();
    164164
     
    182182    RenderingUpdateID m_renderingUpdateID;
    183183    RenderingUpdateID m_didRenderingUpdateID;
    184 
    185     bool m_needsWakeUpSemaphoreForDisplayListStream { true };
    186184};
    187185
Note: See TracChangeset for help on using the changeset viewer.