From fe7cbccdfa3bc5226bc152ec97aa329208d71781 Mon Sep 17 00:00:00 2001 From: gobhardw Date: Tue, 25 Apr 2023 12:12:43 +0530 Subject: [PATCH] SWDEV-388249: Memory leak fix Change-Id: I68c62ee42e6d37fb85a1a8aa0d7a2cbda6431a8b [ROCm/rocprofiler commit: 40bfdcade09f100195868823b2dd090b19cb325b] --- projects/rocprofiler/plugin/file/file.cpp | 6 +++-- .../src/core/session/tracer/src/roctracer.cpp | 23 +++++++++++-------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/projects/rocprofiler/plugin/file/file.cpp b/projects/rocprofiler/plugin/file/file.cpp index 221ebbb630..711d779163 100644 --- a/projects/rocprofiler/plugin/file/file.cpp +++ b/projects/rocprofiler/plugin/file/file.cpp @@ -323,9 +323,8 @@ class file_plugin_t { profiler_record->kernel_id, &name_length)); // Taken from rocprofiler: The size hasn't changed in recent past static const uint32_t lds_block_size = 128 * 4; - const char* kernel_name_c; + const char* kernel_name_c = nullptr; if (name_length > 1) { - kernel_name_c = static_cast(malloc(name_length * sizeof(char))); CHECK_ROCPROFILER(rocprofiler_query_kernel_info(ROCPROFILER_KERNEL_NAME, profiler_record->kernel_id, &kernel_name_c)); } @@ -390,6 +389,9 @@ class file_plugin_t { } } } + if (kernel_name_c) { + free(const_cast(kernel_name_c)); + } } void FlushPCSamplingRecord(const rocprofiler_record_pc_sample_t* pc_sampling_record) { diff --git a/projects/rocprofiler/src/core/session/tracer/src/roctracer.cpp b/projects/rocprofiler/src/core/session/tracer/src/roctracer.cpp index 961dde636d..3bb8ea48fa 100644 --- a/projects/rocprofiler/src/core/session/tracer/src/roctracer.cpp +++ b/projects/rocprofiler/src/core/session/tracer/src/roctracer.cpp @@ -256,7 +256,7 @@ template struct ApiTracer { assert(trace_data != nullptr); rocprofiler_record_tracer_t record{}; record.header = rocprofiler_record_header_t{ROCPROFILER_TRACER_RECORD, - rocprofiler_record_id_t{record_id}}; + rocprofiler_record_id_t{record_id}}; record.domain = domain; record.operation_id = rocprofiler_tracer_operation_id_t{operation_id}; record.correlation_id = @@ -270,9 +270,10 @@ template struct ApiTracer { if (auto external_id = ExternalCorrelationId()) { rocprofiler_record_tracer_t ext_record{}; ext_record.header = rocprofiler_record_header_t{ROCPROFILER_TRACER_RECORD, - rocprofiler_record_id_t{record_id}}; + rocprofiler_record_id_t{record_id}}; ext_record.domain = ACTIVITY_DOMAIN_EXT_API; - ext_record.operation_id = rocprofiler_tracer_operation_id_t{ACTIVITY_EXT_OP_EXTERN_ID}; + ext_record.operation_id = + rocprofiler_tracer_operation_id_t{ACTIVITY_EXT_OP_EXTERN_ID}; ext_record.correlation_id = rocprofiler_tracer_activity_correlation_id_t{record.correlation_id}; ext_record.external_id = rocprofiler_tracer_external_id_t{*external_id}; @@ -389,8 +390,8 @@ int TracerCallback(activity_domain_t domain, uint32_t operation_id, void* data) ->GetBufferLock()); record_id = rocmtools::GetROCMToolObj()->GetUniqueRecordId(); rocprofiler_record_tracer_t rocprofiler_record{}; - rocprofiler_record.header = rocprofiler_record_header_t{ROCPROFILER_TRACER_RECORD, - rocprofiler_record_id_t{record_id}}; + rocprofiler_record.header = rocprofiler_record_header_t{ + ROCPROFILER_TRACER_RECORD, rocprofiler_record_id_t{record_id}}; rocprofiler_record.domain = domain; rocprofiler_record.external_id = rocprofiler_tracer_external_id_t{}; rocprofiler_record.operation_id = rocprofiler_tracer_operation_id_t{record->kind}; @@ -413,8 +414,10 @@ int TracerCallback(activity_domain_t domain, uint32_t operation_id, void* data) ->AddRecord(rocprofiler_record, rocprofiler_record.api_data_handle.handle, rocprofiler_record.api_data_handle.size, [initial_handle](auto& rocprofiler_record, const void* data) { - if (rocprofiler_record.api_data_handle.handle==initial_handle) + if (rocprofiler_record.api_data_handle.handle == initial_handle && + data != initial_handle) { free(initial_handle); + } rocprofiler_record.api_data_handle.handle = static_cast(data); }); @@ -455,8 +458,8 @@ int TracerCallback(activity_domain_t domain, uint32_t operation_id, void* data) ->GetBufferLock()); record_id = rocmtools::GetROCMToolObj()->GetUniqueRecordId(); rocprofiler_record_tracer_t rocprofiler_record{}; - rocprofiler_record.header = rocprofiler_record_header_t{ROCPROFILER_TRACER_RECORD, - rocprofiler_record_id_t{record_id}}; + rocprofiler_record.header = rocprofiler_record_header_t{ + ROCPROFILER_TRACER_RECORD, rocprofiler_record_id_t{record_id}}; rocprofiler_record.domain = domain; rocprofiler_record.external_id = rocprofiler_tracer_external_id_t{0}; rocprofiler_record.operation_id = rocprofiler_tracer_operation_id_t{record->op}; @@ -479,8 +482,10 @@ int TracerCallback(activity_domain_t domain, uint32_t operation_id, void* data) ->AddRecord(rocprofiler_record, rocprofiler_record.api_data_handle.handle, rocprofiler_record.api_data_handle.size, [initial_handle](auto& rocprofiler_record, const void* data) { - if (rocprofiler_record.api_data_handle.handle==initial_handle) + if (rocprofiler_record.api_data_handle.handle == initial_handle && + data != initial_handle) { free(initial_handle); + } rocprofiler_record.api_data_handle.handle = static_cast(data); });