Title: [292961] trunk/Source/WebKit
Revision
292961
Author
s...@apple.com
Date
2022-04-18 11:30:14 -0700 (Mon, 18 Apr 2022)

Log Message

REGRESSION(r288847): GPU Process crash under GPUProcess::canExitUnderMemoryPressure()
https://bugs.webkit.org/show_bug.cgi?id=238558
rdar://91052033

Reviewed by Kimmo Kinnunen.

Use the rendering resources request count to keep the GPU process alive.

RemoteRenderingBackend updates it when active image buffers change.
RemoteGraphicsContextGL updates it on creation and destruction.
RemoteMediaPlayerProxy updates it on creation and destruction.

Remove RemoterRenderingBackend::updateRenderingResourceRequest(), the
count is now counted by RemoteImageBuffer creation, destruction.

Remove RemoterRenderingBackend::allowsExitUnderMemoryPressure(), it was
crashing due to race between the function and the work queue cleanup task.

Remove RemoteMediaPlayerManagerProxy::allowsExitUnderMemoryPressure(),
the count is already counted by RemoteMediaPlayerProxy creation, destruction.

Based on the initial patch by Kimmo Kinnunen.

* GPUProcess/GPUConnectionToWebProcess.cpp:
(WebKit::GPUConnectionToWebProcess::allowsExitUnderMemoryPressure const):
* GPUProcess/graphics/QualifiedResourceHeap.h:
(WebKit::QualifiedResourceHeap::hasImageBuffer const): Deleted.
(WebKit::QualifiedResourceHeap::hasNativeImage const): Deleted.
(WebKit::QualifiedResourceHeap::hasFont const): Deleted.
* GPUProcess/graphics/RemoteImageBuffer.h:
(WebKit::RemoteImageBuffer::m_renderingResourcesRequest):
* GPUProcess/graphics/RemoteRenderingBackend.cpp:
(WebKit::RemoteRenderingBackend::createImageBufferWithQualifiedIdentifier):
(WebKit::RemoteRenderingBackend::releaseRemoteResourceWithQualifiedIdentifier):
(WebKit::RemoteRenderingBackend::updateRenderingResourceRequest): Deleted.
(WebKit::RemoteRenderingBackend::allowsExitUnderMemoryPressure const): Deleted.
* GPUProcess/graphics/RemoteRenderingBackend.h:
* GPUProcess/graphics/RemoteResourceCache.h:
(WebKit::RemoteResourceCache::resourceHeap const): Deleted.
(WebKit::RemoteResourceCache::hasActiveDrawables const): Deleted.
* GPUProcess/graphics/ScopedRenderingResourcesRequest.h:
(WebKit::hasOutstandingRenderingResourceUsage):
* GPUProcess/media/RemoteMediaPlayerManagerProxy.cpp:
(WebKit::RemoteMediaPlayerManagerProxy::deleteMediaPlayer):
(WebKit::RemoteMediaPlayerManagerProxy::allowsExitUnderMemoryPressure const): Deleted.
* GPUProcess/media/RemoteMediaPlayerManagerProxy.h:

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (292960 => 292961)


