Files
rocm-systems/projects/rocr-runtime/tests/kfdtest/src/KFDIPCTest.hpp
T
Philip Yang 0869422f81 kfdtest: KFDIPCTest BasicTest query shared memory
Parent process alloc memory with specific HsaMemFlags, child process
import the memory handle exported by parent process, query shared memory
pointer info, verify it has same HsaMemFlags.

If child process test failed, exit with error code to notify parent
process.

Change-Id: I5c9534e931b4565186d27124868799b893504c81
Signed-off-by: Philip Yang <Philip.Yang@amd.com>


[ROCm/ROCR-Runtime commit: 426b94015c]
2021-07-23 10:08:28 -04:00

136 lines
4.6 KiB
C++

/*
* Copyright (C) 2017-2018 Advanced Micro Devices, Inc.
*
* 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 "KFDBaseComponentTest.hpp"
#include "BaseQueue.hpp"
#include "IsaGenerator.hpp"
#ifndef __KFD_MEMORY_TEST__H__
#define __KFD_MEMORY_TEST__H__
#define CMA_MEMORY_TEST_ARRAY_SIZE 4
#define CMA_TEST_COUNT 3
enum CMA_MEM_TYPE {
CMA_MEM_TYPE_SYSTEM = 0,
CMA_MEM_TYPE_USERPTR,
CMA_MEM_TYPE_LOCAL_MEM,
};
enum CMA_TEST_TYPE {
CMA_READ_TEST = 0,
CMA_WRITE_TEST
};
enum CMA_TEST_STATUS {
CMA_TEST_SUCCESS = 0,
CMA_IPC_PIPE_ERROR = 1,
CMA_CHECK_PATTERN_ERROR,
CMA_TEST_ABORT,
CMA_TEST_NOMEM,
CMA_PARENT_FAIL,
CMA_TEST_HSA_READ_FAIL,
CMA_TEST_HSA_WRITE_FAIL
};
/* @struct testMemoryDescriptor
* @brief Describes test buffers for Cross Memory Attach Test.
*/
struct testMemoryDescriptor {
CMA_MEM_TYPE m_MemType;
HSAuint64 m_MemSize;
/* The buffer will be initialized with this pattern */
HSAuint32 m_FillPattern;
/* After CMA test, this pattern is expected in the first word */
HSAuint32 m_CheckFirstWordPattern;
/* After CMA test, this pattern is expected in the last word */
HSAuint32 m_CheckLastWordPattern;
testMemoryDescriptor(CMA_MEM_TYPE memType, HSAuint64 memSize,
HSAuint32 fillPattern, HSAuint32 firstCheckPattern,
HSAuint32 lastCheckPattern) :
m_MemType(memType),
m_MemSize(memSize),
m_FillPattern(fillPattern),
m_CheckFirstWordPattern(firstCheckPattern),
m_CheckLastWordPattern(lastCheckPattern) {}
~testMemoryDescriptor(){}
};
/* @class KFDCMAArray
* @brief Array of buffers that will be passed between the parent and child
* process for Cross memory read and write tests
*/
class KFDCMAArray {
/* Used to store the actual buffer array */
HsaMemoryBuffer* m_MemArray[CMA_MEMORY_TEST_ARRAY_SIZE];
/* Used for passing to thunk CMA functions */
HsaMemoryRange m_HsaMemoryRange[CMA_MEMORY_TEST_ARRAY_SIZE];
/* Though previous arrays are fixed sizes only m_ValidCount
* ones are valid
*/
HSAuint64 m_ValidCount;
QueueArray m_QueueArray;
public:
KFDCMAArray();
~KFDCMAArray() {
Destroy();
}
CMA_TEST_STATUS Init(testMemoryDescriptor(*memDescriptor)[CMA_MEMORY_TEST_ARRAY_SIZE], int node);
CMA_TEST_STATUS Destroy();
HsaMemoryRange* getMemoryRange() { return m_HsaMemoryRange; }
HSAuint64 getValidRangeCount() { return m_ValidCount; }
void FillPattern(testMemoryDescriptor(*memDescriptor)[CMA_MEMORY_TEST_ARRAY_SIZE]);
CMA_TEST_STATUS checkPattern(testMemoryDescriptor(*memDescriptor)[CMA_MEMORY_TEST_ARRAY_SIZE]);
CMA_TEST_STATUS sendCMAArray(int writePipe);
CMA_TEST_STATUS recvCMAArray(int readPipe);
};
// @class KFDIPCTest
class KFDIPCTest : public KFDBaseComponentTest {
public:
KFDIPCTest(void) : m_ChildPid(-1) {}
~KFDIPCTest(void);
protected:
virtual void SetUp();
virtual void TearDown();
/* For IPC testing */
void BasicTestChildProcess(int defaultGPUNode, int *pipefd, HsaMemFlags mflags);
void BasicTestParentProcess(int defaultGPUNode, pid_t childPid, int *pipefd, HsaMemFlags mflags);
/* For CMA testing */
CMA_TEST_STATUS CrossMemoryAttachChildProcess(int defaultGPUNode, int writePipe,
int readPipe, CMA_TEST_TYPE testType);
CMA_TEST_STATUS CrossMemoryAttachParentProcess(int defaultGPUNode, pid_t cid,
int writePipe, int readPipe, CMA_TEST_TYPE testType);
protected:
pid_t m_ChildPid;
};
#endif // __KFD_MEMORY_TEST__H__