LCOV - code coverage report
Current view: top level - base_comm/resources/reged_mems - hccs_reged_mem_mgr.cc (source / functions) Coverage Total Hit
Test: coverage.info Lines: 77.7 % 282 219
Test Date: 2026-08-04 10:52:23 Functions: 81.8 % 22 18

            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              : #include "log.h"
      11              : #include "hccs_reged_mem_mgr.h"
      12              : // for hccl_network.h
      13              : #include "hccl_network.h"
      14              : #include "adapter_rts.h"
      15              : 
      16              : using namespace hccl;
      17              : namespace hcomm {
      18              : 
      19           21 : HccsRegedMemMgr::HccsRegedMemMgr(HcclNetDevCtx netDevCtx)
      20              : {
      21           21 :     netDevCtx_ = netDevCtx;
      22           21 : }
      23              : 
      24           21 : HccsRegedMemMgr::~HccsRegedMemMgr()
      25              : {
      26           21 :     allRegisteredBuffers_.clear();
      27           21 : }
      28              : 
      29           25 : HcclResult HccsRegedMemMgr::RegisterMemory(HcommMem mem, const char *memTag, void **memHandle)
      30              : {
      31           25 :     HCCL_INFO("[%s] Begin", __FUNCTION__);
      32           25 :     CHK_RET(ValidateMemParams(mem, memHandle));
      33           22 :     HCCL_INFO("[%s] addr[%p] size[%u] start", __FUNCTION__, mem.addr, mem.size);
      34              : 
      35           22 :     NetDevContext *netDevCtx = static_cast<NetDevContext *>(netDevCtx_);
      36           22 :     std::shared_ptr<LocalIpcRmaBufferMgr> localIpcRmaBufferMgr = netDevCtx->GetlocalIpcRmaBufferMgr();
      37           22 :     CHK_PTR_NULL(localIpcRmaBufferMgr);
      38              : 
      39           22 :     std::shared_ptr<hccl::LocalIpcRmaBuffer> localIpcRmaBuffer = nullptr;
      40              :     // LocalIpcRmaBuffer构造函数存在注册动作,在调用该构造函数前需检查是否注册过
      41           22 :     hccl::BufferKey<uintptr_t, u64> memKey(reinterpret_cast<uintptr_t>(mem.addr), mem.size);
      42           22 :     auto findPair = localIpcRmaBufferMgr->Find(memKey);
      43           22 :     if (findPair.first) {
      44            7 :         auto parentBuffer = findPair.second;
      45            7 :         EXCEPTION_CATCH((localIpcRmaBuffer = std::make_shared<hccl::LocalIpcRmaBuffer>(
      46              :             netDevCtx_, mem.addr, mem.size, static_cast<RmaMemType>(mem.type), *parentBuffer)),
      47              :             return HCCL_E_PTR);
      48            7 :         CHK_RET(AddBuffer(localIpcRmaBufferMgr, parentBuffer));
      49            7 :         HCCL_INFO("[HccsRegedMemMgr][RegisterMemory] alias created, key {%p, %llu}", mem.addr, mem.size);
      50            7 :     } else {
      51           15 :         EXCEPTION_CATCH((localIpcRmaBuffer = std::make_shared<hccl::LocalIpcRmaBuffer>(
      52              :             netDevCtx_, mem.addr, mem.size, static_cast<RmaMemType>(mem.type))),
      53              :             return HCCL_E_PTR);
      54              : 
      55           15 :         HcclResult ret = localIpcRmaBuffer->Init();
      56           15 :         if (ret != HCCL_SUCCESS) {
      57            1 :             HCCL_ERROR("[HccsRegedMemMgr][RegisterMemory]localbuffer init failed %d.", ret);
      58            1 :             return ret;
      59              :         }
      60              : 
      61           14 :         CHK_RET(AddBuffer(localIpcRmaBufferMgr, localIpcRmaBuffer));
      62           14 :         HCCL_INFO("[HccsRegedMemMgr][RegisterMemory]Register memory success! Add key {%p, %llu}", mem.addr, mem.size);
      63              :     }
      64              : 
      65           21 :     *memHandle = static_cast<void *>(localIpcRmaBuffer.get());
      66           21 :     allRegisteredBuffers_.emplace_back(localIpcRmaBuffer, false);
      67           21 :     handlesRecords_.push_back(localIpcRmaBuffer);
      68              : 
      69           21 :     HCCL_INFO("[%s] addr[%p] size[%u] memHandle[%p] allRegisteredBuffers_.size[%d]done",
      70              :         __FUNCTION__, mem.addr, mem.size, *memHandle, allRegisteredBuffers_.size());
      71           21 :     return HCCL_SUCCESS;
      72           22 : }
      73              : 
      74           24 : HcclResult HccsRegedMemMgr::UnregisterMemory(void* memHandle)
      75              : {
      76           24 :     HCCL_INFO("[%s] Begin", __FUNCTION__);
      77           24 :     CHK_PTR_NULL(memHandle);
      78              : 
      79           24 :     NetDevContext *netDevCtx = static_cast<NetDevContext *>(netDevCtx_);
      80           24 :     std::shared_ptr<LocalIpcRmaBufferMgr> localIpcRmaBufferMgr = netDevCtx->GetlocalIpcRmaBufferMgr();
      81           24 :     CHK_PTR_NULL(localIpcRmaBufferMgr);
      82              : 
      83           24 :     hccl::LocalIpcRmaBuffer* buffer = static_cast<hccl::LocalIpcRmaBuffer*>(memHandle);
      84           24 :     void *addr = buffer->GetAddr();
      85           24 :     uint64_t size = buffer->GetSize();
      86           24 :     HCCL_INFO("[%s] addr[%p] size[%u] memHandle[%p] start", __FUNCTION__, addr, size, memHandle);
      87              : 
      88              :     // IsAlias() 直接区分父子buffer:
      89              :     //   - 父buffer (IsAlias()=false): 自己的key在tree中 → Del(ownKey)
      90              :     //   - 子buffer (IsAlias()=true):  自己的key不在tree中 → 通过Find找父key做Del
      91           24 :     hccl::BufferKey<uintptr_t, u64> ownKey(reinterpret_cast<uintptr_t>(addr), size);
      92           24 :     hccl::LocalIpcRmaBuffer* refBuffer = buffer;
      93              : 
      94           24 :     if (buffer->IsAlias()) {
      95            8 :         auto findResult = localIpcRmaBufferMgr->Find(ownKey);
      96            8 :         if (findResult.first) {
      97            6 :             refBuffer = findResult.second.get();
      98              :         } else {
      99            2 :             HCCL_ERROR("[HccsRegedMemMgr][UnregisterMemory] alias parent not found");
     100            2 :             return HCCL_E_NOT_FOUND;
     101              :         }
     102            8 :     }
     103              : 
     104           22 :     auto refBufferInfo = std::make_pair(refBuffer->GetAddr(), refBuffer->GetSize());
     105           22 :     hccl::BufferKey<uintptr_t, u64> memKey(reinterpret_cast<uintptr_t>(refBufferInfo.first), refBufferInfo.second);
     106           22 :     bool resultPair = false;
     107           22 :     EXCEPTION_CATCH(resultPair = localIpcRmaBufferMgr->Del(memKey), return HCCL_E_NOT_FOUND);
     108              :     // 无论tree中是否删除(ref是否归零),当前handle都要从allBuffers移除
     109           20 :     bool found = false;
     110           27 :     for (auto it = allRegisteredBuffers_.begin(); it != allRegisteredBuffers_.end(); it++) {
     111           27 :         if (it->first.get() == buffer) {
     112           20 :             HCCL_INFO("[%s] addr[%p] size[%u] memHandle[%p]", __FUNCTION__, addr, size, memHandle);
     113              :             // IsInTree判断tree中是否还有该key的引用
     114           20 :             handlesRecords_.erase(std::remove(handlesRecords_.begin(), handlesRecords_.end(), it->first), handlesRecords_.end());
     115           20 :             if (!localIpcRmaBufferMgr->IsInTree(ownKey)) {
     116           14 :                 it = allRegisteredBuffers_.erase(it);
     117              :             } else {
     118            6 :                 it->second = true;
     119              :             }
     120           20 :             found = true;
     121           20 :             break;
     122              :         }
     123              :     }
     124           20 :     if (!found) {
     125            0 :         HCCL_ERROR("[%s] addr[%p] size[%zu] memHandle[%p] allRegisteredBuffers_.size[%zu] Not Found",
     126              :             __FUNCTION__, addr, static_cast<size_t>(size), memHandle, allRegisteredBuffers_.size());
     127            0 :         return HCCL_E_NOT_FOUND;
     128              :     }
     129           20 :     if (!resultPair) {
     130            7 :         HCCL_INFO("[HccsRegedMemMgr][UnregisterMemory]Memory reference count is larger than 0, do not deregister memory.");
     131            7 :         return HCCL_SUCCESS;
     132              :     }
     133           13 :     return HCCL_SUCCESS;
     134           24 : }
     135              : 
     136            2 : HcclResult HccsRegedMemMgr::SerializeToMemDesc(const EndpointDesc &endpointDesc, hccl::LocalIpcRmaBuffer *localIpcRmaBuffer,
     137              :     void **memDesc, uint32_t *descLen)
     138              : {
     139            2 :     HCCL_INFO("[%s] Begin", __FUNCTION__);
     140            2 :     CHK_PTR_NULL(memDesc);
     141            2 :     CHK_PTR_NULL(descLen);
     142              : 
     143            2 :     std::string &ipcRmaBufferDesc = localIpcRmaBuffer->Serialize();
     144            2 :     HCCL_INFO("[%s] ipcRmaBufferDesc.len[%u]", __FUNCTION__, ipcRmaBufferDesc.length());
     145              : 
     146            2 :     ipcRmaBufferDesc.resize(ipcRmaBufferDesc.length() + sizeof(EndpointDesc));
     147              :     // put the EndpointDesc at the end of the Serialize-ed buf
     148            2 :     if(memcpy_s(const_cast<char *>(ipcRmaBufferDesc.c_str()) + (ipcRmaBufferDesc.length() - sizeof(EndpointDesc)),
     149            2 :         sizeof(EndpointDesc), &endpointDesc, sizeof(EndpointDesc)) != EOK) {
     150            0 :         HCCL_ERROR("[RoceRegedMemMgr][SerializeToMemDesc] [%s] endpointDesc memcpy_s failed.", __func__);
     151            0 :         return HCCL_E_INTERNAL;
     152              :     }
     153              : 
     154            2 :     *descLen = static_cast<uint32_t>(ipcRmaBufferDesc.length());
     155            2 :     *memDesc = const_cast<char *>(ipcRmaBufferDesc.c_str());
     156            2 :     return HCCL_SUCCESS;
     157              : }
     158              : 
     159            4 : HcclResult HccsRegedMemMgr::MakeRemoteIpcRmaBuffer(std::string &ipcRmaBufferDesc,
     160              :         std::shared_ptr<hccl::RemoteIpcRmaBuffer> &remoteIpcRmaBuffer)
     161              : {
     162            4 :     HCCL_INFO("[HccsRegedMemMgr][%s] start", __FUNCTION__);
     163            4 :     EXCEPTION_CATCH(
     164              :         remoteIpcRmaBuffer = std::make_shared<hccl::RemoteIpcRmaBuffer>(netDevCtx_),
     165              :         return HCCL_E_PTR;
     166              :     );
     167            4 :     CHK_PTR_NULL(remoteIpcRmaBuffer);
     168              : 
     169            4 :     HcclResult ret = remoteIpcRmaBuffer->Deserialize(ipcRmaBufferDesc);
     170            4 :     if (ret != HCCL_SUCCESS) {
     171            0 :         HCCL_ERROR("[HccsRegedMemMgr][MemoryImport]RemoteIpcRmaBuffer Deserialize failed.");
     172            0 :         return ret;
     173              :     }
     174              : 
     175            4 :     HCCL_INFO("[%s] addr[%p] size[%lu] done", __FUNCTION__,
     176              :         remoteIpcRmaBuffer->GetAddr(), remoteIpcRmaBuffer->GetSize());
     177              : 
     178            4 :     return HCCL_SUCCESS;
     179              : }
     180              : 
     181            4 : HcclResult HccsRegedMemMgr::DeSerializeFromMemDesc(const void *memDesc, uint32_t descLen,
     182              :     EndpointDesc &endpointDesc, std::shared_ptr<hccl::RemoteIpcRmaBuffer> &remoteIpcRmaBuffer)
     183              : {
     184            4 :     HCCL_INFO("[%s] Begin", __FUNCTION__);
     185            4 :     CHK_PTR_NULL(memDesc);
     186              : 
     187            4 :     const char *description = static_cast<const char *>(memDesc);
     188            4 :     HCCL_INFO("[%s] descLen[%u] memDesc[%s]", __FUNCTION__, descLen, description);
     189              : 
     190            4 :     if (descLen <= sizeof(EndpointDesc)) {
     191            0 :         HCCL_ERROR("[HccsRegedMemMgr][DeSerializeFromMemDesc] [%s] descLen :%u too small error. need more than size:[%llu]",
     192              :             __func__, sizeof(EndpointDesc));
     193            0 :         return HCCL_E_INTERNAL;
     194              :     }
     195              : 
     196            4 :     uint32_t ipcRmaBufferDescLen = descLen - sizeof(EndpointDesc);
     197            4 :     if (memcpy_s(&endpointDesc, sizeof(EndpointDesc), description + ipcRmaBufferDescLen, sizeof(EndpointDesc)) != EOK) {
     198            0 :         HCCL_ERROR("[HccsRegedMemMgr][DeSerializeFromMemDesc] [%s] endpointDesc copy error. aim size:[%llu]",
     199              :             __func__, sizeof(EndpointDesc));
     200            0 :         return HCCL_E_INTERNAL;
     201              :     }
     202              : 
     203            4 :     std::string ipcRmaBufferDesc;
     204            4 :     ipcRmaBufferDesc.resize(ipcRmaBufferDescLen);
     205            4 :     if (memcpy_s(const_cast<char *>(ipcRmaBufferDesc.c_str()), ipcRmaBufferDescLen,
     206            4 :                 description, ipcRmaBufferDescLen) != EOK) {
     207            0 :         HCCL_ERROR("[HccsRegedMemMgr][DeSerializeFromMemDesc] [%s] ipcRmaBufferDesc copy error. aim size:[%llu]",
     208              :             __func__, ipcRmaBufferDescLen);
     209            0 :         return HCCL_E_INTERNAL;
     210              :     }
     211              : 
     212            4 :     CHK_RET(MakeRemoteIpcRmaBuffer(ipcRmaBufferDesc, remoteIpcRmaBuffer));
     213            4 :     return HCCL_SUCCESS;    
     214            4 : }
     215              : 
     216            3 : HcclResult HccsRegedMemMgr::MemoryExport(
     217              :     const EndpointDesc endpointDesc, void *memHandle, void **memDesc, uint32_t *memDescLen)
     218              : {
     219            3 :     HCCL_INFO("[%s] Begin", __FUNCTION__);
     220            3 :     CHK_PTR_NULL(memHandle);
     221            3 :     CHK_PTR_NULL(memDesc);
     222            3 :     CHK_PTR_NULL(memDescLen);
     223              : 
     224            3 :     hccl::LocalIpcRmaBuffer *localIpcRmaBuffer = nullptr;
     225            3 :     CHK_RET(ValidateMemExportHandle(memHandle, allRegisteredBuffers_, localIpcRmaBuffer));
     226            2 :     CHK_RET(SerializeToMemDesc(endpointDesc, localIpcRmaBuffer, memDesc, memDescLen));
     227            2 :     HCCL_INFO("[%s] memDesc[%p] descLen[%u]", __FUNCTION__, *memDesc, *memDescLen);
     228            2 :     return HCCL_SUCCESS;
     229              : }
     230              : 
     231            2 : HcclResult HccsRegedMemMgr::AddMem(hccl::BufferKey<uintptr_t, u64> &memKey,
     232              :     std::shared_ptr<hccl::RemoteIpcRmaBuffer> &remoteIpcRmaBuffer)
     233              : {
     234            2 :     CHK_PTR_NULL(remoteIpcRmaBuffer);
     235            2 :     HCCL_INFO("[HccsRegedMemMgr][%s] addr[%p], size[%lu] start",
     236              :         __FUNCTION__, reinterpret_cast<void *>(memKey.Addr()), memKey.Size());
     237              : 
     238            2 :     auto resultPair = remoteIpcRmaBufferMgr_.Add(memKey, remoteIpcRmaBuffer);
     239            2 :     if(!resultPair.second) {
     240            0 :         HCCL_ERROR("[HccsRegedMemMgr][%s] addr[%p], size[%lu] has already been imported!",
     241              :             __FUNCTION__, reinterpret_cast<void *>(memKey.Addr()), memKey.Size());
     242            0 :         return HCCL_E_AGAIN;
     243              :     }
     244              : 
     245            2 :     HCCL_INFO("[HccsRegedMemMgr][%s] addr[%p], size[%lu] done",
     246              :         __FUNCTION__, reinterpret_cast<void *>(memKey.Addr()), memKey.Size());
     247            2 :     return HCCL_SUCCESS;
     248              : }
     249              : 
     250            2 : HcclResult HccsRegedMemMgr::DeleteMem(hccl::BufferKey<uintptr_t, u64> &memKey)
     251              : {
     252            2 :     HCCL_INFO("[HccsRegedMemMgr][%s] addr[%p], size[%lu] start",
     253              :         __FUNCTION__, reinterpret_cast<void *>(memKey.Addr()), memKey.Size());
     254              : 
     255            2 :     bool delResultPair = false;
     256            2 :     EXCEPTION_CATCH(delResultPair = remoteIpcRmaBufferMgr_.Del(memKey), return HCCL_E_NOT_FOUND);
     257              :     // 计数器大于1时,返回false,说明框架层有其它设备在使用这段endpointDesc,返回HCCL_SUCCESS
     258            2 :     if (!delResultPair) {
     259            0 :         HCCL_INFO("[HccsRegedMemMgr][%s] addr[%p], size[%lu] reference count is larger than 0",
     260              :             __FUNCTION__, reinterpret_cast<void *>(memKey.Addr()), memKey.Size());
     261            0 :         return HCCL_SUCCESS;
     262              :     }
     263              : 
     264            2 :     HCCL_INFO("[HccsRegedMemMgr][%s] addr[%p], size[%lu] done",
     265              :         __FUNCTION__, reinterpret_cast<void *>(memKey.Addr()), memKey.Size());
     266              : 
     267            2 :     return HCCL_SUCCESS;
     268              : }
     269              : 
     270            2 : HcclResult HccsRegedMemMgr::MemoryImport(const void *memDesc, uint32_t descLen, HcommMem *outMem)
     271              : {
     272            2 :     CHK_PTR_NULL(memDesc);
     273            2 :     CHK_PTR_NULL(outMem);
     274            2 :     HCCL_INFO("[%s] memDesc[%p] descLen[%u] start", __FUNCTION__, memDesc, descLen);
     275              : 
     276              :     EndpointDesc endpointDesc;
     277            2 :     std::shared_ptr<hccl::RemoteIpcRmaBuffer> remoteIpcRmaBuffer = nullptr;
     278            2 :     CHK_RET(DeSerializeFromMemDesc(memDesc, descLen, endpointDesc, remoteIpcRmaBuffer));
     279            2 :     hccl::BufferKey<uintptr_t, u64> memKey(reinterpret_cast<uintptr_t>(remoteIpcRmaBuffer->GetAddr()),
     280            4 :                                         remoteIpcRmaBuffer->GetSize());
     281              : 
     282            2 :     auto resultPair = remoteIpcRmaBufferMgr_.Find(memKey);
     283            2 :     if(!resultPair.first) {
     284            2 :         HCCL_INFO("[HccsRegedMemMgr][%s] addr[%p], size[%lu] has Not Found!",
     285              :             __FUNCTION__, memKey.Addr(), memKey.Size());
     286            2 :         CHK_RET(AddMem(memKey, remoteIpcRmaBuffer));
     287              :     }
     288              : 
     289            2 :     outMem->addr = reinterpret_cast<void *>(remoteIpcRmaBuffer->GetAddr());
     290            2 :     outMem->size = remoteIpcRmaBuffer->GetSize();
     291            2 :     outMem->type = static_cast<CommMemType>(remoteIpcRmaBuffer->GetMemType());
     292              : 
     293            2 :     HCCL_INFO("[%s]memDesc[%p] descLen[%u] addr[%p] size[%lu], type[%u] done",
     294              :         __FUNCTION__, memDesc, descLen, outMem->addr, outMem->size, outMem->type);
     295              : 
     296            2 :     return HCCL_SUCCESS;
     297            2 : }
     298              : 
     299            2 : HcclResult HccsRegedMemMgr::MemoryUnimport(const void *memDesc, uint32_t descLen)
     300              : {
     301            2 :     CHK_PTR_NULL(memDesc);
     302            2 :     HCCL_INFO("[%s] memDesc[%p] descLen[%u] start", __FUNCTION__, memDesc, descLen);
     303              : 
     304              :     EndpointDesc endpointDesc;
     305            2 :     std::shared_ptr<hccl::RemoteIpcRmaBuffer> remoteIpcRmaBufferTmp = nullptr;
     306            2 :     CHK_RET(DeSerializeFromMemDesc(memDesc, descLen, endpointDesc, remoteIpcRmaBufferTmp));
     307            2 :     hccl::BufferKey<uintptr_t, u64> memKey(reinterpret_cast<uintptr_t>(remoteIpcRmaBufferTmp->GetAddr()),
     308            4 :                                         remoteIpcRmaBufferTmp->GetSize());
     309              : 
     310            2 :     std::shared_ptr<hccl::RemoteIpcRmaBuffer> remoteIpcRmaBuffer = nullptr;
     311            2 :     auto resultPair = remoteIpcRmaBufferMgr_.Find(memKey);
     312            2 :     if(!resultPair.first) {
     313            0 :         HCCL_ERROR("[HccsRegedMemMgr][%s] addr[%p], size[%lu] has Not Found!",
     314              :             __FUNCTION__, memKey.Addr(), memKey.Size());
     315            0 :         return HCCL_E_NOT_FOUND;
     316              :     }
     317            2 :     remoteIpcRmaBuffer = resultPair.second;
     318            2 :     CHK_PTR_NULL(remoteIpcRmaBuffer);
     319              : 
     320            2 :     if (remoteIpcRmaBuffer->IsOpened()) {
     321            0 :         HCCL_INFO("[HccsRegedMemMgr][DeleteMemDesc] memDesc[%p] descLen[%u] addr[%p] size[%lu] need to close first",
     322              :             memDesc, descLen, reinterpret_cast<void *>(memKey.Addr()), memKey.Size());
     323            0 :         return HCCL_SUCCESS;
     324              :     }
     325              : 
     326            2 :     CHK_RET(DeleteMem(memKey));
     327              : 
     328            2 :     HCCL_INFO("[%s] memDesc[%p] descLen[%u] addr[%p] size[%lu] done", __FUNCTION__,
     329              :         memDesc, descLen, reinterpret_cast<void *>(memKey.Addr()), memKey.Size());
     330              : 
     331            2 :     return HCCL_SUCCESS;
     332            2 : }
     333              : 
     334            2 : HcclResult HccsRegedMemMgr::MemoryGrant(const HcommMemGrantInfo *remoteGrantInfo)
     335              : {
     336            2 :     HCCL_INFO("[%s] Begin", __FUNCTION__);
     337            2 :     CHK_PTR_NULL(remoteGrantInfo);
     338              : 
     339            2 :     HCCL_INFO("[HccsRegedMemMgr][MemoryGrant]Grant remotePid:%d, remoteSdid:%u",
     340              :         remoteGrantInfo->pid, remoteGrantInfo->sdid);
     341            4 :     for (auto it = allRegisteredBuffers_.begin(); it != allRegisteredBuffers_.end(); it++) {
     342            2 :         if (it->second) {
     343            0 :             continue;
     344              :         }
     345            2 :         std::shared_ptr<hccl::LocalIpcRmaBuffer> localIpcRmaBuffer = it->first;
     346            2 :         CHK_PTR_NULL(localIpcRmaBuffer);
     347              : 
     348            2 :         HcclResult ret = localIpcRmaBuffer->Grant(remoteGrantInfo->pid, remoteGrantInfo->sdid);
     349            2 :         CHK_PRT_RET((ret != HCCL_SUCCESS),
     350              :             HCCL_ERROR("[HccsRegedMemMgr][MemoryGrant]Grant remotePid:%d, remoteSdid:%u error", 
     351              :                 remoteGrantInfo->pid, remoteGrantInfo->sdid), ret);
     352            2 :         HCCL_INFO("[HccsRegedMemMgr][MemoryGrant]Grant remotePid:%d, remoteSdid:%u addr [%p] done",
     353              :             remoteGrantInfo->pid, remoteGrantInfo->sdid, localIpcRmaBuffer->GetAddr());
     354            2 :     }
     355              : 
     356            2 :     HCCL_INFO("[HccsRegedMemMgr][MemoryGrant]Grant remotePid:%d, remoteSdid:%u done",
     357              :         remoteGrantInfo->pid, remoteGrantInfo->sdid);
     358            2 :     return HCCL_SUCCESS;
     359              : }
     360              : 
     361            2 : HcclResult HccsRegedMemMgr::MemoryEnableP2P(const EndpointDesc &localEndpointDesc, const EndpointDesc &remoteEndpointDesc)
     362              : {
     363            2 :     HCCL_INFO("[%s] Begin", __FUNCTION__);
     364            2 :     if (localEndpointDesc.loc.device.serverIdx == remoteEndpointDesc.loc.device.serverIdx) {
     365              :         u32 deviceLogicId;
     366            2 :         CHK_RET(hrtGetDeviceIndexByPhyId(localEndpointDesc.loc.device.devPhyId, deviceLogicId));
     367            2 :         HCCL_INFO("Need do hrtEnableP2P for device[%u] with deviceLogicId[%u]",
     368              :             remoteEndpointDesc.loc.device.devPhyId, deviceLogicId);
     369            2 :         CHK_RET(hrtEnableP2P(deviceLogicId, remoteEndpointDesc.loc.device.devPhyId));
     370              :     }
     371            2 :     return HCCL_SUCCESS;
     372              : }
     373              : 
     374            2 : HcclResult HccsRegedMemMgr::MemoryDisableP2P(const EndpointDesc &localEndpointDesc, const EndpointDesc &remoteEndpointDesc)
     375              : {
     376            2 :     HCCL_INFO("[%s] Begin", __FUNCTION__);
     377            2 :     if (localEndpointDesc.loc.device.serverIdx == remoteEndpointDesc.loc.device.serverIdx) {
     378              :         u32 deviceLogicId;
     379            2 :         CHK_RET(hrtGetDeviceIndexByPhyId(localEndpointDesc.loc.device.devPhyId, deviceLogicId));
     380            2 :         HCCL_INFO("Need do hrtDisableP2P for device[%u] with deviceLogicId[%u]",
     381              :             remoteEndpointDesc.loc.device.devPhyId, deviceLogicId);
     382            2 :         CHK_RET(hrtDisableP2P(deviceLogicId, remoteEndpointDesc.loc.device.devPhyId));
     383              :     }
     384            2 :     return HCCL_SUCCESS;
     385              : }
     386              : 
     387            2 : HcclResult HccsRegedMemMgr::MemoryOpenRemoteIpc()
     388              : {
     389            2 :     HCCL_INFO("[%s] Begin", __FUNCTION__);
     390            3 :     for (auto it = remoteIpcRmaBufferMgr_.Begin(); it != remoteIpcRmaBufferMgr_.End();) {
     391            1 :         const std::shared_ptr<hccl::RemoteIpcRmaBuffer> &remoteIpcRmaBuffer = it->second.buffer;
     392            1 :         HcclResult openRet = remoteIpcRmaBuffer->Open();
     393            1 :         if (openRet != HCCL_SUCCESS) {
     394            0 :             HCCL_ERROR("[HccsRegedMemMgr][MemoryOpenRemoteIpc]RemoteIpcRmaBuffer Open failed.");
     395            0 :             for (auto it2 = remoteIpcRmaBufferMgr_.Begin(); it2 != it;) {
     396            0 :                 const std::shared_ptr<hccl::RemoteIpcRmaBuffer> &remoteIpcRmaBuffer2 = it2->second.buffer;
     397            0 :                 (void)remoteIpcRmaBuffer2->Close();
     398            0 :                 it2 = remoteIpcRmaBufferMgr_.Next(it2);
     399              :             }
     400            0 :             return openRet;
     401              :         }
     402            1 :         it = remoteIpcRmaBufferMgr_.Next(it);
     403              :     }
     404              : 
     405            2 :     return HCCL_SUCCESS;
     406              : }
     407              : 
     408            2 : HcclResult HccsRegedMemMgr::MemoryCloseRemoteIpc()
     409              : {
     410            2 :     HCCL_INFO("[%s] Begin", __FUNCTION__);
     411            3 :     for (auto it = remoteIpcRmaBufferMgr_.Begin(); it != remoteIpcRmaBufferMgr_.End();) {
     412            1 :         const std::shared_ptr<hccl::RemoteIpcRmaBuffer> &remoteIpcRmaBuffer = it->second.buffer;
     413            1 :         (void)remoteIpcRmaBuffer->Close();
     414            1 :         it = remoteIpcRmaBufferMgr_.Next(it);
     415              :     }
     416              : 
     417            2 :     return HCCL_SUCCESS;
     418              : }
     419              : 
     420            7 : HcclResult HccsRegedMemMgr::GetAllMemHandles(void **memHandles, uint32_t *memHandleNum)
     421              : {
     422            7 :     HCCL_INFO("[%s] Begin", __FUNCTION__);
     423            7 :     CHK_PTR_NULL(memHandles);
     424            6 :     CHK_PTR_NULL(memHandleNum);
     425            5 :     *memHandleNum = static_cast<uint32_t>(handlesRecords_.size());
     426            5 :     *memHandles = handlesRecords_.empty() ? nullptr : static_cast<void *>(handlesRecords_.data());
     427            5 :     HCCL_INFO("[HccsRegedMemMgr][GetAllMemHandles] memHandleNum[%u]", *memHandleNum);
     428            5 :     return HCCL_SUCCESS;
     429              : }
     430              : 
     431            0 : HcclResult HccsRegedMemMgr::GetRemoteIpcRmaBuffer(std::vector<CommMem> &remoteIpcRmaBufferVec)
     432              : {
     433              :     CommMem mem;
     434            0 :     for (auto it = remoteIpcRmaBufferMgr_.Begin(); it != remoteIpcRmaBufferMgr_.End();) {
     435            0 :         const std::shared_ptr<hccl::RemoteIpcRmaBuffer> &remoteIpcRmaBuffer = it->second.buffer;
     436            0 :         mem.addr = remoteIpcRmaBuffer->GetAddr();
     437            0 :         mem.size = remoteIpcRmaBuffer->GetSize();
     438            0 :         mem.type = remoteIpcRmaBuffer->GetMemType() == RmaMemType::DEVICE ? CommMemType::COMM_MEM_TYPE_DEVICE :
     439              :             CommMemType::COMM_MEM_TYPE_HOST;
     440            0 :         remoteIpcRmaBufferVec.emplace_back(mem);
     441            0 :         HCCL_INFO("[HccsRegedMemMgr][GetRemoteIpcRmaBuffer]remote addr:%p, size[%lu], type[%u]",
     442              :             mem.addr, mem.size, static_cast<u32>(mem.type));
     443            0 :         it = remoteIpcRmaBufferMgr_.Next(it);
     444              :     }
     445            0 :     return HCCL_SUCCESS;
     446              : }
     447              : 
     448            0 : HcclResult HccsRegedMemMgr::GetRemoteIpcRmaBufferEx(std::vector<HcclMemEx> &remoteIpcRmaBufferVecEx)
     449              : {
     450              :     HcclMemEx mem;
     451            0 :     for (auto it = remoteIpcRmaBufferMgr_.Begin(); it != remoteIpcRmaBufferMgr_.End();) {
     452            0 :         const std::shared_ptr<hccl::RemoteIpcRmaBuffer> &remoteIpcRmaBuffer = it->second.buffer;
     453            0 :         mem.addr = remoteIpcRmaBuffer->GetAddr();
     454            0 :         mem.size = remoteIpcRmaBuffer->GetSize();
     455            0 :         mem.type = remoteIpcRmaBuffer->GetMemType() == RmaMemType::DEVICE ? HcclMemType::HCCL_MEM_TYPE_DEVICE :
     456              :             HcclMemType::HCCL_MEM_TYPE_HOST;
     457            0 :         mem.devAddr = remoteIpcRmaBuffer->GetDevAddr();
     458            0 :         remoteIpcRmaBufferVecEx.emplace_back(mem);
     459            0 :         HCCL_INFO("[HccsRegedMemMgr][GetRemoteIpcRmaBufferEx]remote addr:%p, size[%lu], type[%u], devAddr[%p]",
     460              :             mem.addr, mem.size, static_cast<u32>(mem.type), mem.devAddr);
     461            0 :         it = remoteIpcRmaBufferMgr_.Next(it);
     462              :     }
     463            0 :     return HCCL_SUCCESS;
     464              : }
     465              : 
     466            0 : HcclResult HccsRegedMemMgr::GetLocalIpcRmaBufferEx(std::vector<HcclMemEx> &localIpcRmaBufferVecEx)
     467              : {
     468            0 :     NetDevContext *netDevCtx = static_cast<NetDevContext *>(netDevCtx_);
     469            0 :     const std::shared_ptr<LocalIpcRmaBufferMgr> &localIpcRmaBufferMgr = netDevCtx->GetlocalIpcRmaBufferMgr();
     470            0 :     CHK_PTR_NULL(localIpcRmaBufferMgr);
     471              : 
     472              :     HcclMemEx mem;
     473            0 :     for (auto it = localIpcRmaBufferMgr->Begin(); it != localIpcRmaBufferMgr->End(); ) {
     474            0 :         const std::shared_ptr<hccl::LocalIpcRmaBuffer> &localIpcRmaBuffer = it->second.buffer;
     475            0 :         mem.addr = localIpcRmaBuffer->GetAddr();
     476            0 :         mem.size = localIpcRmaBuffer->GetSize();
     477            0 :         mem.type = localIpcRmaBuffer->GetMemType() == RmaMemType::DEVICE ? HcclMemType::HCCL_MEM_TYPE_DEVICE :
     478              :             HcclMemType::HCCL_MEM_TYPE_HOST;
     479            0 :         mem.devAddr = localIpcRmaBuffer->GetDevAddr();
     480            0 :         localIpcRmaBufferVecEx.emplace_back(mem);
     481            0 :         HCCL_INFO("[HccsRegedMemMgr][GetLocalIpcRmaBufferEx]local addr:%p, size[%lu], type[%u], devAddr[%p]",
     482              :             mem.addr, mem.size, static_cast<u32>(mem.type), mem.devAddr);
     483            0 :         it = localIpcRmaBufferMgr->Next(it);
     484              :     }
     485            0 :     return HCCL_SUCCESS;
     486            0 : }
     487              : }
        

Generated by: LCOV version 2.0-1