LCOV - code coverage report
Current view: top level - legacy/ascend910/platform/resource/rma_buffer - local_ipc_rma_buffer_impl.cc (source / functions) Coverage Total Hit
Test: coverage.info Lines: 89.3 % 75 67
Test Date: 2026-08-04 10:52:23 Functions: 100.0 % 9 9

            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            7 : void *GetAliasDevAddr(void *addr, const LocalIpcRmaBufferImpl &parent)
      19              : {
      20            7 :     const uintptr_t childAddr = reinterpret_cast<uintptr_t>(addr);
      21            7 :     const uintptr_t parentAddr = reinterpret_cast<uintptr_t>(parent.GetAddr());
      22            7 :     const uintptr_t parentDevAddr = reinterpret_cast<uintptr_t>(parent.GetDevAddr());
      23            7 :     return reinterpret_cast<void *>(parentDevAddr + (childAddr - parentAddr));
      24              : }
      25              : }
      26              : 
      27           16 : LocalIpcRmaBufferImpl::LocalIpcRmaBufferImpl(
      28           16 :     const HcclNetDevCtx netDevCtx, void* addr, u64 size, const RmaMemType memType)
      29           16 :     : RmaBuffer(netDevCtx, addr, size, memType, RmaType::IPC_RMA)
      30              : {
      31           16 : }
      32              : 
      33            7 : LocalIpcRmaBufferImpl::LocalIpcRmaBufferImpl(const HcclNetDevCtx netDevCtx, void* addr, u64 size,
      34            7 :     const RmaMemType memType, const LocalIpcRmaBufferImpl& parent)
      35              :     : RmaBuffer(netDevCtx, addr, size, memType, RmaType::IPC_RMA, true),
      36            7 :       deviceLogicId(parent.deviceLogicId), memName(parent.memName),
      37            7 :       memOffset(parent.memOffset), initialized_(true)
      38              : {
      39            7 :     devAddr = GetAliasDevAddr(addr, parent);
      40            7 :     HCCL_INFO("[LocalIpcRmaBufferImpl] alias constructor, ipcName[%s]", memName.ipcName);
      41            7 : }
      42              : 
      43           46 : LocalIpcRmaBufferImpl::~LocalIpcRmaBufferImpl()
      44              : {
      45           23 :     if (!isAlias_) {
      46           16 :         HcclResult res = Destroy();
      47           16 :         if (res != HCCL_SUCCESS) {
      48            0 :             HCCL_ERROR("[LocalIpcRmaBufferImpl][~LocalIpcRmaBufferImpl]failed, ret[%d]", res);
      49              :         }
      50              :     }
      51           46 : }
      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           32 : HcclResult LocalIpcRmaBufferImpl::Destroy()
     118              : {
     119           32 :     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           23 :     return HCCL_SUCCESS;
     142              : }
     143              : }
        

Generated by: LCOV version 2.0-1