From 34d13b7ec13a5a056bb4f97a31d72af1e1150544 Mon Sep 17 00:00:00 2001 From: Marko Arandjelovic Date: Fri, 2 Feb 2024 17:57:00 +0100 Subject: [PATCH] SWDEV-441278 - Add hipHostFree test Change-Id: Ibb78f3d36aa35bf75329adf65f19da5977a965f3 [ROCm/hip-tests commit: bac782e39855f93b47e88edb95ed959d14c791b5] --- .../catch/unit/memory/CMakeLists.txt | 1 + .../catch/unit/memory/hipHostFree.cc | 108 ++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 projects/hip-tests/catch/unit/memory/hipHostFree.cc diff --git a/projects/hip-tests/catch/unit/memory/CMakeLists.txt b/projects/hip-tests/catch/unit/memory/CMakeLists.txt index 37badbc90a..336a71b816 100644 --- a/projects/hip-tests/catch/unit/memory/CMakeLists.txt +++ b/projects/hip-tests/catch/unit/memory/CMakeLists.txt @@ -163,6 +163,7 @@ set(TEST_SRC hipMemGetInfo.cc hipFree.cc hipFreeArray.cc + hipHostFree.cc hipMemcpySync.cc hipMemsetSync.cc hipMemsetAsync.cc diff --git a/projects/hip-tests/catch/unit/memory/hipHostFree.cc b/projects/hip-tests/catch/unit/memory/hipHostFree.cc new file mode 100644 index 0000000000..72c001266c --- /dev/null +++ b/projects/hip-tests/catch/unit/memory/hipHostFree.cc @@ -0,0 +1,108 @@ +/* +Copyright (c) 2024 Advanced Micro Devices, Inc. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +#include + +/** + * Test Description + * ------------------------ + * - Basic test that checks behaviour for invalid memory as well as host registered memory. + * Test source + * ------------------------ + * - memory/hipHostFree.cc + * Test requirements + * ------------------------ + * - HIP_VERSION >= 6.0 + */ +TEST_CASE("Unit_hipHostFree_InvalidMemory") { + SECTION("Nullptr") { + HIP_CHECK(hipHostFree(nullptr)); + } + + SECTION("Invalid ptr") { + void* invalid_ptr; + HIP_CHECK_ERROR(hipHostFree(&invalid_ptr), hipErrorInvalidValue); + } + + SECTION("Host registered memory") { + const size_t ptr_size = 1024; + char* ptr = new char[ptr_size]; + auto flag = GENERATE(hipHostRegisterDefault, hipHostRegisterPortable, hipHostRegisterMapped); + + HIP_CHECK(hipHostRegister(ptr, ptr_size, flag)); + HIP_CHECK_ERROR(hipHostFree(ptr), hipErrorInvalidValue); + } +} + +/** + * Test Description + * ------------------------ + * - Test verifies that double free returns an error. + * Test source + * ------------------------ + * - memory/hipHostFree.cc + * Test requirements + * ------------------------ + * - HIP_VERSION >= 6.0 + */ +TEST_CASE("Unit_hipHostFree_DoubleFree") { + void* ptr = NULL; + size_t ptr_size = 1024; + + HIP_CHECK(hipHostMalloc(&ptr, ptr_size)); + HIP_CHECK(hipHostFree(ptr)); + HIP_CHECK_ERROR(hipHostFree(ptr), hipErrorInvalidValue); +} + +/** + * Test Description + * ------------------------ + * - Caling hipHostFree from different thread on each pointer + * Test source + * ------------------------ + * - memory/hipHostFree.cc + * Test requirements + * ------------------------ + * - HIP_VERSION >= 6.0 + */ +TEST_CASE("Unit_hipHostFree_Multithreading") { + std::vector ptrs(10); + size_t ptr_size = 1024; + + for (auto ptr : ptrs) { + HIP_CHECK(hipHostMalloc(&ptr, ptr_size)); + } + + std::vector threads; + + for (auto ptr : ptrs) { + threads.emplace_back(([ptr] { + HIP_CHECK_THREAD(hipHostFree(ptr)); + HIP_CHECK_THREAD(hipStreamQuery(nullptr)); + })); + } + + for (auto& t : threads) { + t.join(); + } + HIP_CHECK_THREAD_FINALIZE(); +}