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

Commit 3e8f0e6d authored by Pablo Gamito's avatar Pablo Gamito
Browse files

Add origin UID and PID to transactions trace

Test: Integrate with Winscope and retreive origin of transactions in Winscope.
Change-Id: I946bfa761426ab5153f69df4e136ae851867f936
parent b8ae1f2e
Loading
Loading
Loading
Loading
+8 −2
Original line number Original line Diff line number Diff line
@@ -27,6 +27,7 @@ message Transaction {


    required bool   synchronous = 3;
    required bool   synchronous = 3;
    required bool   animation   = 4;
    required bool   animation   = 4;
    optional Origin origin      = 5;
}
}


message SurfaceChange {
message SurfaceChange {
@@ -209,3 +210,8 @@ message DetachChildrenChange {
message ShadowRadiusChange {
message ShadowRadiusChange {
    required float radius = 1;
    required float radius = 1;
}
}

message Origin {
    required int32 pid = 1;
    required int32 uid = 2;
}
 No newline at end of file
+10 −4
Original line number Original line Diff line number Diff line
@@ -3300,7 +3300,8 @@ bool SurfaceFlinger::flushTransactionQueues() {
                                      mPendingInputWindowCommands, transaction.desiredPresentTime,
                                      mPendingInputWindowCommands, transaction.desiredPresentTime,
                                      transaction.buffer, transaction.postTime,
                                      transaction.buffer, transaction.postTime,
                                      transaction.privileged, transaction.hasListenerCallbacks,
                                      transaction.privileged, transaction.hasListenerCallbacks,
                                      transaction.listenerCallbacks, /*isMainThread*/ true);
                                      transaction.listenerCallbacks, /*originPID*/ -1,
                                      /*originUID*/ -1, /*isMainThread*/ true);
                transactionQueue.pop();
                transactionQueue.pop();
                flushedATransaction = true;
                flushedATransaction = true;
            }
            }
@@ -3388,9 +3389,13 @@ void SurfaceFlinger::setTransactionState(
        return;
        return;
    }
    }


    IPCThreadState* ipc = IPCThreadState::self();
    const int originPID = ipc->getCallingPid();
    const int originUID = ipc->getCallingUid();

    applyTransactionState(states, displays, flags, inputWindowCommands, desiredPresentTime,
    applyTransactionState(states, displays, flags, inputWindowCommands, desiredPresentTime,
                          uncacheBuffer, postTime, privileged, hasListenerCallbacks,
                          uncacheBuffer, postTime, privileged, hasListenerCallbacks,
                          listenerCallbacks);
                          listenerCallbacks, originPID, originUID, /*isMainThread*/ false);
}
}


