Line data Source code
1 : /**
2 : * Copyright (c) 2025 Huawei Technologies Co., Ltd.
3 : * This program is free software, you can redistribute it and/or modify it under the terms and conditions of
4 : * CANN Open Software License Agreement Version 2.0 (the "License").
5 : * Please refer to the License for details. You may not use this file except in compliance with the License.
6 : * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
7 : * INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
8 : * See LICENSE in the root of the software repository for the full text of the License.
9 : */
10 :
11 : #include "local_ipc_rma_buffer_impl.h"
12 : #include "adapter_rts.h"
13 : #include "hccl_network.h"
14 : #include "mem_mapping_manager.h"
15 :
16 : namespace hccl {
17 : namespace {
18 5 : void *GetAliasDevAddr(void *addr, const LocalIpcRmaBufferImpl &parent)
19 : {
20 5 : const uintptr_t childAddr = reinterpret_cast<uintptr_t>(addr);
21 5 : const uintptr_t parentAddr = reinterpret_cast<uintptr_t>(parent.GetAddr());
22 5 : const uintptr_t parentDevAddr = reinterpret_cast<uintptr_t>(parent.GetDevAddr());
23 5 : return reinterpret_cast<void *>(parentDevAddr + (childAddr - parentAddr));
24 : }
25 : }
26 :
27 14 : LocalIpcRmaBufferImpl::LocalIpcRmaBufferImpl(
28 14 : const HcclNetDevCtx netDevCtx, void* addr, u64 size, const RmaMemType memType)
29 14 : : RmaBuffer(netDevCtx, addr, size, memType, RmaType::IPC_RMA)
30 : {
31 14 : }
32 :
33 5 : LocalIpcRmaBufferImpl::LocalIpcRmaBufferImpl(const HcclNetDevCtx netDevCtx, void* addr, u64 size,
34 5 : const RmaMemType memType, const LocalIpcRmaBufferImpl& parent)
35 : : RmaBuffer(netDevCtx, addr, size, memType, RmaType::IPC_RMA, true),
36 5 : deviceLogicId(parent.deviceLogicId), memName(parent.memName),
37 5 : memOffset(parent.memOffset), initialized_(true)
38 : {
39 5 : devAddr = GetAliasDevAddr(addr, parent);
40 5 : HCCL_INFO("[LocalIpcRmaBufferImpl] alias constructor, ipcName[%s]", memName.ipcName);
41 5 : }
42 :
43 38 : LocalIpcRmaBufferImpl::~LocalIpcRmaBufferImpl()
44 : {
45 19 : if (!isAlias_) {
46 14 : HcclResult res = Destroy();
47 14 : if (res != HCCL_SUCCESS) {
48 0 : HCCL_ERROR("[LocalIpcRmaBufferImpl][~LocalIpcRmaBufferImpl]failed, ret[%d]", res);
49 : }
50 : }
51 38 : }
52 :
53 9 : HcclResult LocalIpcRmaBufferImpl::Init()
54 : {
55 9 : CHK_PTR_NULL(netDevCtx);
56 9 : deviceLogicId = (static_cast<NetDevContext *>(netDevCtx))->GetLogicId();
57 :
58 : // host内存地址映射
59 9 : devAddr = addr;
60 9 : if (memType == RmaMemType::HOST) {
61 0 : CHK_RET(MemMappingManager::GetInstance(deviceLogicId).GetDevVA(deviceLogicId, addr, size, devAddr));
62 : } else {
63 : // 设置ipc mem name
64 9 : HCCL_INFO("[LocalIpcRmaBufferImpl][Init]ipc set mem name");
65 : HcclResult ret = MemNameRepository::GetInstance(deviceLogicId)
66 9 : ->SetIpcMem(devAddr, size, memName.ipcName, HCCL_IPC_MEM_NAME_LEN);
67 9 : CHK_PRT_RET(ret != HCCL_SUCCESS,
68 : HCCL_ERROR("[LocalIpcRmaBufferImpl][Init]errNo[0x%016llx], get para mem name failed. "\
69 : "mem addr[%p] deviceLogicId[%d]", HCCL_ERROR_CODE(ret), devAddr, deviceLogicId), ret);
70 : }
71 9 : HCCL_DEBUG("[LocalIpcRmaBufferImpl][Init]addr[%p], size[%llu], devAddr[%p], memType[%d]", addr, size, devAddr, memType);
72 9 : initialized_ = true;
73 9 : return HCCL_SUCCESS;
74 : }
75 :
76 2 : std::string &LocalIpcRmaBufferImpl::Serialize()
77 : {
78 2 : if (!serializeStr_.empty()) {
79 0 : return serializeStr_;
80 : }
81 : // 序列化信息
82 2 : std::ostringstream oss;
83 2 : u8 type{static_cast<u8>(rmaType)};
84 2 : oss.write(reinterpret_cast<const char_t *>(&type), sizeof(type));
85 2 : oss.write(reinterpret_cast<const char_t *>(&addr), sizeof(addr));
86 2 : oss.write(reinterpret_cast<const char_t *>(&size), sizeof(size));
87 2 : oss.write(reinterpret_cast<const char_t *>(&devAddr), sizeof(devAddr));
88 2 : oss.write(reinterpret_cast<const char_t *>(&memType), sizeof(memType));
89 2 : oss.write(reinterpret_cast<const char_t *>(&memName.ipcName), sizeof(memName.ipcName));
90 2 : oss.write(reinterpret_cast<const char_t *>(&memOffset), sizeof(memOffset));
91 2 : HCCL_DEBUG("[LocalIpcRmaBufferImpl][Serialize] addr[%p], size[%llu], devAddr[%p], memType[%d], ipcName[%s], memOffset[%llu]",
92 : reinterpret_cast<void*>(addr), size, reinterpret_cast<void*>(devAddr), memType, memName.ipcName, memOffset);
93 :
94 2 : serializeStr_ = oss.str();
95 2 : return serializeStr_;
96 2 : }
97 :
98 : constexpr s32 IPC_NOTIFY_PID_ARRAY_SIZE = 1;
99 2 : HcclResult LocalIpcRmaBufferImpl::Grant(u32 remotePid, u32 remoteSdid)
100 : {
101 2 : if (memType == RmaMemType::HOST) {
102 0 : HCCL_DEBUG("[LocalIpcRmaBufferImpl][Grant]memType is [%d].", memType);
103 0 : return HCCL_SUCCESS;
104 : }
105 :
106 2 : HCCL_DEBUG("[LocalIpcRmaBufferImpl][Grant]ipcName[%s], pid[%u], sdid[%u]", memName.ipcName, remotePid, remoteSdid);
107 2 : s32 peerPid = static_cast<s32>(remotePid);
108 2 : s32 peerSdid = static_cast<s32>(remoteSdid);
109 2 : if (peerSdid != INVALID_INT) {
110 1 : CHK_RET(hrtSetIpcMemorySuperPodPid(memName.ipcName, peerSdid, &peerPid, IPC_NOTIFY_PID_ARRAY_SIZE));
111 : } else {
112 1 : CHK_RET(hrtIpcSetMemoryPid(memName.ipcName, &peerPid, IPC_NOTIFY_PID_ARRAY_SIZE));
113 : }
114 2 : return HCCL_SUCCESS;
115 : }
116 :
117 28 : HcclResult LocalIpcRmaBufferImpl::Destroy()
118 : {
119 28 : if (addr != nullptr && initialized_) {
120 : // host内存解映射
121 9 : HcclResult ret = HCCL_SUCCESS;
122 9 : if (memType == RmaMemType::HOST) {
123 0 : ret = MemMappingManager::GetInstance(deviceLogicId).ReleaseDevVA(deviceLogicId, addr, size);
124 0 : if (ret != HCCL_SUCCESS) {
125 0 : HCCL_ERROR("[LocalIpcRmaBufferImpl][Destroy]release dev va failed, "
126 : "ret[%d], dev[%d], ptr[%p], size[%llu]", ret, deviceLogicId, addr, size);
127 : }
128 : } else {
129 : // 销毁ipc mem name
130 9 : MemNameRepository::GetInstance(deviceLogicId)->DestroyIpcMem(devAddr, size);
131 9 : HCCL_INFO("[LocalIpcRmaBufferImpl][Destroy]ipc destroy mem name. "\
132 : "mem addr[%p] deviceLogicId[%d]", devAddr, deviceLogicId);
133 : }
134 :
135 9 : addr = nullptr;
136 9 : size = 0;
137 9 : initialized_ = false;
138 9 : return ret;
139 : }
140 :
141 19 : return HCCL_SUCCESS;
142 : }
143 : }
|