mirror of
https://github.com/intel/compute-runtime.git
synced 2025-12-21 09:14:47 +08:00
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:
committed by
Compute-Runtime-Automation
parent
e82be94368
commit
6ecf5b373e
@@ -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()) {
|
||||
|
||||
@@ -46,6 +46,7 @@ struct MemoryRegion {
|
||||
MemoryClassInstance region;
|
||||
uint64_t probedSize;
|
||||
uint64_t unallocatedSize;
|
||||
uint64_t cpuVisibleSize;
|
||||
std::bitset<4> tilesMask;
|
||||
};
|
||||
|
||||
|
||||
@@ -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> ®ionInfo) {
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -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 ®ionInfo, 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 ®ion) {
|
||||
return (region.cpuVisibleSize && region.cpuVisibleSize < region.probedSize);
|
||||
});
|
||||
|
||||
populateTileToLocalMemoryRegionIndexMap();
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user