summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Ho <willho@google.com>2022-09-01 10:32:43 -0700
committerWilliam Ho <willho@google.com>2022-09-01 16:05:54 -0700
commitacc74ab628a9762f12ba983a7c81f0a7a0f6122b (patch)
tree20f2527785422375de15269c15f80d80cfc3d90e
parentb687b304f60271c0a9ca01c50e5868c220ea9b51 (diff)
downloadgfxstream-protocols-acc74ab628a9762f12ba983a7c81f0a7a0f6122b.tar.gz
Add monitor to seqno loop
Test: Generate code Bug: 241807219 Change-Id: Ie81e617ea9a4f1ec797bbc471781c8fd09ad8a2d
-rw-r--r--registry/vulkan/scripts/cereal/decoder.py51
-rw-r--r--registry/vulkan/scripts/cereal/decodersnapshot.py14
-rw-r--r--registry/vulkan/scripts/cerealgenerator.py19
3 files changed, 60 insertions, 24 deletions
diff --git a/registry/vulkan/scripts/cereal/decoder.py b/registry/vulkan/scripts/cereal/decoder.py
index 0a998ad7..720db6c0 100644
--- a/registry/vulkan/scripts/cereal/decoder.py
+++ b/registry/vulkan/scripts/cereal/decoder.py
@@ -32,7 +32,8 @@ public:
VkDecoder();
~VkDecoder();
void setForSnapshotLoad(bool forSnapshotLoad);
- size_t decode(void* buf, size_t bufsize, IOStream* stream, uint32_t* seqnoPtr, emugl::GfxApiLogger& gfx_logger);
+ size_t decode(void* buf, size_t bufsize, IOStream* stream, uint32_t* seqnoPtr,
+ emugl::GfxApiLogger& gfx_logger, emugl::HealthMonitor<>& healthMonitor);
private:
class Impl;
std::unique_ptr<Impl> mImpl;
@@ -42,6 +43,8 @@ private:
decoder_impl_preamble ="""
using emugl::vkDispatch;
using emugl::GfxApiLogger;
+using emugl::HealthMonitor;
+using emugl::HealthWatchdog;
using namespace goldfish_vk;
@@ -62,7 +65,8 @@ public:
m_forSnapshotLoad = forSnapshotLoad;
}
- size_t decode(void* buf, size_t bufsize, IOStream* stream, uint32_t* seqnoPtr, GfxApiLogger& gfx_logger);
+ size_t decode(void* buf, size_t bufsize, IOStream* stream, uint32_t* seqnoPtr,
+ GfxApiLogger& gfx_logger, HealthMonitor<>& healthMonitor);
private:
bool m_logCalls;
@@ -88,8 +92,9 @@ void VkDecoder::setForSnapshotLoad(bool forSnapshotLoad) {
mImpl->setForSnapshotLoad(forSnapshotLoad);
}
-size_t VkDecoder::decode(void* buf, size_t bufsize, IOStream* stream, uint32_t* seqnoPtr, GfxApiLogger& gfx_logger) {
- return mImpl->decode(buf, bufsize, stream, seqnoPtr, gfx_logger);
+size_t VkDecoder::decode(void* buf, size_t bufsize, IOStream* stream, uint32_t* seqnoPtr,
+ GfxApiLogger& gfx_logger, HealthMonitor<>& healthMonitor) {
+ return mImpl->decode(buf, bufsize, stream, seqnoPtr, gfx_logger, healthMonitor);
}
// VkDecoder::Impl::decode to follow
@@ -719,7 +724,10 @@ class VulkanDecoder(VulkanWrapperGenerator):
self.module.appendImpl(decoder_impl_preamble)
self.module.appendImpl(
- "size_t VkDecoder::Impl::decode(void* buf, size_t len, IOStream* ioStream, uint32_t* seqnoPtr, GfxApiLogger& gfx_logger)\n")
+ """
+size_t VkDecoder::Impl::decode(void* buf, size_t len, IOStream* ioStream, uint32_t* seqnoPtr,
+ GfxApiLogger& gfx_logger, HealthMonitor<>& healthMonitor)
+""")
self.cgen.beginBlock() # function body
@@ -751,12 +759,33 @@ class VulkanDecoder(VulkanWrapperGenerator):
if (queueSubmitWithCommandsEnabled && ((opcode >= OP_vkFirst && opcode < OP_vkLast) || (opcode >= OP_vkFirst_old && opcode < OP_vkLast_old))) {
uint32_t seqno; memcpy(&seqno, *readStreamPtrPtr, sizeof(uint32_t)); *readStreamPtrPtr += sizeof(uint32_t);
if (seqnoPtr && !m_forSnapshotLoad) {
- while ((seqno - __atomic_load_n(seqnoPtr, __ATOMIC_SEQ_CST) != 1)) {
- #if (defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)))
- _mm_pause();
- #elif (defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)))
- __asm__ __volatile__("pause;");
- #endif
+ {
+ HealthWatchdog watchdog(
+ healthMonitor,
+ WATCHDOG_DATA("RenderThread seqno loop - 3 second timeout",
+ EventHangMetadata::HangType::kRenderThread, nullptr),
+ /* Data gathered if this hangs*/
+ std::function<std::unique_ptr<EventHangMetadata::HangAnnotations>()>([=](){
+ std::unique_ptr<EventHangMetadata::HangAnnotations> annotations =
+ std::make_unique<EventHangMetadata::HangAnnotations>();
+ annotations->insert(
+ {
+ {"seqno", std::to_string(seqno)},
+ {"seqnoPtr", std::to_string(__atomic_load_n(seqnoPtr, __ATOMIC_SEQ_CST))},
+ {"opcode", std::to_string(opcode)},
+ {"buffer_length", std::to_string(len)}
+ }
+ );
+ return std::move(annotations);
+ }),
+ 3000 /* 3 seconds. Should be plenty*/);
+ while ((seqno - __atomic_load_n(seqnoPtr, __ATOMIC_SEQ_CST) != 1)) {
+ #if (defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)))
+ _mm_pause();
+ #elif (defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)))
+ __asm__ __volatile__("pause;");
+ #endif
+ }
}
}
}
diff --git a/registry/vulkan/scripts/cereal/decodersnapshot.py b/registry/vulkan/scripts/cereal/decodersnapshot.py
index 308c1cd6..551719c9 100644
--- a/registry/vulkan/scripts/cereal/decodersnapshot.py
+++ b/registry/vulkan/scripts/cereal/decodersnapshot.py
@@ -25,7 +25,8 @@ public:
~VkDecoderSnapshot();
void save(android::base::Stream* stream);
- void load(android::base::Stream* stream, emugl::GfxApiLogger& gfx_logger);
+ void load(android::base::Stream* stream, emugl::GfxApiLogger& gfx_logger,
+ emugl::HealthMonitor<>& healthMonitor);
"""
decoder_snapshot_decl_postamble = """
@@ -40,6 +41,7 @@ decoder_snapshot_impl_preamble ="""
using namespace goldfish_vk;
using emugl::GfxApiLogger;
+using emugl::HealthMonitor;
class VkDecoderSnapshot::Impl {
public:
@@ -49,8 +51,9 @@ public:
mReconstruction.save(stream);
}
- void load(android::base::Stream* stream, GfxApiLogger& gfx_logger) {
- mReconstruction.load(stream, gfx_logger);
+ void load(android::base::Stream* stream, GfxApiLogger& gfx_logger,
+ HealthMonitor<>& healthMonitor) {
+ mReconstruction.load(stream, gfx_logger, healthMonitor);
}
"""
@@ -68,8 +71,9 @@ void VkDecoderSnapshot::save(android::base::Stream* stream) {
mImpl->save(stream);
}
-void VkDecoderSnapshot::load(android::base::Stream* stream, GfxApiLogger& gfx_logger) {
- mImpl->load(stream, gfx_logger);
+void VkDecoderSnapshot::load(android::base::Stream* stream, GfxApiLogger& gfx_logger,
+ HealthMonitor<>& healthMonitor) {
+ mImpl->load(stream, gfx_logger, healthMonitor);
}
VkDecoderSnapshot::~VkDecoderSnapshot() = default;
diff --git a/registry/vulkan/scripts/cerealgenerator.py b/registry/vulkan/scripts/cerealgenerator.py
index 353fc9ad..dc250756 100644
--- a/registry/vulkan/scripts/cerealgenerator.py
+++ b/registry/vulkan/scripts/cerealgenerator.py
@@ -345,9 +345,10 @@ using DlSymFunc = void* (void*, const char*);
#include <string.h>
"""
- decoderSnapshotHeaderIncludes = """
+ decoderSnapshotHeaderIncludes = f"""
#include <memory>
-#include "base/GfxApiLogger.h"
+#include "{self.baseLibDirPrefix}/GfxApiLogger.h"
+#include "{self.baseLibDirPrefix}/HealthMonitor.h"
#include "common/goldfish_vk_private_defs.h"
"""
decoderSnapshotImplIncludes = f"""
@@ -358,16 +359,17 @@ using DlSymFunc = void* (void*, const char*);
#include "{self.baseLibDirPrefix}/Lock.h"
"""
- decoderHeaderIncludes = """
-#include "base/GfxApiLogger.h"
+ decoderHeaderIncludes = f"""
+#include "{self.baseLibDirPrefix}/GfxApiLogger.h"
+#include "{self.baseLibDirPrefix}/HealthMonitor.h"
#include <memory>
-namespace android {
-namespace base {
+namespace android {{
+namespace base {{
class BumpPool;
-} // namespace android
-} // namespace base
+}} // namespace android
+}} // namespace base
"""
@@ -392,6 +394,7 @@ class BumpPool;
#include "%s.h"
#include <unordered_map>
+#include <functional>
""" % VULKAN_STREAM_TYPE
gfxstreamstructuretypePreamble = """