From 2b0b2aad244674f10b162670ce56d2d7d7d7cb68 Mon Sep 17 00:00:00 2001 From: walter-bai Date: Thu, 16 Aug 2018 16:41:17 +0800 Subject: [PATCH] Fix a ULT bug. --- media_driver/linux/ult/inc/devconfig.h | 2 -- media_driver/linux/ult/ult_app/cm/cm_test.h | 2 -- .../linux/ult/ult_app/ddi_test_caps.cpp | 2 -- .../linux/ult/ult_app/ddi_test_decode.cpp | 1 - .../linux/ult/ult_app/ddi_test_encode.cpp | 1 - .../linux/ult/ult_app/driver_loader.cpp | 16 +++++++++++++--- media_driver/linux/ult/ult_app/driver_loader.h | 17 +++++++++-------- .../linux/ult/ult_app/memory_leak_detector.cpp | 4 +--- .../linux/ult/ult_app/memory_leak_detector.h | 4 ++-- 9 files changed, 25 insertions(+), 24 deletions(-) diff --git a/media_driver/linux/ult/inc/devconfig.h b/media_driver/linux/ult/inc/devconfig.h index 3638290e165..4fb8b732edc 100644 --- a/media_driver/linux/ult/inc/devconfig.h +++ b/media_driver/linux/ult/inc/devconfig.h @@ -83,6 +83,4 @@ typedef enum igfx_MAX = 4, } Platform_t; -extern const char *g_platformName[]; - #endif // __DEVCONFIG_H__ diff --git a/media_driver/linux/ult/ult_app/cm/cm_test.h b/media_driver/linux/ult/ult_app/cm/cm_test.h index 7c148734560..b6ab1784953 100644 --- a/media_driver/linux/ult/ult_app/cm/cm_test.h +++ b/media_driver/linux/ult/ult_app/cm/cm_test.h @@ -57,8 +57,6 @@ class CmTest: public testing::Test result &= (function_return == expected_return); ReleaseMockDevice(); - - MemoryLeakDetector::Detect(m_driverLoader, platforms[i]); } return result; }//=============== diff --git a/media_driver/linux/ult/ult_app/ddi_test_caps.cpp b/media_driver/linux/ult/ult_app/ddi_test_caps.cpp index a14dfda027c..620ff702569 100644 --- a/media_driver/linux/ult/ult_app/ddi_test_caps.cpp +++ b/media_driver/linux/ult/ult_app/ddi_test_caps.cpp @@ -109,7 +109,5 @@ TEST_F(MediaCapsDdiTest, DecodeEncodeProfile) ret = m_driverLoader.CloseDriver(); EXPECT_EQ (VA_STATUS_SUCCESS , ret) << "Platform = " << g_platformName[platforms[i]] << ", Failed function = m_driverLoader.CloseDriver" << endl; - - MemoryLeakDetector::Detect(m_driverLoader, platforms[i]); } } diff --git a/media_driver/linux/ult/ult_app/ddi_test_decode.cpp b/media_driver/linux/ult/ult_app/ddi_test_decode.cpp index b8ed3eb9c34..1d49040915b 100644 --- a/media_driver/linux/ult/ult_app/ddi_test_decode.cpp +++ b/media_driver/linux/ult/ult_app/ddi_test_decode.cpp @@ -49,7 +49,6 @@ void MediaDecodeDdiTest::ExectueDecodeTest(DecTestData *pDecData) { CmdValidator::GpuCmdsValidationInit(m_GpuCmdFactory, platforms[i]); DecodeExecute(pDecData, platforms[i]); - MemoryLeakDetector::Detect(m_driverLoader, platforms[i]); } } } diff --git a/media_driver/linux/ult/ult_app/ddi_test_encode.cpp b/media_driver/linux/ult/ult_app/ddi_test_encode.cpp index 24043f54206..734421cc156 100644 --- a/media_driver/linux/ult/ult_app/ddi_test_encode.cpp +++ b/media_driver/linux/ult/ult_app/ddi_test_encode.cpp @@ -49,7 +49,6 @@ void MediaEncodeDdiTest::ExectueEncodeTest(EncTestData *pEncData) { CmdValidator::GpuCmdsValidationInit(m_GpuCmdFactory, platforms[i]); EncodeExecute(pEncData, platforms[i]); - MemoryLeakDetector::Detect(m_driverLoader, platforms[i]); } } } diff --git a/media_driver/linux/ult/ult_app/driver_loader.cpp b/media_driver/linux/ult/ult_app/driver_loader.cpp index e1b9e872516..0cf9f98e8b3 100644 --- a/media_driver/linux/ult/ult_app/driver_loader.cpp +++ b/media_driver/linux/ult/ult_app/driver_loader.cpp @@ -25,6 +25,7 @@ #include #include #include "driver_loader.h" +#include "memory_leak_detector.h" using namespace std; @@ -78,21 +79,29 @@ DriverDllLoader::DriverDllLoader(char *path) m_driver_path = path; } -VAStatus DriverDllLoader::CloseDriver() +VAStatus DriverDllLoader::CloseDriver(bool detectMemLeak) { VAStatus vaStatus = m_ctx.vtable->vaTerminate(&m_ctx); + if (detectMemLeak) + { + MemoryLeakDetector::Detect(m_drvSyms.MOS_GetMemNinjaCounter(), + m_drvSyms.MOS_GetMemNinjaCounterGfx(), + m_currentPlatform); + } + m_drvSyms.Clear(); if(m_umdhandle) { dlclose(m_umdhandle); + m_umdhandle = nullptr; } return vaStatus; } -VAStatus DriverDllLoader::InitDriver(int platform_id) +VAStatus DriverDllLoader::InitDriver(Platform_t platform_id) { int drm_fd = platform_id + 1 < 0 ? 1 : platform_id + 1; m_drmstate.fd = drm_fd; @@ -100,6 +109,7 @@ VAStatus DriverDllLoader::InitDriver(int platform_id) m_ctx.vtable = &m_vtable; m_ctx.vtable_vpp = &m_vtable_vpp; m_ctx.drm_state = &m_drmstate; + m_currentPlatform = platform_id; if (LoadDriverSymbols() != VA_STATUS_SUCCESS) { @@ -115,7 +125,7 @@ VAStatus DriverDllLoader::LoadDriverSymbols() const int buf_len = 256; char init_func_s[buf_len] = {}; - m_umdhandle = dlopen(m_driver_path, RTLD_NOW | RTLD_GLOBAL | RTLD_NODELETE); + m_umdhandle = dlopen(m_driver_path, RTLD_NOW | RTLD_GLOBAL); if (!m_umdhandle) { printf("ERROR: dlopen of %s failed.\n", m_driver_path); diff --git a/media_driver/linux/ult/ult_app/driver_loader.h b/media_driver/linux/ult/ult_app/driver_loader.h index 903834db4f0..b6d8f2019ae 100644 --- a/media_driver/linux/ult/ult_app/driver_loader.h +++ b/media_driver/linux/ult/ult_app/driver_loader.h @@ -87,7 +87,7 @@ struct DriverSymbols void Clear() { auto p = (const void **)this; - for (auto i = 0; i < sizeof(this) / sizeof(const void *); i++) + for (auto i = 0; i < sizeof(*this) / sizeof(const void *); i++) { p[i] = nullptr; } @@ -96,7 +96,7 @@ struct DriverSymbols bool Initialized() const { auto p = (const void * const *)this; - for (auto i = 0; i < sizeof(this) / sizeof(const void *); i++) + for (auto i = 0; i < sizeof(*this) / sizeof(const void *); i++) { if (p[i] == nullptr) { @@ -131,9 +131,9 @@ class DriverDllLoader const DriverSymbols &GetDriverSymbols() const { return m_drvSyms; } - VAStatus InitDriver(int platform_id); + VAStatus InitDriver(Platform_t platform_id); - VAStatus CloseDriver(); + VAStatus CloseDriver(bool detectMemLeak = true); public: @@ -147,11 +147,12 @@ class DriverDllLoader private: - const char *m_driver_path; - void *m_umdhandle; - DriverSymbols m_drvSyms; + const char *m_driver_path = nullptr; + void *m_umdhandle = nullptr; + DriverSymbols m_drvSyms = {}; + drm_state m_drmstate = {}; + Platform_t m_currentPlatform = igfxSKLAKE; std::vector m_platformArray; - drm_state m_drmstate; }; #endif // __DRIVER_LOADER_H__ diff --git a/media_driver/linux/ult/ult_app/memory_leak_detector.cpp b/media_driver/linux/ult/ult_app/memory_leak_detector.cpp index 6acdca2696f..0ee86fdc4ff 100644 --- a/media_driver/linux/ult/ult_app/memory_leak_detector.cpp +++ b/media_driver/linux/ult/ult_app/memory_leak_detector.cpp @@ -25,7 +25,7 @@ using namespace std; -void MemoryLeakDetector::Detect(const DriverDllLoader &drvLoader, Platform_t platform) +void MemoryLeakDetector::Detect(int32_t memNinjaCnt, int32_t memNinjaCntGfx, Platform_t platform) { static bool delReport = true; if (delReport) @@ -34,8 +34,6 @@ void MemoryLeakDetector::Detect(const DriverDllLoader &drvLoader, Platform_t pla delReport = false; } - int32_t memNinjaCnt = drvLoader.GetDriverSymbols().MOS_GetMemNinjaCounter(); - int32_t memNinjaCntGfx = drvLoader.GetDriverSymbols().MOS_GetMemNinjaCounterGfx(); if (memNinjaCnt != 0 || memNinjaCntGfx != 0) { const ::testing::TestInfo* curTest = ::testing::UnitTest::GetInstance()->current_test_info(); diff --git a/media_driver/linux/ult/ult_app/memory_leak_detector.h b/media_driver/linux/ult/ult_app/memory_leak_detector.h index b3f983e5d1d..96aae036dbe 100644 --- a/media_driver/linux/ult/ult_app/memory_leak_detector.h +++ b/media_driver/linux/ult/ult_app/memory_leak_detector.h @@ -24,7 +24,7 @@ #include #include -#include "driver_loader.h" +#include "devconfig.h" #define LOG_PATH "./igd_0.log" #define HLT_PATH "./igd_0.hlt" @@ -52,7 +52,7 @@ class MemoryLeakDetector { public: - static void Detect(const DriverDllLoader &drvLoader, Platform_t platform); + static void Detect(int32_t memNinjaCnt, int32_t memNinjaCntGfx, Platform_t platform); }; class MemoryLeakDetectorIpl