--- trunk/Source/WebKit/ChangeLog	2022-04-18 17:56:11 UTC (rev 292960)
+++ trunk/Source/WebKit/ChangeLog	2022-04-18 18:30:14 UTC (rev 292961)
@@ -1,3 +1,52 @@
+2022-04-18  Said Abou-Hallawa  <s...@apple.com>
+
+        REGRESSION(r288847): GPU Process crash under GPUProcess::canExitUnderMemoryPressure()
+        https://bugs.webkit.org/show_bug.cgi?id=238558
+        rdar://91052033
+
+        Reviewed by Kimmo Kinnunen.
+
+        Use the rendering resources request count to keep the GPU process alive.
+
+        RemoteRenderingBackend updates it when active image buffers change.
+        RemoteGraphicsContextGL updates it on creation and destruction.
+        RemoteMediaPlayerProxy updates it on creation and destruction.
+
+        Remove RemoterRenderingBackend::updateRenderingResourceRequest(), the
+        count is now counted by RemoteImageBuffer creation, destruction.
+
+        Remove RemoterRenderingBackend::allowsExitUnderMemoryPressure(), it was
+        crashing due to race between the function and the work queue cleanup task.
+
+        Remove RemoteMediaPlayerManagerProxy::allowsExitUnderMemoryPressure(),
+        the count is already counted by RemoteMediaPlayerProxy creation, destruction.
+
+        Based on the initial patch by Kimmo Kinnunen.
+
+        * GPUProcess/GPUConnectionToWebProcess.cpp:
+        (WebKit::GPUConnectionToWebProcess::allowsExitUnderMemoryPressure const):
+        * GPUProcess/graphics/QualifiedResourceHeap.h:
+        (WebKit::QualifiedResourceHeap::hasImageBuffer const): Deleted.
+        (WebKit::QualifiedResourceHeap::hasNativeImage const): Deleted.
+        (WebKit::QualifiedResourceHeap::hasFont const): Deleted.
+        * GPUProcess/graphics/RemoteImageBuffer.h:
+        (WebKit::RemoteImageBuffer::m_renderingResourcesRequest):
+        * GPUProcess/graphics/RemoteRenderingBackend.cpp:
+        (WebKit::RemoteRenderingBackend::createImageBufferWithQualifiedIdentifier):
+        (WebKit::RemoteRenderingBackend::releaseRemoteResourceWithQualifiedIdentifier):
+        (WebKit::RemoteRenderingBackend::updateRenderingResourceRequest): Deleted.
+        (WebKit::RemoteRenderingBackend::allowsExitUnderMemoryPressure const): Deleted.
+        * GPUProcess/graphics/RemoteRenderingBackend.h:
+        * GPUProcess/graphics/RemoteResourceCache.h:
+        (WebKit::RemoteResourceCache::resourceHeap const): Deleted.
+        (WebKit::RemoteResourceCache::hasActiveDrawables const): Deleted.
+        * GPUProcess/graphics/ScopedRenderingResourcesRequest.h:
+        (WebKit::hasOutstandingRenderingResourceUsage):
+        * GPUProcess/media/RemoteMediaPlayerManagerProxy.cpp:
+        (WebKit::RemoteMediaPlayerManagerProxy::deleteMediaPlayer):
+        (WebKit::RemoteMediaPlayerManagerProxy::allowsExitUnderMemoryPressure const): Deleted.
+        * GPUProcess/media/RemoteMediaPlayerManagerProxy.h:
+
 2022-04-18  Elliott Williams  <e...@apple.com>
 
         [XCBuild] Use XCBuild for all command-line and project builds

Modified: trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp (292960 => 292961)


--- trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp	2022-04-18 17:56:11 UTC (rev 292960)
+++ trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp	2022-04-18 18:30:14 UTC (rev 292961)
@@ -61,6 +61,7 @@
 #include "RemoteSampleBufferDisplayLayerManagerMessages.h"
 #include "RemoteSampleBufferDisplayLayerMessages.h"
 #include "RemoteScrollingCoordinatorTransaction.h"
+#include "ScopedRenderingResourcesRequest.h"
 #include "WebCoreArgumentCoders.h"
 #include "WebErrors.h"
 #include "WebGPUObjectHeap.h"
@@ -383,16 +384,8 @@
 
 bool GPUConnectionToWebProcess::allowsExitUnderMemoryPressure() const
 {
-    for (auto& remoteRenderingBackend : m_remoteRenderingBackendMap.values()) {
-        if (!remoteRenderingBackend->allowsExitUnderMemoryPressure())
-            return false;
-    }
-#if ENABLE(WEBGL)
-    if (!m_remoteGraphicsContextGLMap.isEmpty())
+    if (hasOutstandingRenderingResourceUsage())
         return false;
-#endif
-    if (!m_remoteMediaPlayerManagerProxy->allowsExitUnderMemoryPressure())
-        return false;
 #if ENABLE(WEB_AUDIO)
     if (m_remoteAudioDestinationManager && !m_remoteAudioDestinationManager->allowsExitUnderMemoryPressure())
         return false;

Modified: trunk/Source/WebKit/GPUProcess/graphics/QualifiedResourceHeap.h (292960 => 292961)


--- trunk/Source/WebKit/GPUProcess/graphics/QualifiedResourceHeap.h	2022-04-18 17:56:11 UTC (rev 292960)
+++ trunk/Source/WebKit/GPUProcess/graphics/QualifiedResourceHeap.h	2022-04-18 18:30:14 UTC (rev 292961)
@@ -108,24 +108,6 @@
         return get<WebCore::Font>(renderingResourceIdentifier);
     }
 
