Repository navigation
fix: add VRAM fallback for non-amdgpu drivers - #957
GongHeng2017 wants to merge 1 commit into
Conversation
|
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: GongHeng2017 The full list of commands accepted by this bot can be found here. DetailsNeeds approval from an approver in each of these files:Approvers can indicate their approval by writing |
Reviewer's GuideThe PR preserves the existing amdgpu VRAM detection path while adding radeon/non-amdgpu recovery: it scans DRM sysfs entries for the GPU matching the device PCI BDF, reads the visible VRAM byte count, formats it for display, and finally uses hwinfo's Memory Size field when DRM data is unavailable. Flow diagram for GPU VRAM fallback detectionflowchart TD
A[setHwinfoInfo] --> B{m_GraphicsMemory is empty?}
B -->|No| Z[Keep existing VRAM value]
B -->|Yes| C[Extract PCI BDF from m_SysPath]
C --> D[Scan DRM card device symlinks]
D --> E{PCI BDF matches?}
E -->|Yes| F[Read mem_info_visible_vram_size]
E -->|No| D
F --> G{Valid VRAM byte count?}
G -->|Yes| H[Format VRAM as GB or MB]
G -->|No| I{Memory Size in mapInfo?}
I -->|Yes| J[Use hwinfo Memory Size]
I -->|No| K[Leave VRAM empty]
H --> L[Display graphics memory]
J --> L
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
1. Root cause: gpu-info sysfs file is amdgpu-only, radeon driver does not expose it, m_GraphicsMemory stays empty 2. Fix: add fallback in setHwinfoInfo() - try DRM sysfs mem_info_visible_vram_size, then hwinfo "Memory Size" field 3. Impact: radeon GPU VRAM now displays; amdgpu path unchanged Log: Fixed GPU VRAM not displayed with radeon driver Influence: 1. Test GPU VRAM display with amdgpu driver (no regression) 2. Test GPU VRAM display with radeon driver 3. Test GPU VRAM display on machines without DRM sysfs interface fix: 添加非amdgpu驱动显存检测的fallback 1. 根因:gpu-info sysfs文件为amdgpu专有,radeon驱动不暴露, m_GraphicsMemory保持为空 2. 方案:在setHwinfoInfo()中添加fallback,优先尝试DRM sysfs mem_info_visible_vram_size,其次从hwinfo输出解析 3. 影响:radeon驱动GPU显存可正常显示,amdgpu路径不受影响 Log: 修复radeon驱动下显卡显存不显示的问题 Influence: 1. 测试amdgpu驱动下GPU显存显示(无回归) 2. 测试radeon驱动下GPU显存显示 3. 测试无DRM sysfs接口机器的GPU显存显示 Bug: #380847 PMS: BUG-380847
a6d63d6 to
01e6eca
Compare
deepin pr auto review🤖 AI 代码审查报告📊 总体评价
🔍 详细分析1. 语法逻辑 ✅评价: 语法正确,逻辑清晰 ✅ 通过 潜在问题: 建议: ["统一VRAM大小的输出格式,例如统一使用'XGB'或'X MB'格式,避免不同来源产生不一致的显示"] 2. 代码质量 ✅评价: 代码结构清晰,注释完整 ✅ 通过 潜在问题: 建议: ['将1048576替换为命名常量(如static const quint64 BYTES_PER_MB = 1024 * 1024)', '将foreach替换为for (const QString &card : cards)', "使用QString::number(curSize, 'f', 1)限制GB值小数位数为1位"] 3. 代码性能 ✅评价: 性能良好,资源使用合理 ✅ 通过 潜在问题: 建议: ['将硬编码的sysfs路径提取为static const QString或宏定义,便于维护'] 4. 代码安全 🔒评价: 存在0个安全漏洞 ✅ 通过
安全漏洞详情: 建议: [] 💡 改进建议代码示例// 建议改进示例:使用命名常量、range-for、限制精度
if (m_GraphicsMemory.isEmpty()) {
static const quint64 BYTES_PER_MB = 1024 * 1024;
static const double MB_PER_GB = 1024.0;
QString pciBdf = m_SysPath.section('/', -1);
if (!pciBdf.isEmpty()) {
QDir drmDir("/sys/class/drm");
QStringList cards = drmDir.entryList(QStringList() << "card[0-9]*",
QDir::Dirs | QDir::NoDotAndDotDot);
for (const QString &card : cards) {
if (card.contains('-'))
continue;
QString devicePath = QFile::symLinkTarget(
QString("/sys/class/drm/%1/device").arg(card));
if (!devicePath.contains(pciBdf))
continue;
QFile memFile(QString("/sys/class/drm/%1/device/mem_info_visible_vram_size")
.arg(card));
if (memFile.open(QIODevice::ReadOnly)) {
QString memStr = memFile.readAll().trimmed();
memFile.close();
bool ok;
quint64 vramBytes = memStr.toULongLong(&ok);
if (ok && vramBytes >= BYTES_PER_MB) {
quint64 vramMB = vramBytes / BYTES_PER_MB;
auto curSize = vramMB / MB_PER_GB;
if (curSize > 1) {
m_GraphicsMemory = QString::number(curSize, 'f', 1) + "GB";
} else {
m_GraphicsMemory = QString::number(vramMB) + "MB";
}
break;
}
}
}
}
if (m_GraphicsMemory.isEmpty() && mapInfo.contains("Memory Size")) {
m_GraphicsMemory = mapInfo["Memory Size"].trimmed();
}
}本报告由 AI 代码审查工具自动生成 |
Root Cause Analysis
DeviceGpu::setHwinfoInfo() has three VRAM detection paths, all of which fail with the radeon driver. The primary path reads
/sys/<SysFS_ID>/gpu-info, which is an amdgpu-only sysfs file — radeon does not expose it, sofile.open()silently fails andm_GraphicsMemorystays empty. The lshw path maps thememoryfield tom_MemAddress(address range, not size), and the dmesg path requires aVRAMkeyword that radeon driver dmesg output does not contain.Fix Approach
Added a fallback block in
setHwinfoInfo()after the gpu-info read path, triggered only whenm_GraphicsMemoryis empty. It first tries the DRM sysfs interface (/sys/class/drm/card*/device/mem_info_visible_vram_size), matching the GPU by PCI BDF fromm_SysPath. If that fails, it falls back to parsing theMemory Sizefield from hwinfo output. This is consistent with the analysis report's recommended fix (section 10).Change Safety Assessment
Code Safety
m_GraphicsMemoryis empty; amdgpu path is completely unchangedsetHwinfoInfo()has prior VRAM-fixing commits (NVIDIA gpu-info path, JJW GPU special case); this change follows the same pattern without reverting any historical fixBusiness Impact Scope
Verification Suggestion
根因分析
DeviceGpu::setHwinfoInfo() 有三条显存检测路径,在 radeon 驱动下全部失效。主路径读取
/sys/<SysFS_ID>/gpu-info,该 sysfs 文件为 amdgpu 专有,radeon 驱动不暴露,file.open()静默失败,m_GraphicsMemory保持为空。lshw 路径将memory字段映射到m_MemAddress(地址范围,非大小),dmesg 路径要求VRAM关键字但 radeon 驱动 dmesg 输出不含此关键字。修复方案
在
setHwinfoInfo()的 gpu-info 读取路径之后新增 fallback 块,仅在m_GraphicsMemory为空时触发。优先尝试 DRM sysfs 接口(/sys/class/drm/card*/device/mem_info_visible_vram_size),通过m_SysPath中的 PCI BDF 匹配当前 GPU。若失败,则从 hwinfo 输出的Memory Size字段解析显存大小。与分析报告第十节方案一致。改动安全评估
代码安全评估
m_GraphicsMemory为空时触发,amdgpu 路径完全不变setHwinfoInfo()有历史显存修复提交(NVIDIA gpu-info 路径、JJW 显卡特殊处理),本次改动遵循相同模式,不回退任何历史修复业务影响范围
验证建议
Summary by Sourcery
Add fallback VRAM detection so GPUs without amdgpu-specific sysfs data display their memory size correctly.
Bug Fixes: