Changeset 274413 in webkit


Ignore:
Timestamp:
Mar 15, 2021 4:34:01 AM (3 years ago)
Author:
commit-queue@webkit.org
Message:

RemoteRenderingBackend commands are not processed in order if GPU process is waiting for replies
https://bugs.webkit.org/show_bug.cgi?id=222099

Patch by Kimmo Kinnunen <kkinnunen@apple.com> on 2021-03-15
Reviewed by Simon Fraser.

Mark all asynchronous message sends with DispatchMessageEvenWhenWaitingForSyncReply.
Otherwise synchronous messages will be dispatched before asynchronous messages.
The messages are temporally dependent.

Consider initial message exchange in canvas-blending-color-over-image.html:
GPUConnectionToWebProcess_CreateRenderingBackend
RemoteRenderingBackend_CreateImageBuffer
RemoteRenderingBackend_DidCreateSharedDisplayListHandle
RemoteRenderingBackend_CreateImageBuffer
RemoteRenderingBackend_WakeUpAndApplyDisplayList
RemoteRenderingBackend_GetDataURLForImageBuffer
RemoteRenderingBackendProxy_DidCreateImageBufferBackend
RemoteRenderingBackendProxy_DidCreateImageBufferBackend

If GPU process is waiting for a sync reply when the sequence up
until GetDataURL.. arrives, then the dispatch order is:

GPUConnectionToWebProcess_CreateRenderingBackend
RemoteRenderingBackend_GetDataURLForImageBuffer

[... rest of the messages]

This is a rare case, affects only the case where:
1) These messages arrive before main thread processes the message queue
2) GPU process has sent a synchronous message and is waiting for a reply

In base case after RenderingBackend has been created and the work queue
receive queue has been installed, all messages are moved to the work
queue thread and dispatched in order of arrival.

No new tests, timing dependent and WebKit code cannot be
unit tested.

  • WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp:

(WebKit::RemoteRenderingBackendProxy::~RemoteRenderingBackendProxy):
(WebKit::RemoteRenderingBackendProxy::reestablishGPUProcessConnection):
(WebKit::RemoteRenderingBackendProxy::createImageBuffer):
(WebKit::RemoteRenderingBackendProxy::cacheNativeImage):
(WebKit::RemoteRenderingBackendProxy::cacheFont):
(WebKit::RemoteRenderingBackendProxy::deleteAllFonts):
(WebKit::RemoteRenderingBackendProxy::releaseRemoteResource):
(WebKit::RemoteRenderingBackendProxy::sendWakeupMessage):
(WebKit::RemoteRenderingBackendProxy::createItemBuffer):

