Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 69d4593edf21fe717d6f5355a5279bb1669bbf30
      
https://github.com/WebKit/WebKit/commit/69d4593edf21fe717d6f5355a5279bb1669bbf30
  Author: Jer Noble <[email protected]>
  Date:   2023-04-28 (Fri, 28 Apr 2023)

  Changed paths:
    M Source/WebCore/Modules/mediasource/SourceBuffer.cpp
    M Source/WebCore/page/Settings.yaml
    M Source/WebCore/page/SettingsBase.cpp
    M Source/WebCore/page/SettingsBase.h
    M Source/WebCore/page/cocoa/SettingsBaseCocoa.mm
    M Source/WebCore/platform/graphics/avfoundation/objc/MediaSampleAVFObjC.mm

  Log Message:
  -----------
  [iOS] Long-running MSE video leads to jetsam crash in WebKit.GPU process
https://bugs.webkit.org/show_bug.cgi?id=256113
rdar://108108015

Reviewed by Eric Carlson.

The GPU process has a jetsam limit of 300Mb. If this threshold is crossed (and 
isn't immediately
corrected), the system will kill the GPU process and reclaim the memory. Media 
data sent to the
GPU process for parsing by the WebContent process is sent via a shared memory 
handle, and that
memory is attributed to the WebContent sender, so media data itself doesn't 
cause an increase in
the GPU process's jetsam footprint. However, parsing media data will result in 
the creation of many
individual media samples, and the data structures to contain those samples. 
Over the course of a 50
minute video, this per-sample overhead could account for hundreds of megabytes 
of malloc'd memory.

Tackle this problem in two separate ways:

1) Account for the overhead of individual samples by accounting for that 
overhead in
MediaSampleAVFObjC::sizeInBytes()

This would mean that, e.g., 50k parsed samples which have a ~60Mb overhead 
would count against the
maximumSourceBufferSize limit before either WebKit or the web site would have 
to purge existing samples
before appending more data.

Unfortunately this is not enough, alone, to fix the possibility of jetsam'ing 
the foreground GPU process,
as a highly efficient, low resolution video stream could have a media data cost 
that is less than half
the cost of the sample overhead itself, and even when accounting for the 
per-sample overhead, enough data
could be appended to the SourceBuffer to cause the GPU process to be jetsam'd.

2) Reduce the maximumSourceBufferSize on iOS.

WebKit has an unusually generous maximum SampleBuffer size among other 
browsers. Chrome's is 150M,
Firefox's is 100M, and WebKit's is 304M. We can safely reduce the maximum size 
we allow to be appended
to 100M on iOS.

Between these two changes, it should be very difficult (but not impossible if 
the GPU process has allocated
memory for other reasons) to reach the 300Mb jetsam limit just by appending to 
SourceBuffers alone.

* Source/WebCore/Modules/mediasource/SourceBuffer.cpp:
(WebCore::SourceBuffer::sourceBufferPrivateAppendComplete):
* Source/WebCore/page/Settings.yaml:
* Source/WebCore/page/SettingsBase.cpp:
(WebCore::SettingsBase::defaultMaximumSourceBufferSize):
* Source/WebCore/page/SettingsBase.h:
* Source/WebCore/page/cocoa/SettingsBaseCocoa.mm:
(WebCore::SettingsBase::platformDefaultMediaSourceEnabled):
(WebCore::SettingsBase::defaultMaximumSourceBufferSize):
* Source/WebCore/platform/graphics/avfoundation/objc/MediaSampleAVFObjC.mm:
(WebCore::MediaSampleAVFObjC::sizeInBytes const):

Canonical link: https://commits.webkit.org/263525@main


_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to