Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: e4fcb9c6b04bedb7d92df0b301198c9ab601562b
https://github.com/WebKit/WebKit/commit/e4fcb9c6b04bedb7d92df0b301198c9ab601562b
Author: Chris Dumez <[email protected]>
Date: 2023-10-11 (Wed, 11 Oct 2023)
Changed paths:
M Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp
M Source/WebKit/GPUProcess/GPUConnectionToWebProcess.h
M Source/WebKit/GPUProcess/GPUProcess.cpp
M Source/WebKit/GPUProcess/GPUProcess.h
M Source/WebKit/GPUProcess/GPUProcess.messages.in
M Source/WebKit/Shared/GPUProcessConnectionParameters.h
M Source/WebKit/Shared/GPUProcessConnectionParameters.serialization.in
M Source/WebKit/Shared/GPUProcessPreferencesForWebProcess.h
M Source/WebKit/Shared/GPUProcessPreferencesForWebProcess.serialization.in
M Source/WebKit/UIProcess/API/APIPageConfiguration.cpp
M Source/WebKit/UIProcess/API/APIPageConfiguration.h
M Source/WebKit/UIProcess/GPU/GPUProcessProxy.cpp
M Source/WebKit/UIProcess/GPU/GPUProcessProxy.h
M Source/WebKit/UIProcess/RemotePageProxy.h
M Source/WebKit/UIProcess/SuspendedPageProxy.cpp
M Source/WebKit/UIProcess/SuspendedPageProxy.h
M Source/WebKit/UIProcess/WebPageProxy.cpp
M Source/WebKit/UIProcess/WebPageProxy.h
M Source/WebKit/UIProcess/WebProcessCache.cpp
M Source/WebKit/UIProcess/WebProcessCache.h
M Source/WebKit/UIProcess/WebProcessPool.cpp
M Source/WebKit/UIProcess/WebProcessPool.h
M Source/WebKit/UIProcess/WebProcessProxy.cpp
M Source/WebKit/UIProcess/WebProcessProxy.h
M Source/WebKit/WebProcess/GPU/GPUProcessConnection.cpp
M Source/WebKit/WebProcess/WebProcess.h
Log Message:
-----------
Regression(267014@main) Flaky crash under
WebKit::GPUConnectionToWebProcess::didReceiveMessage()
https://bugs.webkit.org/show_bug.cgi?id=262981
rdar://114245301
Reviewed by Simon Fraser.
In 267014@main, we added support for [EnabledIf=Setting] in our IPC messages.in
files and
started using it for a few IPC messages. Since then we've had flaky crashes on
the bots
inside GPUConnectionToWebProcess::didReceiveMessage() because these IPC
messages are
sometimes not handled.
The issue is that the checks were racy. The GPUProcess would for example
receive the
CreateRemoteGPU IPC and check the `isWebGPUEnabled()` setting. If the setting
is disabled,
it would refuse to handle the IPC message and we would crash in debug.
The reason this is racy is that the tests keep enabling / disabling these
settings. These
settings are propagated via asynchronous IPC from the UIProcess to the
GPUProcess. However,
the IPCs that check for those settings in the GPUProcess are coming from the
WebProcess,
not the UIProcess. As a result, it is possible for this to happen:
1. A page gets created with WebGPU enabled
2. The UIProcess sends an async IPC to the GPUProcess to let it know WebGPU is
now enabled
3. The WebProcess starts using WebGPU and sends a WebGPU-related IPC to the
GPUProcess
4. The GPUProcess receives the WebGPU-related IPC from the WebProcess
5. The GPUProcess receives the IPC from the UIProcess to let it know WebGPU is
now enabled
Note that the IPC from the UIProcess (step 5) can get received too late, since
there is
no synchronization. The same issue occurs if a page goes away and a setting
gets turned
off as a result.
To address the issue, this patch makes it so that the
GPUProcessPreferencesForWebProcess
no longer change for a particular WebProcess. This means that if a new page
gets created
with different GPUProcess preferences, it will now use a separate WebProcess.
Because the
GPUProcess preferences for a particular WebProcess no longer change, there is
no race
anymore. When the WebProcess requests a connection to the GPUProcess, it goes
via the
UIProcess (synchronously), which sends an IPC to the GPUProcess to create the
connection.
The GPUProcessPreferencesForWebProcess are passed with this IPC so that the
GPUProcess has
those preferences before receiving any other IPC from the WebProcess.
* Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp:
* Source/WebKit/GPUProcess/GPUConnectionToWebProcess.h:
(WebKit::GPUConnectionToWebProcess::allowTestOnlyIPC const):
(WebKit::GPUConnectionToWebProcess::updatePreferences): Deleted.
* Source/WebKit/GPUProcess/GPUProcess.cpp:
(WebKit::GPUProcess::updatePreferencesForWebProcess): Deleted.
* Source/WebKit/GPUProcess/GPUProcess.h:
* Source/WebKit/GPUProcess/GPUProcess.messages.in:
* Source/WebKit/Shared/GPUProcessConnectionParameters.h:
* Source/WebKit/Shared/GPUProcessConnectionParameters.serialization.in:
* Source/WebKit/Shared/GPUProcessPreferencesForWebProcess.h:
* Source/WebKit/Shared/GPUProcessPreferencesForWebProcess.serialization.in:
* Source/WebKit/UIProcess/API/APIPageConfiguration.cpp:
(API::PageConfiguration::preferencesForGPUProcess const):
* Source/WebKit/UIProcess/API/APIPageConfiguration.h:
* Source/WebKit/UIProcess/GPU/GPUProcessProxy.cpp:
(WebKit::GPUProcessProxy::updatePreferencesForWebProcess): Deleted.
* Source/WebKit/UIProcess/GPU/GPUProcessProxy.h:
* Source/WebKit/UIProcess/RemotePageProxy.h:
(WebKit::RemotePageProxy::page const):
* Source/WebKit/UIProcess/SuspendedPageProxy.cpp:
(WebKit::SuspendedPageProxy::findReusableSuspendedPageProcess):
* Source/WebKit/UIProcess/SuspendedPageProxy.h:
* Source/WebKit/UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::hasSameGPUProcessPreferencesAs const):
(WebKit::WebPageProxy::launchProcess):
(WebKit::WebPageProxy::preferencesForGPUProcess const):
(WebKit::WebPageProxy::triggerBrowsingContextGroupSwitchForNavigation):
* Source/WebKit/UIProcess/WebPageProxy.h:
* Source/WebKit/UIProcess/WebProcessCache.cpp:
(WebKit::WebProcessCache::takeProcess):
* Source/WebKit/UIProcess/WebProcessCache.h:
* Source/WebKit/UIProcess/WebProcessPool.cpp:
(WebKit::WebProcessPool::createGPUProcessConnection):
(WebKit::WebProcessPool::processForRegistrableDomain):
(WebKit::WebProcessPool::createWebPage):
(WebKit::WebProcessPool::processForNavigationInternal):
* Source/WebKit/UIProcess/WebProcessPool.h:
* Source/WebKit/UIProcess/WebProcessProxy.cpp:
(WebKit::WebProcessProxy::initializePreferencesForGPUProcess):
(WebKit::WebProcessProxy::addProvisionalPageProxy):
(WebKit::WebProcessProxy::addRemotePageProxy):
(WebKit::WebProcessProxy::addExistingWebPage):
(WebKit::WebProcessProxy::removeWebPage):
(WebKit::WebProcessProxy::createGPUProcessConnection):
(WebKit::WebProcessProxy::computePreferencesForGPUProcess const): Deleted.
(WebKit::WebProcessProxy::updatePreferencesForGPUProcess): Deleted.
* Source/WebKit/UIProcess/WebProcessProxy.h:
(WebKit::WebProcessProxy::preferencesForGPUProcess const):
* Source/WebKit/WebProcess/GPU/GPUProcessConnection.cpp:
(WebKit::GPUProcessConnection::create):
* Source/WebKit/WebProcess/WebProcess.h:
(WebKit::WebProcess::hasWebPages const):
Canonical link: https://commits.webkit.org/269209@main
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes