Skip to content

Commit 3786b82

Browse files
guodalinMelody Hsu
authored andcommitted
Fix SurfaceFlinger crash caused by layerleak
when add layer more than 4096,surfaceflinger will crash and some log dont finish save Bug: 382620055 Flag: EXEMPT, bug fix Test: manually test Test: create layer more than 4096 Change-Id: Ic6234567520fea06ed5af1b549ccc5b86461fec1 Signed-off-by: guodalin <guodalin@xiaomi.corp-partner.google.com>
1 parent a234a4a commit 3786b82

2 files changed

Lines changed: 41 additions & 27 deletions

File tree

services/surfaceflinger/SurfaceFlinger.cpp

Lines changed: 38 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4605,27 +4605,6 @@ void SurfaceFlinger::invalidateLayerStack(const ui::LayerFilter& layerFilter, co
46054605
status_t SurfaceFlinger::addClientLayer(LayerCreationArgs& args, const sp<IBinder>& handle,
46064606
const sp<Layer>& layer, const wp<Layer>& parent,
46074607
uint32_t* outTransformHint) {
4608-
if (mNumLayers >= MAX_LAYERS) {
4609-
static std::atomic<nsecs_t> lasttime{0};
4610-
nsecs_t now = systemTime();
4611-
if (lasttime != 0 && ns2s(now - lasttime.load()) < 10) {
4612-
ALOGE("AddClientLayer already dumped 10s before");
4613-
return NO_MEMORY;
4614-
} else {
4615-
lasttime = now;
4616-
}
4617-
4618-
ALOGE("AddClientLayer failed, mNumLayers (%zu) >= MAX_LAYERS (%zu)", mNumLayers.load(),
4619-
MAX_LAYERS);
4620-
static_cast<void>(mScheduler->schedule([&]() FTL_FAKE_GUARD(kMainThreadContext) {
4621-
ALOGE("Dumping on-screen layers.");
4622-
mLayerHierarchyBuilder.dumpLayerSample(mLayerHierarchyBuilder.getHierarchy());
4623-
ALOGE("Dumping off-screen layers.");
4624-
mLayerHierarchyBuilder.dumpLayerSample(mLayerHierarchyBuilder.getOffscreenHierarchy());
4625-
}));
4626-
return NO_MEMORY;
4627-
}
4628-
46294608
if (outTransformHint) {
46304609
*outTransformHint = mActiveDisplayTransformHint;
46314610
}
@@ -5408,14 +5387,13 @@ status_t SurfaceFlinger::mirrorDisplay(DisplayId displayId, const LayerCreationA
54085387
mirrorArgs.addToRoot = true;
54095388
mirrorArgs.layerStackToMirror = layerStack;
54105389
result = createEffectLayer(mirrorArgs, &outResult.handle, &rootMirrorLayer);
5390+
if (result != NO_ERROR) {
5391+
return result;
5392+
}
54115393
outResult.layerId = rootMirrorLayer->sequence;
54125394
outResult.layerName = String16(rootMirrorLayer->getDebugName());
5413-
result |= addClientLayer(mirrorArgs, outResult.handle, rootMirrorLayer /* layer */,
5414-
nullptr /* parent */, nullptr /* outTransformHint */);
5415-
}
5416-
5417-
if (result != NO_ERROR) {
5418-
return result;
5395+
addClientLayer(mirrorArgs, outResult.handle, rootMirrorLayer /* layer */,
5396+
nullptr /* parent */, nullptr /* outTransformHint */);
54195397
}
54205398

54215399
setTransactionFlags(eTransactionFlushNeeded);
@@ -5435,6 +5413,9 @@ status_t SurfaceFlinger::createLayer(LayerCreationArgs& args, gui::CreateSurface
54355413
[[fallthrough]];
54365414
case ISurfaceComposerClient::eFXSurfaceEffect: {
54375415
result = createBufferStateLayer(args, &outResult.handle, &layer);
5416+
if (result != NO_ERROR) {
5417+
return result;
5418+
}
54385419
std::atomic<int32_t>* pendingBufferCounter = layer->getPendingBufferCounter();
54395420
if (pendingBufferCounter) {
54405421
std::string counterName = layer->getPendingBufferCounterName();
@@ -5475,18 +5456,48 @@ status_t SurfaceFlinger::createLayer(LayerCreationArgs& args, gui::CreateSurface
54755456

54765457
status_t SurfaceFlinger::createBufferStateLayer(LayerCreationArgs& args, sp<IBinder>* handle,
54775458
sp<Layer>* outLayer) {
5459+
if (checkLayerLeaks() != NO_ERROR) {
5460+
return NO_MEMORY;
5461+
}
54785462
*outLayer = getFactory().createBufferStateLayer(args);
54795463
*handle = (*outLayer)->getHandle();
54805464
return NO_ERROR;
54815465
}
54825466

54835467
status_t SurfaceFlinger::createEffectLayer(const LayerCreationArgs& args, sp<IBinder>* handle,
54845468
sp<Layer>* outLayer) {
5469+
if (checkLayerLeaks() != NO_ERROR) {
5470+
return NO_MEMORY;
5471+
}
54855472
*outLayer = getFactory().createEffectLayer(args);
54865473
*handle = (*outLayer)->getHandle();
54875474
return NO_ERROR;
54885475
}
54895476

5477+
status_t SurfaceFlinger::checkLayerLeaks() {
5478+
if (mNumLayers >= MAX_LAYERS) {
5479+
static std::atomic<nsecs_t> lasttime{0};
5480+
nsecs_t now = systemTime();
5481+
if (lasttime != 0 && ns2s(now - lasttime.load()) < 10) {
5482+
ALOGE("CreateLayer already dumped 10s before");
5483+
return NO_MEMORY;
5484+
} else {
5485+
lasttime = now;
5486+
}
5487+
5488+
ALOGE("CreateLayer failed, mNumLayers (%zu) >= MAX_LAYERS (%zu)", mNumLayers.load(),
5489+
MAX_LAYERS);
5490+
static_cast<void>(mScheduler->schedule([&]() FTL_FAKE_GUARD(kMainThreadContext) {
5491+
ALOGE("Dumping on-screen layers.");
5492+
mLayerHierarchyBuilder.dumpLayerSample(mLayerHierarchyBuilder.getHierarchy());
5493+
ALOGE("Dumping off-screen layers.");
5494+
mLayerHierarchyBuilder.dumpLayerSample(mLayerHierarchyBuilder.getOffscreenHierarchy());
5495+
}));
5496+
return NO_MEMORY;
5497+
}
5498+
return NO_ERROR;
5499+
}
5500+
54905501
void SurfaceFlinger::onHandleDestroyed(sp<Layer>& layer, uint32_t layerId) {
54915502
{
54925503
// Used to remove stalled transactions which uses an internal lock.

services/surfaceflinger/SurfaceFlinger.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -845,6 +845,9 @@ class SurfaceFlinger : public BnSurfaceComposer,
845845
status_t createEffectLayer(const LayerCreationArgs& args, sp<IBinder>* outHandle,
846846
sp<Layer>* outLayer);
847847

848+
// Checks if there are layer leaks before creating layer
849+
status_t checkLayerLeaks();
850+
848851
status_t mirrorLayer(const LayerCreationArgs& args, const sp<IBinder>& mirrorFromHandle,
849852
gui::CreateSurfaceResult& outResult);
850853

0 commit comments

Comments
 (0)