diff options
author | Treehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com> | 2024-05-02 22:49:52 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2024-05-02 22:49:52 +0000 |
commit | 0dbe6326a7eeade8351086224bb01e52404e3a89 (patch) | |
tree | 2c08997f0d521e90f6b5104336a06b4c9a34e74b | |
parent | 856ff4c9b7a7abbb2c294c36c8b4cf9902d814b2 (diff) | |
parent | 52361b4e320af7dc7ae024a32a2712d587c99cf4 (diff) | |
download | native-0dbe6326a7eeade8351086224bb01e52404e3a89.tar.gz |
Merge "gpuservice: prevent hang in destruction" into main
-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 48d793a4d4..080e62b164 100644 --- a/services/gpuservice/GpuService.cpp +++ b/services/gpuservice/GpuService.cpp @@ -70,6 +70,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; |