Program Listing for File DomainManager.cpp
↰ Return to documentation for file (BackendLibfabric/DomainManager.cpp
)
#include "DomainManager.hpp"
#include <tracy/Tracy.hpp>
#include <rdma/fabric.h>
#include <rdma/fi_domain.h>
#include "Issues.hpp"
#include "Helpers.hpp"
netio3::libfabric::DomainManager::DomainManager(NetworkMode mode,
const EndPointAddress& address,
std::uint64_t flags) :
m_info(create_info(mode, address, flags)),
m_fabric(create_fabric()),
m_send_domain(create_domain()),
m_listen_domain(create_domain())
{}
netio3::libfabric::DomainManager::~DomainManager()
{
ZoneScoped;
if (m_send_domain.get_domain() != nullptr) {
fi_close(&m_send_domain.get_domain()->fid);
}
if (m_listen_domain.get_domain() != nullptr) {
fi_close(&m_listen_domain.get_domain()->fid);
}
if (m_fabric != nullptr) {
fi_close(&m_fabric->fid);
}
}
netio3::libfabric::FiInfoUniquePtr netio3::libfabric::DomainManager::create_info(
NetworkMode mode,
const EndPointAddress& address,
std::uint64_t flags)
{
ZoneScoped;
auto hints = FiInfoWrapper{};
hints.get()->addr_format = FI_FORMAT_UNSPEC;
hints.get()->ep_attr->type = FI_EP_MSG;
hints.get()->caps = FI_MSG;
hints.get()->mode = FI_LOCAL_MR;
try {
hints.get()->fabric_attr->prov_name = strdup(get_provider(mode).c_str());
} catch (const LibFabricError& e) {
throw LibfabricDomainError(ERS_HERE, e.message());
}
const auto port_str = std::to_string(address.port());
ERS_DEBUG(1,
std::format("Registering Fabric and domains for {}:{}", address.address(), port_str));
fi_info* info = nullptr;
if (auto ret = fi_getinfo(
FI_VERSION(1, 1), address.address().c_str(), port_str.c_str(), flags, hints.get(), &info)) {
throw LibfabricDomainError(
ERS_HERE,
std::format("Failed to get info on local interface {} - {}", ret, fi_strerror(-ret)));
}
ERS_DEBUG(1,
std::format(
"addr format: {:#x}, provider: {}", info->addr_format, info->fabric_attr->prov_name));
return FiInfoUniquePtr{info};
}
fid_fabric* netio3::libfabric::DomainManager::create_fabric()
{
ZoneScoped;
fid_fabric* fabric{nullptr};
if (auto ret = fi_fabric(m_info->fabric_attr, &fabric, nullptr)) {
throw LibfabricDomainError(ERS_HERE,
std::format("Failed to open fabric - {}", fi_strerror(-ret)));
}
return fabric;
}
netio3::libfabric::DomainContext netio3::libfabric::DomainManager::create_domain() const
{
ZoneScoped;
fid_domain* domain = nullptr;
if (auto ret = fi_domain(m_fabric, m_info.get(), &domain, nullptr)) {
throw LibfabricDomainError(
ERS_HERE, std::format("Cannot open send domain {} - {}", ret, fi_strerror(-ret)));
}
return DomainContext{domain};
}