- 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);