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

Commit 52361b4e authored by Steven Moreland's avatar Steven Moreland
Browse files

gpuservice: prevent hang in destruction

When initialization of bpf programs fail, the threads
here hang for 30s, which is too long to fuzz.

We can stop them, so the fuzzer progresses (and sometimes
hits the 1s timeout), but at least this is better.

Without this patch, on CF, the error that is occurring is:
> Failed to attach bpf program to power/gpu_work_period tracepoint [2(No such file or directory)]

Fixes: 318008019
Test: gpu_service_fuzzer

Change-Id: I0f2dbf911970f3cd5c736a5cd1697accc1e95937
parent 39fb2e6f
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -70,6 +70,9 @@ GpuService::GpuService()
};

GpuService::~GpuService() {
    mGpuMem->stop();
    mGpuWork->stop();

    mGpuWorkAsyncInitThread->join();
    mGpuMemAsyncInitThread->join();
}
+1 −0
Original line number Diff line number Diff line
@@ -61,6 +61,7 @@ void GpuMem::initialize() {
            return;
        }
        // Retry until GPU driver loaded or timeout.
        if (mStop.load()) return;
        sleep(1);
    }

+5 −0
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ public:
    // dumpsys interface
    void dump(const Vector<String16>& args, std::string* result);
    bool isInitialized() { return mInitialized.load(); }
    void stop() { mStop.store(true); }

    // Traverse the gpu memory total map to feed the callback function.
    void traverseGpuMemTotals(const std::function<void(int64_t ts, uint32_t gpuId, uint32_t pid,
@@ -48,6 +49,10 @@ private:

    // indicate whether ebpf has been initialized
    std::atomic<bool> mInitialized = false;

    // whether initialization should be stopped
    std::atomic<bool> mStop = false;

    // bpf map for GPU memory total data
    android::bpf::BpfMapRO<uint64_t, uint64_t> mGpuMemTotalMap;

+1 −0
Original line number Diff line number Diff line
@@ -243,6 +243,7 @@ bool GpuWork::attachTracepoint(const char* programPath, const char* tracepointGr
            return false;
        }
        // Retry until GPU driver loaded or timeout.
        if (mStop.load()) return false;
        sleep(1);
        errno = 0;
    }
+5 −1
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ public:
    ~GpuWork();

    void initialize();
    void stop() { mStop.store(true); }

    // Dumps the GPU work information.
    void dump(const Vector<String16>& args, std::string* result);
@@ -47,7 +48,7 @@ public:
private:
    // Attaches tracepoint |tracepoint_group|/|tracepoint_name| to BPF program at path
    // |program_path|. The tracepoint is also enabled.
    static bool attachTracepoint(const char* program_path, const char* tracepoint_group,
    bool attachTracepoint(const char* program_path, const char* tracepoint_group,
                                 const char* tracepoint_name);

    // Native atom puller callback registered in statsd.
@@ -80,6 +81,9 @@ private:
    // Indicates whether our eBPF components have been initialized.
    std::atomic<bool> mInitialized = false;

    // Indicates whether eBPF initialization should be stopped.
    std::atomic<bool> mStop = false;

    // A thread that periodically checks whether |mGpuWorkMap| is nearly full
    // and, if so, clears it.
    std::thread mMapClearerThread;