diff options
author | 2024-05-02 23:22:57 +0000 | |
---|---|---|
committer | 2024-05-02 23:22:57 +0000 | |
commit | 9a1f2adb3518c667e705b96e81dd591821fdbc0b (patch) | |
tree | 95b78fe5fb7091270e0edc5a9f9c284a2e25bcb1 | |
parent | 1c61140e6cc7046292508fd992c730e48b98807d (diff) | |
parent | c8a3e9ae89437d3bbb9b7bcf440cf93c80a6f2aa (diff) |
Merge "gpuservice: prevent hang in destruction" into main am: 0dbe6326a7 am: c8a3e9ae89
Original change: https://android-review.googlesource.com/c/platform/frameworks/native/+/3062996
Change-Id: I96b19a63f43dfdb62df806f42aa79c7fd129ff91
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r-- | services/gpuservice/GpuService.cpp | 3 | ||||
-rw-r--r-- | services/gpuservice/gpumem/GpuMem.cpp | 1 | ||||
-rw-r--r-- | services/gpuservice/gpumem/include/gpumem/GpuMem.h | 5 | ||||
-rw-r--r-- | services/gpuservice/gpuwork/GpuWork.cpp | 1 | ||||
-rw-r--r-- | services/gpuservice/gpuwork/include/gpuwork/GpuWork.h | 6 |
5 files changed, 15 insertions, 1 deletions
diff --git a/services/gpuservice/GpuService.cpp b/services/gpuservice/GpuService.cpp index 79f22c1ac7..a481c628aa 100644 --- a/services/gpuservice/GpuService.cpp +++ b/services/gpuservice/GpuService.cpp @@ -72,6 +72,9 @@ GpuService::GpuService() }; GpuService::~GpuService() { + mGpuMem->stop(); + mGpuWork->stop(); + mGpuWorkAsyncInitThread->join(); mGpuMemAsyncInitThread->join(); } diff --git a/services/gpuservice/gpumem/GpuMem.cpp b/services/gpuservice/gpumem/GpuMem.cpp index 141fe021ee..d0783df109 100644 --- a/services/gpuservice/gpumem/GpuMem.cpp +++ b/services/gpuservice/gpumem/GpuMem.cpp @@ -61,6 +61,7 @@ void GpuMem::initialize() { return; } // Retry until GPU driver loaded or timeout. + if (mStop.load()) return; sleep(1); } diff --git a/services/gpuservice/gpumem/include/gpumem/GpuMem.h b/services/gpuservice/gpumem/include/gpumem/GpuMem.h index 9aa74d6863..16b201f516 100644 --- a/services/gpuservice/gpumem/include/gpumem/GpuMem.h +++ b/services/gpuservice/gpumem/include/gpumem/GpuMem.h @@ -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; diff --git a/services/gpuservice/gpuwork/GpuWork.cpp b/services/gpuservice/gpuwork/GpuWork.cpp index fd703239e9..1a744abc6d 100644 --- a/services/gpuservice/gpuwork/GpuWork.cpp +++ b/services/gpuservice/gpuwork/GpuWork.cpp @@ -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; } diff --git a/services/gpuservice/gpuwork/include/gpuwork/GpuWork.h b/services/gpuservice/gpuwork/include/gpuwork/GpuWork.h index cece9999c6..e70da540b9 100644 --- a/services/gpuservice/gpuwork/include/gpuwork/GpuWork.h +++ b/services/gpuservice/gpuwork/include/gpuwork/GpuWork.h @@ -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; |