-    bool hasImageBuffer() const
-    {
-        checkInvariants();
-        return m_imageBufferCount;
-    }
-
-    bool hasNativeImage() const
-    {
-        checkInvariants();
-        return m_nativeImageCount;
-    }
-
-    bool hasFont() const
-    {
-        checkInvariants();
-        return m_fontCount;
-    }
-
     bool removeImageBuffer(QualifiedRenderingResourceIdentifier renderingResourceIdentifier)
     {
         return remove<WebCore::ImageBuffer>(renderingResourceIdentifier, m_imageBufferCount);

Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteImageBuffer.h (292960 => 292961)


--- trunk/Source/WebKit/GPUProcess/graphics/RemoteImageBuffer.h	2022-04-18 17:56:11 UTC (rev 292960)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteImageBuffer.h	2022-04-18 18:30:14 UTC (rev 292961)
@@ -62,6 +62,7 @@
         , m_remoteRenderingBackend(remoteRenderingBackend)
         , m_renderingResourceIdentifier(renderingResourceIdentifier)
         , m_remoteDisplayList({ RemoteDisplayListRecorder::create(*this, renderingResourceIdentifier, renderingResourceIdentifier.processIdentifier(), remoteRenderingBackend) })
+        , m_renderingResourcesRequest(ScopedRenderingResourcesRequest::acquire())
     {
         m_remoteRenderingBackend.didCreateImageBufferBackend(m_backend->createBackendHandle(), renderingResourceIdentifier, *m_remoteDisplayList.get());
     }
@@ -88,6 +89,7 @@
     RemoteRenderingBackend& m_remoteRenderingBackend;
     QualifiedRenderingResourceIdentifier m_renderingResourceIdentifier;
     IPC::ScopedActiveMessageReceiveQueue<RemoteDisplayListRecorder> m_remoteDisplayList;
+    ScopedRenderingResourcesRequest m_renderingResourcesRequest;
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp (292960 => 292961)


--- trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp	2022-04-18 17:56:11 UTC (rev 292960)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp	2022-04-18 18:30:14 UTC (rev 292961)
@@ -210,7 +210,6 @@
     }
 
     m_remoteResourceCache.cacheImageBuffer(*imageBuffer, imageBufferResourceIdentifier);
-    updateRenderingResourceRequest();
 }
 
 void RemoteRenderingBackend::getPixelBufferForImageBuffer(RenderingResourceIdentifier imageBuffer, PixelBufferFormat&& destinationFormat, IntRect&& srcRect, CompletionHandler<void()>&& completionHandler)
@@ -401,7 +400,6 @@
     }
     auto success = m_remoteResourceCache.releaseRemoteResource(renderingResourceIdentifier);
     MESSAGE_CHECK(success, "Resource is being released before being cached.");
-    updateRenderingResourceRequest();
 }
 
 static std::optional<ImageBufferBackendHandle> handleFromBuffer(ImageBuffer& buffer)
@@ -527,22 +525,6 @@
     send(Messages::RemoteRenderingBackendProxy::DidFinalizeRenderingUpdate(renderingUpdateID), m_renderingBackendIdentifier);
 }
 
-void RemoteRenderingBackend::updateRenderingResourceRequest()
-{
-    bool hasActiveDrawables = m_remoteResourceCache.hasActiveDrawables();
-    bool hasActiveRequest = m_renderingResourcesRequest.isRequested();
-    if (hasActiveDrawables && !hasActiveRequest)
-        m_renderingResourcesRequest = ScopedRenderingResourcesRequest::acquire();
-    else if (!hasActiveDrawables && hasActiveRequest)
-        m_renderingResourcesRequest = { };
-}
-
-bool RemoteRenderingBackend::allowsExitUnderMemoryPressure() const
-{
-    ASSERT(isMainRunLoop());
-    return !m_remoteResourceCache.hasActiveDrawables();
-}
-
 void RemoteRenderingBackend::performWithMediaPlayerOnMainThread(MediaPlayerIdentifier identifier, Function<void(MediaPlayer&)>&& callback)
 {
     callOnMainRunLoopAndWait([&, gpuConnectionToWebProcess = m_gpuConnectionToWebProcess, identifier] {

Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.h (292960 => 292961)


--- trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.h	2022-04-18 17:56:11 UTC (rev 292960)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.h	2022-04-18 18:30:14 UTC (rev 292961)
@@ -90,8 +90,6 @@
     void didCreateImageBufferBackend(ImageBufferBackendHandle, QualifiedRenderingResourceIdentifier, RemoteDisplayListRecorder&);
     void didFlush(WebCore::GraphicsContextFlushIdentifier, QualifiedRenderingResourceIdentifier);
 
-    bool allowsExitUnderMemoryPressure() const;
-
     // Runs Function in RemoteRenderingBackend task queue.
     void dispatch(Function<void()>&&);
 
@@ -110,7 +108,6 @@
     void startListeningForIPC();
 
     std::optional<SharedMemory::IPCHandle> updateSharedMemoryForGetPixelBufferHelper(size_t byteCount);
-    void updateRenderingResourceRequest();
 
     // IPC::MessageSender.
     IPC::Connection* messageSenderConnection() const override;

Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteResourceCache.h (292960 => 292961)


--- trunk/Source/WebKit/GPUProcess/graphics/RemoteResourceCache.h	2022-04-18 17:56:11 UTC (rev 292960)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteResourceCache.h	2022-04-18 18:30:14 UTC (rev 292961)
@@ -29,12 +29,7 @@
 
 #include "QualifiedRenderingResourceIdentifier.h"
 #include "QualifiedResourceHeap.h"
-#include <WebCore/Font.h>
-#include <WebCore/ImageBuffer.h>
-#include <WebCore/NativeImage.h>
 #include <WebCore/ProcessIdentifier.h>
-#include <WebCore/RenderingResourceIdentifier.h>
-#include <wtf/HashMap.h>
 
 namespace WebKit {
 
@@ -54,10 +49,6 @@
     void deleteAllFonts();
     bool releaseRemoteResource(QualifiedRenderingResourceIdentifier);
 
-    const WebCore::DisplayList::ResourceHeap& resourceHeap() const { return m_resourceHeap; }
-
-    bool hasActiveDrawables() const { return m_resourceHeap.hasImageBuffer() || m_resourceHeap.hasNativeImage(); }
-
 private:
     QualifiedResourceHeap m_resourceHeap;
 };

Modified: trunk/Source/WebKit/GPUProcess/graphics/ScopedRenderingResourcesRequest.h (292960 => 292961)


--- trunk/Source/WebKit/GPUProcess/graphics/ScopedRenderingResourcesRequest.h	2022-04-18 17:56:11 UTC (rev 292960)
+++ trunk/Source/WebKit/GPUProcess/graphics/ScopedRenderingResourcesRequest.h	2022-04-18 18:30:14 UTC (rev 292961)
@@ -74,6 +74,12 @@
     }
     static std::atomic<unsigned> s_requests;
     bool m_requested { false };
+    friend bool hasOutstandingRenderingResourceUsage();
 };
 
+inline bool hasOutstandingRenderingResourceUsage()
+{
+    return ScopedRenderingResourcesRequest::s_requests;
 }
+
+}