void SurfaceFlinger::applyTransactionState(
void SurfaceFlinger::applyTransactionState(
@@ -3398,7 +3403,7 @@ void SurfaceFlinger::applyTransactionState(
        const InputWindowCommands& inputWindowCommands, const int64_t desiredPresentTime,
        const InputWindowCommands& inputWindowCommands, const int64_t desiredPresentTime,
        const client_cache_t& uncacheBuffer, const int64_t postTime, bool privileged,
        const client_cache_t& uncacheBuffer, const int64_t postTime, bool privileged,
        bool hasListenerCallbacks, const std::vector<ListenerCallbacks>& listenerCallbacks,
        bool hasListenerCallbacks, const std::vector<ListenerCallbacks>& listenerCallbacks,
        bool isMainThread) {
        int originPID, int originUID, bool isMainThread) {
    uint32_t transactionFlags = 0;
    uint32_t transactionFlags = 0;


    if (flags & eAnimation) {
    if (flags & eAnimation) {
@@ -3490,7 +3495,8 @@ void SurfaceFlinger::applyTransactionState(


    if (transactionFlags) {
    if (transactionFlags) {
        if (mInterceptor->isEnabled()) {
        if (mInterceptor->isEnabled()) {
            mInterceptor->saveTransaction(states, mCurrentState.displays, displays, flags);
            mInterceptor->saveTransaction(states, mCurrentState.displays, displays, flags,
                                          originPID, originUID);
        }
        }


        // TODO(b/159125966): Remove eEarlyWakeup completly as no client should use this flag
        // TODO(b/159125966): Remove eEarlyWakeup completly as no client should use this flag
+2 −1
Original line number Original line Diff line number Diff line
@@ -631,7 +631,8 @@ private:
                               const client_cache_t& uncacheBuffer, const int64_t postTime,
                               const client_cache_t& uncacheBuffer, const int64_t postTime,
                               bool privileged, bool hasListenerCallbacks,
                               bool privileged, bool hasListenerCallbacks,
                               const std::vector<ListenerCallbacks>& listenerCallbacks,
                               const std::vector<ListenerCallbacks>& listenerCallbacks,
                               bool isMainThread = false) REQUIRES(mStateLock);
                               int originPID, int originUID, bool isMainThread = false)
            REQUIRES(mStateLock);
    // Returns true if at least one transaction was flushed
    // Returns true if at least one transaction was flushed
    bool flushTransactionQueues();
    bool flushTransactionQueues();
    // Returns true if there is at least one transaction that needs to be flushed
    // Returns true if there is at least one transaction that needs to be flushed
+19 −10
Original line number Original line Diff line number Diff line
@@ -221,6 +221,13 @@ void SurfaceInterceptor::setProtoRectLocked(Rectangle* protoRect, const Rect& re
    protoRect->set_bottom(rect.bottom);
    protoRect->set_bottom(rect.bottom);
}
}


void SurfaceInterceptor::setTransactionOriginLocked(Transaction* transaction, int32_t pid,
                                                    int32_t uid) {
    Origin* origin(transaction->mutable_origin());
    origin->set_pid(pid);
    origin->set_uid(uid);
}

void SurfaceInterceptor::addPositionLocked(Transaction* transaction, int32_t layerId,
void SurfaceInterceptor::addPositionLocked(Transaction* transaction, int32_t layerId,
        float x, float y)
        float x, float y)
{
{
@@ -487,14 +494,16 @@ void SurfaceInterceptor::addDisplayChangesLocked(Transaction* transaction,
    }
    }
}
}


void SurfaceInterceptor::addTransactionLocked(Increment* increment,
void SurfaceInterceptor::addTransactionLocked(
        const Vector<ComposerState>& stateUpdates,
        Increment* increment, const Vector<ComposerState>& stateUpdates,
        const DefaultKeyedVector<wp<IBinder>, DisplayDeviceState>& displays,
        const DefaultKeyedVector<wp<IBinder>, DisplayDeviceState>& displays,
        const Vector<DisplayState>& changedDisplays, uint32_t transactionFlags)
        const Vector<DisplayState>& changedDisplays, uint32_t transactionFlags, int originPID,
{
        int originUID) {
    Transaction* transaction(increment->mutable_transaction());
    Transaction* transaction(increment->mutable_transaction());
    transaction->set_synchronous(transactionFlags & BnSurfaceComposer::eSynchronous);
    transaction->set_synchronous(transactionFlags & BnSurfaceComposer::eSynchronous);
    transaction->set_animation(transactionFlags & BnSurfaceComposer::eAnimation);
    transaction->set_animation(transactionFlags & BnSurfaceComposer::eAnimation);
    setTransactionOriginLocked(transaction, originPID, originUID);

    for (const auto& compState: stateUpdates) {
    for (const auto& compState: stateUpdates) {
        addSurfaceChangesLocked(transaction, compState.state);
        addSurfaceChangesLocked(transaction, compState.state);
    }
    }
@@ -613,17 +622,17 @@ void SurfaceInterceptor::addPowerModeUpdateLocked(Increment* increment, int32_t
    powerModeUpdate->set_mode(mode);
    powerModeUpdate->set_mode(mode);
}
}


void SurfaceInterceptor::saveTransaction(const Vector<ComposerState>& stateUpdates,
void SurfaceInterceptor::saveTransaction(
        const Vector<ComposerState>& stateUpdates,
        const DefaultKeyedVector<wp<IBinder>, DisplayDeviceState>& displays,
        const DefaultKeyedVector<wp<IBinder>, DisplayDeviceState>& displays,
        const Vector<DisplayState>& changedDisplays, uint32_t flags)
        const Vector<DisplayState>& changedDisplays, uint32_t flags, int originPID, int originUID) {
{
    if (!mEnabled || (stateUpdates.size() <= 0 && changedDisplays.size() <= 0)) {
    if (!mEnabled || (stateUpdates.size() <= 0 && changedDisplays.size() <= 0)) {
        return;
        return;
    }
    }
    ATRACE_CALL();
    ATRACE_CALL();
    std::lock_guard<std::mutex> protoGuard(mTraceMutex);
    std::lock_guard<std::mutex> protoGuard(mTraceMutex);
    addTransactionLocked(createTraceIncrementLocked(), stateUpdates, displays, changedDisplays,
    addTransactionLocked(createTraceIncrementLocked(), stateUpdates, displays, changedDisplays,
            flags);
                         flags, originPID, originUID);
}
}


void SurfaceInterceptor::saveSurfaceCreation(const sp<const Layer>& layer) {
void SurfaceInterceptor::saveSurfaceCreation(const sp<const Layer>& layer) {
+9 −4
Original line number Original line Diff line number Diff line
@@ -62,7 +62,8 @@ public:
    virtual void saveTransaction(
    virtual void saveTransaction(
            const Vector<ComposerState>& stateUpdates,
            const Vector<ComposerState>& stateUpdates,
            const DefaultKeyedVector<wp<IBinder>, DisplayDeviceState>& displays,
            const DefaultKeyedVector<wp<IBinder>, DisplayDeviceState>& displays,
            const Vector<DisplayState>& changedDisplays, uint32_t flags) = 0;
            const Vector<DisplayState>& changedDisplays, uint32_t flags, int originPID,
            int originUID) = 0;


    // Intercept surface data
    // Intercept surface data
    virtual void saveSurfaceCreation(const sp<const Layer>& layer) = 0;
    virtual void saveSurfaceCreation(const sp<const Layer>& layer) = 0;
@@ -97,7 +98,8 @@ public:
    // Intercept display and surface transactions
    // Intercept display and surface transactions
    void saveTransaction(const Vector<ComposerState>& stateUpdates,
    void saveTransaction(const Vector<ComposerState>& stateUpdates,
                         const DefaultKeyedVector<wp<IBinder>, DisplayDeviceState>& displays,
                         const DefaultKeyedVector<wp<IBinder>, DisplayDeviceState>& displays,
                         const Vector<DisplayState>& changedDisplays, uint32_t flags) override;
                         const Vector<DisplayState>& changedDisplays, uint32_t flags, int originPID,
                         int originUID) override;


    // Intercept surface data
    // Intercept surface data
    void saveSurfaceCreation(const sp<const Layer>& layer) override;
    void saveSurfaceCreation(const sp<const Layer>& layer) override;
@@ -161,7 +163,8 @@ private:
    void addSurfaceChangesLocked(Transaction* transaction, const layer_state_t& state);
    void addSurfaceChangesLocked(Transaction* transaction, const layer_state_t& state);
    void addTransactionLocked(Increment* increment, const Vector<ComposerState>& stateUpdates,
    void addTransactionLocked(Increment* increment, const Vector<ComposerState>& stateUpdates,
                              const DefaultKeyedVector<wp<IBinder>, DisplayDeviceState>& displays,
                              const DefaultKeyedVector<wp<IBinder>, DisplayDeviceState>& displays,
            const Vector<DisplayState>& changedDisplays, uint32_t transactionFlags);
                              const Vector<DisplayState>& changedDisplays,
                              uint32_t transactionFlags, int originPID, int originUID);
    void addReparentLocked(Transaction* transaction, int32_t layerId, int32_t parentId);
    void addReparentLocked(Transaction* transaction, int32_t layerId, int32_t parentId);
    void addReparentChildrenLocked(Transaction* transaction, int32_t layerId, int32_t parentId);
    void addReparentChildrenLocked(Transaction* transaction, int32_t layerId, int32_t parentId);
    void addDetachChildrenLocked(Transaction* transaction, int32_t layerId, bool detached);
    void addDetachChildrenLocked(Transaction* transaction, int32_t layerId, bool detached);
@@ -182,6 +185,8 @@ private:
    void addDisplayChangesLocked(Transaction* transaction,
    void addDisplayChangesLocked(Transaction* transaction,
            const DisplayState& state, int32_t sequenceId);
            const DisplayState& state, int32_t sequenceId);


    // Add transaction origin to trace
    void setTransactionOriginLocked(Transaction* transaction, int32_t pid, int32_t uid);


    bool mEnabled {false};
    bool mEnabled {false};
    std::string mOutputFileName {DEFAULT_FILENAME};
    std::string mOutputFileName {DEFAULT_FILENAME};
Loading