Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6d171884 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "SF: Fix deadlock during display hotplug" into main

parents 3c6e366c c5995852
Loading
Loading
Loading
Loading
+8 −10
Original line number Diff line number Diff line
@@ -4259,6 +4259,11 @@ void SurfaceFlinger::requestHardwareVsync(PhysicalDisplayId displayId, bool enab
    getHwComposer().setVsyncEnabled(displayId, enable ? hal::Vsync::ENABLE : hal::Vsync::DISABLE);
}

// This callback originates from Scheduler::applyPolicy, whose thread context may be the main thread
// (via Scheduler::chooseRefreshRateForContent) or a OneShotTimer thread. The latter case imposes a
// deadlock prevention rule: If the main thread is processing hotplug, then mStateLock is locked as
// the main thread stops the OneShotTimer and joins with its thread. Hence, the OneShotTimer thread
// must not lock mStateLock in this callback, which would deadlock with the join.
void SurfaceFlinger::requestDisplayModes(std::vector<display::DisplayModeRequest> modeRequests) {
    if (mBootStage != BootStage::FINISHED) {
        ALOGV("Currently in the boot stage, skipping display mode changes");
@@ -4267,21 +4272,14 @@ void SurfaceFlinger::requestDisplayModes(std::vector<display::DisplayModeRequest

    SFTRACE_CALL();

    // If this is called from the main thread mStateLock must be locked before
    // Currently the only way to call this function from the main thread is from
    // Scheduler::chooseRefreshRateForContent

    ConditionalLock lock(mStateLock, std::this_thread::get_id() != mMainThreadId);

    for (auto& request : modeRequests) {
        const auto& modePtr = request.mode.modePtr;

        const auto displayId = modePtr->getPhysicalDisplayId();
        const auto display = getDisplayDeviceLocked(displayId);

        if (!display) continue;
        const auto selectorPtr = mDisplayModeController.selectorPtrFor(displayId);
        if (!selectorPtr) continue;

        if (display->refreshRateSelector().isModeAllowed(request.mode)) {
        if (selectorPtr->isModeAllowed(request.mode)) {
            setDesiredMode(std::move(request));
        } else {
            ALOGV("%s: Mode %d is disallowed for display %s", __func__,
+1 −1
Original line number Diff line number Diff line
@@ -733,7 +733,7 @@ private:
    // Show hdr sdr ratio overlay
    bool mHdrSdrRatioOverlay = false;

    void setDesiredMode(display::DisplayModeRequest&&) REQUIRES(mStateLock);
    void setDesiredMode(display::DisplayModeRequest&&);

    status_t setActiveModeFromBackdoor(const sp<display::DisplayToken>&, DisplayModeId, Fps minFps,
                                       Fps maxFps);