mirror of
https://github.com/intel/compute-runtime.git
synced 2025-12-20 08:53:55 +08:00
Modified ioctl_helper_prelim to support the extension of gem_create_ext, i.e. prelim_drm_i915_gem_create_ext_mempolicy. Added two debug variables to be used for the mempolicy extension. Modified functions in memory_info and drm_memory_manager to support extension Added numaif.h from https://github.com/numactl/numactl/tree/master, v2.0.14 Related-To: NEO-8276 Signed-off-by: Young Jin Yoon <young.jin.yoon@intel.com>
59 lines
2.1 KiB
C++
59 lines
2.1 KiB
C++
/*
|
|
* Copyright (C) 2023-2024 Intel Corporation
|
|
*
|
|
* SPDX-License-Identifier: MIT
|
|
*
|
|
*/
|
|
|
|
#include "shared/source/os_interface/linux/numa_library.h"
|
|
|
|
#include "shared/source/helpers/debug_helpers.h"
|
|
|
|
#include <cerrno>
|
|
#include <iostream>
|
|
#include <numaif.h>
|
|
|
|
namespace NEO {
|
|
namespace Linux {
|
|
|
|
std::unique_ptr<NEO::OsLibrary> NumaLibrary::osLibrary(nullptr);
|
|
NumaLibrary::OsLibraryLoadPtr NumaLibrary::osLibraryLoadFunction(NEO::OsLibrary::load);
|
|
NumaLibrary::GetMemPolicyPtr NumaLibrary::getMemPolicyFunction(nullptr);
|
|
NumaLibrary::NumaAvailablePtr NumaLibrary::numaAvailableFunction(nullptr);
|
|
NumaLibrary::NumaMaxNodePtr NumaLibrary::numaMaxNodeFunction(nullptr);
|
|
int NumaLibrary::maxNode(-1);
|
|
bool NumaLibrary::numaLoaded(false);
|
|
|
|
bool NumaLibrary::init() {
|
|
osLibrary.reset(osLibraryLoadFunction(std::string(numaLibNameStr)));
|
|
numaLoaded = false;
|
|
numaAvailableFunction = nullptr;
|
|
numaMaxNodeFunction = nullptr;
|
|
getMemPolicyFunction = nullptr;
|
|
if (osLibrary) {
|
|
DEBUG_BREAK_IF(!osLibrary->isLoaded());
|
|
numaAvailableFunction = reinterpret_cast<NumaAvailablePtr>(osLibrary->getProcAddress(std::string(procNumaAvailableStr)));
|
|
numaMaxNodeFunction = reinterpret_cast<NumaMaxNodePtr>(osLibrary->getProcAddress(std::string(procNumaMaxNodeStr)));
|
|
getMemPolicyFunction = reinterpret_cast<GetMemPolicyPtr>(osLibrary->getProcAddress(std::string(procGetMemPolicyStr)));
|
|
if (numaAvailableFunction && numaMaxNodeFunction && getMemPolicyFunction) {
|
|
if ((*numaAvailableFunction)() == 0) {
|
|
maxNode = (*numaMaxNodeFunction)();
|
|
numaLoaded = maxNode > 0;
|
|
}
|
|
}
|
|
}
|
|
return numaLoaded;
|
|
}
|
|
|
|
bool NumaLibrary::getMemPolicy(int *mode, std::vector<unsigned long> &nodeMask, void *addr) {
|
|
if (numaLoaded) {
|
|
// re-initialize vector with size maxNode;
|
|
std::vector<unsigned long>(maxNode + 1, 0).swap(nodeMask);
|
|
return (*getMemPolicyFunction)(mode, nodeMask.data(), maxNode + 1, addr, MPOL_F_MEMS_ALLOWED) != -1;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
} // namespace Linux
|
|
} // namespace NEO
|