Location:
trunk/Source/WebKit
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r274412 r274413  
     12021-03-15  Kimmo Kinnunen  <kkinnunen@apple.com>
     2
     3        RemoteRenderingBackend commands are not processed in order if GPU process is waiting for replies
     4        https://bugs.webkit.org/show_bug.cgi?id=222099
     5
     6        Reviewed by Simon Fraser.
     7
     8        Mark all asynchronous message sends with DispatchMessageEvenWhenWaitingForSyncReply.
     9        Otherwise synchronous messages will be dispatched before asynchronous messages.
     10        The messages are temporally dependent.
     11
     12        Consider initial message exchange in canvas-blending-color-over-image.html:
     13        GPUConnectionToWebProcess_CreateRenderingBackend
     14        RemoteRenderingBackend_CreateImageBuffer
     15        RemoteRenderingBackend_DidCreateSharedDisplayListHandle
     16        RemoteRenderingBackend_CreateImageBuffer
     17        RemoteRenderingBackend_WakeUpAndApplyDisplayList
     18        RemoteRenderingBackend_GetDataURLForImageBuffer
     19        RemoteRenderingBackendProxy_DidCreateImageBufferBackend
     20        RemoteRenderingBackendProxy_DidCreateImageBufferBackend
     21
     22        If GPU process is waiting for a sync reply when the sequence up
     23        until GetDataURL.. arrives, then the dispatch order is:
     24
     25        GPUConnectionToWebProcess_CreateRenderingBackend
     26        RemoteRenderingBackend_GetDataURLForImageBuffer
     27         [... rest of the messages]
     28
     29        This is a rare case, affects only the case where:
     30        1) These messages arrive before main thread processes the message queue
     31        2) GPU process has sent a synchronous message and is waiting for a reply
     32
     33        In base case after RenderingBackend has been created and the work queue
     34        receive queue has been installed, all messages are moved to the work
     35        queue thread and dispatched in order of arrival.
     36
     37        No new tests, timing dependent and WebKit code cannot be
     38        unit tested.
     39
     40        * WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp:
     41        (WebKit::RemoteRenderingBackendProxy::~RemoteRenderingBackendProxy):
     42        (WebKit::RemoteRenderingBackendProxy::reestablishGPUProcessConnection):
     43        (WebKit::RemoteRenderingBackendProxy::createImageBuffer):
     44        (WebKit::RemoteRenderingBackendProxy::cacheNativeImage):
     45        (WebKit::RemoteRenderingBackendProxy::cacheFont):
     46        (WebKit::RemoteRenderingBackendProxy::deleteAllFonts):
     47        (WebKit::RemoteRenderingBackendProxy::releaseRemoteResource):
     48        (WebKit::RemoteRenderingBackendProxy::sendWakeupMessage):
     49        (WebKit::RemoteRenderingBackendProxy::createItemBuffer):
     50
    1512021-03-15  Kimmo Kinnunen  <kkinnunen@apple.com>
    252
  • trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp

    r273301 r274413  
    5959
    6060    // Release the RemoteRenderingBackend.
    61     send(Messages::GPUConnectionToWebProcess::ReleaseRenderingBackend(m_renderingBackendIdentifier), 0);
     61    send(Messages::GPUConnectionToWebProcess::ReleaseRenderingBackend(m_renderingBackendIdentifier), 0, IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply);
    6262}
    6363
     
    7777        if (!imageBuffer)
    7878            continue;
    79         send(Messages::RemoteRenderingBackend::CreateImageBuffer(imageBuffer->logicalSize(), imageBuffer->renderingMode(), imageBuffer->resolutionScale(), imageBuffer->colorSpace(), imageBuffer->pixelFormat(), imageBuffer->renderingResourceIdentifier()), m_renderingBackendIdentifier);
     79        send(Messages::RemoteRenderingBackend::CreateImageBuffer(imageBuffer->logicalSize(), imageBuffer->renderingMode(), imageBuffer->resolutionScale(), imageBuffer->colorSpace(), imageBuffer->pixelFormat(), imageBuffer->renderingResourceIdentifier()), m_renderingBackendIdentifier, IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply);
    8080        imageBuffer->clearBackend();
    8181    }
     
    137137
    138138    if (imageBuffer) {
    139         send(Messages::RemoteRenderingBackend::CreateImageBuffer(size, renderingMode, resolutionScale, colorSpace, pixelFormat, imageBuffer->renderingResourceIdentifier()), m_renderingBackendIdentifier);
     139        send(Messages::RemoteRenderingBackend::CreateImageBuffer(size, renderingMode, resolutionScale, colorSpace, pixelFormat, imageBuffer->renderingResourceIdentifier()), m_renderingBackendIdentifier, IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply);
    140140        return imageBuffer;
    141141    }
     
    194194void RemoteRenderingBackendProxy::cacheNativeImage(const ShareableBitmap::Handle& handle, RenderingResourceIdentifier renderingResourceIdentifier)
    195195{
    196     send(Messages::RemoteRenderingBackend::CacheNativeImage(handle, renderingResourceIdentifier), m_renderingBackendIdentifier);
     196    send(Messages::RemoteRenderingBackend::CacheNativeImage(handle, renderingResourceIdentifier), m_renderingBackendIdentifier, IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply);
    197197}
    198198
    199199void RemoteRenderingBackendProxy::cacheFont(Ref<WebCore::Font>&& font)
    200200{
    201     send(Messages::RemoteRenderingBackend::CacheFont(WTFMove(font)), m_renderingBackendIdentifier);
     201    send(Messages::RemoteRenderingBackend::CacheFont(WTFMove(font)), m_renderingBackendIdentifier, IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply);
    202202}
    203203
    204204void RemoteRenderingBackendProxy::deleteAllFonts()
    205205{
    206     send(Messages::RemoteRenderingBackend::DeleteAllFonts(), m_renderingBackendIdentifier);
     206    send(Messages::RemoteRenderingBackend::DeleteAllFonts(), m_renderingBackendIdentifier, IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply);
    207207}
    208208
     
    212212        m_currentDestinationImageBufferIdentifier = WTF::nullopt;
    213213
    214     send(Messages::RemoteRenderingBackend::ReleaseRemoteResource(renderingResourceIdentifier), m_renderingBackendIdentifier);
     214    send(Messages::RemoteRenderingBackend::ReleaseRemoteResource(renderingResourceIdentifier), m_renderingBackendIdentifier, IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply);
    215215}
    216216
     
    263263void RemoteRenderingBackendProxy::sendWakeupMessage(const GPUProcessWakeupMessageArguments& arguments)
    264264{
    265     send(Messages::RemoteRenderingBackend::WakeUpAndApplyDisplayList(arguments), m_renderingBackendIdentifier);
     265    send(Messages::RemoteRenderingBackend::WakeUpAndApplyDisplayList(arguments), m_renderingBackendIdentifier, IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply);
    266266}
    267267
     
    364364
    365365    auto identifier = DisplayList::ItemBufferIdentifier::generate();
    366     send(Messages::RemoteRenderingBackend::DidCreateSharedDisplayListHandle(identifier, { WTFMove(sharedMemoryHandle), sharedMemory->size() }, destinationBufferIdentifier), m_renderingBackendIdentifier);
     366    send(Messages::RemoteRenderingBackend::DidCreateSharedDisplayListHandle(identifier, { WTFMove(sharedMemoryHandle), sharedMemory->size() }, destinationBufferIdentifier), m_renderingBackendIdentifier, IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply);
    367367
    368368    auto newHandle = DisplayListWriterHandle::create(identifier, sharedMemory.releaseNonNull());
Note: See TracChangeset for help on using the changeset viewer.