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

Generated by: LCOV version 2.0-1