feature: exit with warning if small bar detected on Linux

Return early and provide justification, otherwise SIGBUS error is
returned.

Related-To: NEO-14506
Signed-off-by: Maciej Bielski <maciej.bielski@intel.com>
This commit is contained in:
Maciej Bielski
2025-04-09 21:32:48 +00:00
committed by Compute-Runtime-Automation
parent e82be94368
commit 6ecf5b373e
12 changed files with 148 additions and 35 deletions

View File

@@ -510,6 +510,9 @@ int Drm::setupHardwareInfo(const DeviceDescriptor *device, bool setupFeatureTabl
if (!queryMemoryInfo()) {
setPerContextVMRequired(true);
printDebugString(debugManager.flags.PrintDebugMessages.get(), stderr, "%s", "WARNING: Failed to query memory info\n");
} else if (getMemoryInfo()->isSmallBarDetected()) {
IoFunctions::fprintf(stderr, "WARNING: Small BAR detected for device %s\n", getPciPath().c_str());
return -1;
}
if (!queryEngineInfo()) {

View File

@@ -46,6 +46,7 @@ struct MemoryRegion {
MemoryClassInstance region;
uint64_t probedSize;
uint64_t unallocatedSize;
uint64_t cpuVisibleSize;
std::bitset<4> tilesMask;
};

View File

@@ -26,6 +26,7 @@
#include "shared/source/utilities/directory.h"
#include <fcntl.h>
#include <span>
#include <sstream>
namespace NEO {
@@ -183,11 +184,13 @@ std::vector<EngineCapabilities> IoctlHelperI915::translateToEngineCaps(const std
}
std::vector<MemoryRegion> IoctlHelperI915::translateToMemoryRegions(const std::vector<uint64_t> &regionInfo) {
auto *data = reinterpret_cast<const drm_i915_query_memory_regions *>(regionInfo.data());
auto memRegions = std::vector<MemoryRegion>(data->num_regions);
for (uint32_t i = 0; i < data->num_regions; i++) {
memRegions[i].probedSize = data->regions[i].probed_size;
memRegions[i].unallocatedSize = data->regions[i].unallocated_size;
memRegions[i].cpuVisibleSize = data->regions[i].probed_cpu_visible_size;
memRegions[i].region.memoryClass = data->regions[i].region.memory_class;
memRegions[i].region.memoryInstance = data->regions[i].region.memory_instance;
}

View File

@@ -17,6 +17,7 @@
#include "shared/source/os_interface/linux/numa_library.h"
#include "shared/source/os_interface/product_helper.h"
#include <algorithm>
#include <iostream>
namespace NEO {
@@ -27,10 +28,16 @@ MemoryInfo::MemoryInfo(const RegionContainer &regionInfo, const Drm &inputDrm)
const auto memoryClassSystem = ioctlHelper->getDrmParamValue(DrmParam::memoryClassSystem);
const auto memoryClassDevice = ioctlHelper->getDrmParamValue(DrmParam::memoryClassDevice);
UNRECOVERABLE_IF(this->systemMemoryRegion.region.memoryClass != memoryClassSystem);
std::copy_if(drmQueryRegions.begin(), drmQueryRegions.end(), std::back_inserter(localMemoryRegions),
[&](const MemoryRegion &memoryRegionInfo) {
return (memoryRegionInfo.region.memoryClass == memoryClassDevice);
});
std::ranges::copy_if(drmQueryRegions, std::back_inserter(localMemoryRegions),
[memoryClassDevice](const MemoryRegion &memoryRegionInfo) {
return (memoryRegionInfo.region.memoryClass == memoryClassDevice);
});
smallBarDetected = std::ranges::any_of(localMemoryRegions,
[](const MemoryRegion &region) {
return (region.cpuVisibleSize && region.cpuVisibleSize < region.probedSize);
});
populateTileToLocalMemoryRegionIndexMap();

View File

@@ -47,6 +47,7 @@ class MemoryInfo {
const RegionContainer &getLocalMemoryRegions() const { return localMemoryRegions; }
const RegionContainer &getDrmRegionInfos() const { return drmQueryRegions; }
bool isMemPolicySupported() const { return memPolicySupported; }
bool isSmallBarDetected() const { return smallBarDetected; }
protected:
const Drm &drm;
@@ -57,6 +58,7 @@ class MemoryInfo {
int memPolicyMode;
RegionContainer localMemoryRegions;
std::array<uint32_t, 4> tileToLocalMemoryRegionIndexMap{};
bool smallBarDetected;
};
} // namespace NEO

View File

@@ -373,13 +373,15 @@ std::unique_ptr<EngineInfo> IoctlHelperXe::createEngineInfo(bool isSysmanEnabled
}
inline MemoryRegion createMemoryRegionFromXeMemRegion(const drm_xe_mem_region &xeMemRegion, std::bitset<4> tilesMask) {
MemoryRegion memoryRegion{};
memoryRegion.region.memoryInstance = xeMemRegion.instance;
memoryRegion.region.memoryClass = xeMemRegion.mem_class;
memoryRegion.probedSize = xeMemRegion.total_size;
memoryRegion.unallocatedSize = xeMemRegion.total_size - xeMemRegion.used;
memoryRegion.tilesMask = tilesMask;
return memoryRegion;
return {
.region{
.memoryClass = xeMemRegion.mem_class,
.memoryInstance = xeMemRegion.instance},
.probedSize = xeMemRegion.total_size,
.unallocatedSize = xeMemRegion.total_size - xeMemRegion.used,
.cpuVisibleSize = xeMemRegion.cpu_visible_size,
.tilesMask = tilesMask,
};
}
std::unique_ptr<MemoryInfo> IoctlHelperXe::createMemoryInfo() {