Modified: trunk/Source/WebKit/GPUProcess/media/RemoteMediaPlayerManagerProxy.cpp (292960 => 292961)


--- trunk/Source/WebKit/GPUProcess/media/RemoteMediaPlayerManagerProxy.cpp	2022-04-18 17:56:11 UTC (rev 292960)
+++ trunk/Source/WebKit/GPUProcess/media/RemoteMediaPlayerManagerProxy.cpp	2022-04-18 18:30:14 UTC (rev 292961)
@@ -34,6 +34,7 @@
 #include "RemoteMediaPlayerManagerProxyMessages.h"
 #include "RemoteMediaPlayerProxy.h"
 #include "RemoteMediaPlayerProxyConfiguration.h"
+#include "ScopedRenderingResourcesRequest.h"
 #include "WebCoreArgumentCoders.h"
 #include <WebCore/MediaPlayer.h>
 #include <WebCore/MediaPlayerPrivate.h>
@@ -78,7 +79,7 @@
     if (auto proxy = m_proxies.take(identifier))
         proxy->invalidate();
 
-    if (m_gpuConnectionToWebProcess && allowsExitUnderMemoryPressure())
+    if (m_gpuConnectionToWebProcess && !hasOutstandingRenderingResourceUsage())
         m_gpuConnectionToWebProcess->gpuProcess().tryExitIfUnusedAndUnderMemoryPressure();
 }
 
@@ -183,11 +184,6 @@
     return nullptr;
 }
 
-bool RemoteMediaPlayerManagerProxy::allowsExitUnderMemoryPressure() const
-{
-    return m_proxies.isEmpty();
-}
-
 #if !RELEASE_LOG_DISABLED
 Logger& RemoteMediaPlayerManagerProxy::logger()
 {

Modified: trunk/Source/WebKit/GPUProcess/media/RemoteMediaPlayerManagerProxy.h (292960 => 292961)


--- trunk/Source/WebKit/GPUProcess/media/RemoteMediaPlayerManagerProxy.h	2022-04-18 17:56:11 UTC (rev 292960)
+++ trunk/Source/WebKit/GPUProcess/media/RemoteMediaPlayerManagerProxy.h	2022-04-18 18:30:14 UTC (rev 292961)
@@ -66,7 +66,6 @@
     bool didReceiveSyncPlayerMessage(IPC::Connection&, IPC::Decoder&, UniqueRef<IPC::Encoder>&);
 
     RefPtr<WebCore::MediaPlayer> mediaPlayer(const WebCore::MediaPlayerIdentifier&);
-    bool allowsExitUnderMemoryPressure() const;
 
     ShareableBitmap::Handle bitmapImageForCurrentTime(WebCore::MediaPlayerIdentifier);
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to