热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

PCI驱动程序失败:在设备上检测到PCI总线错误

如何解决《PCI驱动程序失败:在设备上检测到PCI总线错误》经验,为你挑选了1个好方法。

我正在尝试使用ppc64(power pc)计算机上的自定义驱动程序在特定的pci设备上进行重置。

该驱动程序可在另一台ppc64计算机上使用。

这是负责执行此操作的功能。我删除了几行代码以强调重要的流程。

int reset_device(void)
{
    pdev =  g_reset_info.devs[ix];        
    err = pci_enable_device(pdev);

    if (err) {
        return err;
    }
    pci_set_master(pdev);
    err = pci_save_state(pdev);
    if (err) {
            return err;
    }

    pdev =  g_reset_info.devs[ix];

    err = pci_set_pcie_reset_state(pdev, pcie_hot_reset);
    if (err) {
        return err;
    }

    msleep(jiffies_to_msecs(HZ/2));
    msleep(jiffies_to_msecs(HZ/2));

    pdev =  g_reset_info.devs[ix];

    err = pci_set_pcie_reset_state(pdev, pcie_deassert_reset);
        if (err) {
            return err;
        }

    pdev =  g_reset_info.devs[ix];
    pci_restore_state(pdev);

    msleep(jiffies_to_msecs(HZ/2));
    msleep(jiffies_to_msecs(HZ/2));

    return 0;
}

这是来自dmesg的输出:

mst_ppc_pci_reset_driver reset_device 63 Send hot reset to device: 0000:50:00.0 
mst_ppc_pci_reset_driver reset_device 81 Deassert device: 0000:50:00.0 
Call Trace: 
[c000000186f92fe0] [c0000000000155ac] .show_stack+0x6c/0x198 (unreliable) 
[c000000186f93090] [c000000000076a8c] .eeh_dn_check_failure+0x354/0x3f0 
[c000000186f93150] [c000000000029b7c] .rtas_read_config+0x13c/0x198 
[c000000186f931f0] [c00000000039c8d0] .pci_bus_read_config_word+0xa0/0xf8 
[c000000186f932b0] [c0000000003a2730] .pci_find_capability+0x40/0xd0 
[c000000186f93360] [c0000000003a2b6c] .pci_restore_pcie_state+0x54/0x2e8 
[c000000186f93410] [c0000000003a501c] .pci_restore_state+0x84/0x1b8 
[c000000186f934d0] [d000000003810384] .reset_device+0x184/0x430 [mst_ppc_pci_reset] 
[c000000186f93590] [c0000000003a6254] .local_pci_probe+0x7c/0xf8 
[c000000186f93620] [c0000000003a63a8] .__pci_device_probe+0xd8/0x128 
[c000000186f936d0] [c0000000003a72a8] .pci_device_probe+0x38/0x68 
[c000000186f93760] [c0000000004d0bd8] .really_probe+0xb0/0x288 
[c000000186f93810] [c0000000004d0e4c] .driver_probe_device+0x9c/0x110 
[c000000186f938a0] [c0000000004d0fbc] .__driver_attach+0xfc/0x100 
[c000000186f93930] [c0000000004cfee4] .bus_for_each_dev+0xc4/0x118 
[c000000186f939e0] [c0000000004d08a8] .driver_attach+0x28/0x40 
[c000000186f93a60] [c0000000004cf3b0] .bus_add_driver+0x190/0x340 
[c000000186f93b10] [c0000000004d1950] .driver_register+0x98/0x1b8 
[c000000186f93bb0] [c0000000003a760c] .__pci_register_driver+0x64/0x140 
[c000000186f93c50] [d0000000038107c0] .init+0x28/0x400 [mst_ppc_pci_reset] 
[c000000186f93cd0] [c00000000000ab68] .do_one_initcall+0x68/0x1e0 
[c000000186f93d90] [c00000000010893c] .SyS_init_module+0xcc/0x218 
[c000000186f93e30] [c0000000000098ec] syscall_exit+0x0/0x40 
mst_ppc_pci_reset_driver 0000:50:00.0: restoring config space at offset 0xf (was 0xffffffff, writing 0xff) 
mst_ppc_pci_reset_driver 0000:50:00.0: restoring config space at offset 0xe (was 0xffffffff, writing 0x0)
mst_ppc_pci_reset_driver 0000:50:00.0: restoring config space at offset 0xd (was 0xffffffff, writing 0x40)
mst_ppc_pci_reset_driver 0000:50:00.0: restoring config space at offset 0xc (was 0xffffffff, writing 0x0)
mst_ppc_pci_reset_driver 0000:50:00.0: restoring config space at offset 0xb (was 0xffffffff, writing 0x6115b3)
mst_ppc_pci_reset_driver 0000:50:00.0: restoring config space at offset 0xa (was 0xffffffff, writing 0x0)
mst_ppc_pci_reset_driver 0000:50:00.0: restoring config space at offset 0x9 (was 0xffffffff, writing 0x0)
mst_ppc_pci_reset_driver 0000:50:00.0: restoring config space at offset 0x8 (was 0xffffffff, writing 0x0)
mst_ppc_pci_reset_driver 0000:50:00.0: restoring config space at offset 0x7 (was 0xffffffff, writing 0x0)
mst_ppc_pci_reset_driver 0000:50:00.0: restoring config space at offset 0x6 (was 0xffffffff, writing 0x0)
mst_ppc_pci_reset_driver 0000:50:00.0: restoring config space at offset 0x5 (was 0xffffffff, writing 0x0)
mst_ppc_pci_reset_driver 0000:50:00.0: restoring config space at offset 0x4 (was 0xffffffff, writing 0x9e00000c)
mst_ppc_pci_reset_driver 0000:50:00.0: restoring config space at offset 0x3 (was 0xffffffff, writing 0x20)
mst_ppc_pci_reset_driver 0000:50:00.0: restoring config space at offset 0x2 (was 0xffffffff, writing 0x2070000)
mst_ppc_pci_reset_driver 0000:50:00.0: restoring config space at offset 0x1 (was 0xffffffff, writing 0x100146)
mst_ppc_pci_reset_driver 0000:50:00.0: restoring config space at offset 0x0 (was 0xffffffff, writing 0x101115b3)
EEH: Detected PCI bus error on device 
EEH: This PCI device has failed 1 times in the last hour:
EEH: Bus location=U78CB.001.WZS02VY-P1-C11-T1 driver=mst_ppc_pci_reset_driver pci addr=0000:50:00.0
EEH: Device location=U78CB.001.WZS02VY-P1-C11-T1 driver= pci addr=
EEH: of node=/pci@800000020000013/pci15b3,61@0
EEH: PCI device/vendor: 101115b3
EEH: PCI cmd/status register: 00100140
EEH: PCI-E capabilities and status follow:
EEH: PCI-E 00: 0002c010
EEH: PCI-E 01: 19008fe2
EEH: PCI-E 02: 0000595e
EEH: PCI-E 03: 0043f103
EEH: PCI-E 04: 10830000
EEH: PCI-E 05: 00000000
EEH: PCI-E 06: 00000000
EEH: PCI-E 07: 00000000
EEH: PCI-E 08: 00000000
EEH: PCI-E AER capability register set follows:
EEH: PCI-E AER 00: 00010001
EEH: PCI-E AER 01: 00000000
EEH: PCI-E AER 02: 00000000
EEH: PCI-E AER 03: 00062010
EEH: PCI-E AER 04: 00000000
EEH: PCI-E AER 05: 00002000
EEH: PCI-E AER 06: 000001e4
EEH: PCI-E AER 07: 00000000
EEH: PCI-E AER 08: 00000000
EEH: PCI-E AER 09: 00000000
EEH: PCI-E AER 0a: 00000000
EEH: PCI-E AER 0b: 00000000
EEH: PCI-E AER 0c: 00000000
EEH: PCI-E AER 0d: 00000000
RTAS: event: 2736, Type: Platform Error, Severity: 2
mst_ppc_pci_reset_driver 0000:50:00.0: PME# disabled

小智.. 5

调试此类问题时,最好跟踪使用的内核版本并提供有关测试硬件的详细信息。从您的内核具有eeh_dn_check_failure()而不是eeh_check_dev_failure()的事实来看,我可以认为这是一个非常老的内核。您测试的其他系统是否具有相同的内核?相同的固件?所有这些都与您的问题有关。

无论如何,我想说您需要在取消激活重置和恢复配置空间之间等待一秒钟。PCI规范要求系统软件在重设后给设备一秒钟的初始化时间,然后再尝试进行IO(包括配置周期)。在2015年,commit 26833a5029b7 ("powerpc/eeh: Make the delay for PE reset unified")在断言之后(至少在powerpc上)添加了一个延迟,因此可以为您处理。考虑到您的内核已经足够老,仍然可以拥有eeh_dn_check_failure()(在2012年重命名,请参阅参考资料),f8f7d63fd96e您可能没有该补丁,需要自己等待。

可能发生的情况是设备尚未准备好响应配置访问并将其丢弃。系统管理程序将检测到超时并假定设备发生故障,因此它将使用IBM Power硬件具有的EEH机制隔离设备(冻结设备)。通常,在发生这种情况后,操作系统会尝试取消冻结并重置设备,但是由于许多原因,这可能会失败,尤其是在较旧的内核上。



1> 小智..:

调试此类问题时,最好跟踪使用的内核版本并提供有关测试硬件的详细信息。从您的内核具有eeh_dn_check_failure()而不是eeh_check_dev_failure()的事实来看,我可以认为这是一个非常老的内核。您测试的其他系统是否具有相同的内核?相同的固件?所有这些都与您的问题有关。

无论如何,我想说您需要在取消激活重置和恢复配置空间之间等待一秒钟。PCI规范要求系统软件在重设后给设备一秒钟的初始化时间,然后再尝试进行IO(包括配置周期)。在2015年,commit 26833a5029b7 ("powerpc/eeh: Make the delay for PE reset unified")在断言之后(至少在powerpc上)添加了一个延迟,因此可以为您处理。考虑到您的内核已经足够老,仍然可以拥有eeh_dn_check_failure()(在2012年重命名,请参阅参考资料),f8f7d63fd96e您可能没有该补丁,需要自己等待。

可能发生的情况是设备尚未准备好响应配置访问并将其丢弃。系统管理程序将检测到超时并假定设备发生故障,因此它将使用IBM Power硬件具有的EEH机制隔离设备(冻结设备)。通常,在发生这种情况后,操作系统会尝试取消冻结并重置设备,但是由于许多原因,这可能会失败,尤其是在较旧的内核上。


推荐阅读
  • 环境变量是用于描述系统运行环境的一系列变量,如PATH指定了命令的搜索路径,SHELL指定了默认的Shell。本文介绍了如何加载和管理这些环境变量,以及普通变量与环境变量的区别。 ... [详细]
  • top 命令是一个强大的工具,可以实时动态地监控系统的整体运行状况。它整合了多种信息,提供了一个全面的系统性能和运行信息视图。通过 top 命令的交互界面,用户可以使用热键进行各种管理操作。 ... [详细]
  • Linux环境下MySQL的安装与配置
    本文详细介绍了在Linux系统上安装和配置MySQL的步骤,包括安装前的准备工作、下载和解压安装包、初始化数据库、配置文件编辑、启动服务以及设置开机自启动等。 ... [详细]
  • 本文介绍了如何在Linux系统中将命令添加到PATH环境变量中,以便在任何位置都能直接运行这些命令。PATH是一个包含多个目录路径的字符串变量,当输入不带路径的命令时,系统会在这些路径中查找并执行相应的命令。 ... [详细]
  • 构建个人多节点Linux环境(CodeSheep)
    本文介绍如何通过虚拟机搭建一个多节点的Linux环境,这对于学习、实验和项目部署都具有重要意义。文章详细讲解了网络IP设置、节点间通信等关键步骤。 ... [详细]
  • 尽管Medium是一个优秀的发布平台,但在其之外拥有自己的博客仍然非常重要。这不仅提供了另一个与读者互动的渠道,还能确保您的内容安全。本文将介绍如何使用Bash脚本将Medium文章迁移到个人博客。 ... [详细]
  • Linux系统快捷键大全及使用技巧
    本文详细介绍了Linux系统中的各种快捷键,包括命令行和VIM编辑器中的常用快捷键,帮助用户提高操作效率。同时,文章还提供了关于字体配置、软件安装等方面的实用信息。 ... [详细]
  • 本文总结了近年来在实际项目中使用消息中间件的经验和常见问题,旨在为Java初学者和中级开发者提供实用的参考。文章详细介绍了消息中间件在分布式系统中的作用,以及如何通过消息中间件实现高可用性和可扩展性。 ... [详细]
  • CentOS7通过RealVNC实现多人使用服务器桌面
    背景:公司研发团队通过VNC登录到CentOS服务器的桌面实现软件开发工作为防止数据外泄,需要在RealVNC设置禁止传输文件、访问粘贴板等策略过程&# ... [详细]
  • 本文详细介绍了Sleep函数的基本概念、使用方法及其背后的实现原理。适合对Sleep函数的使用和实现感兴趣的开发者阅读。通过本文,您将了解如何在不同操作系统中使用Sleep函数,以及其在多线程编程中的重要性。 ... [详细]
  • Ubuntu 14.04 系统安装后网卡名称修改方法
    本文介绍了在安装 Ubuntu 14.04 Server 版本后,如何将默认的网卡名称从非 eth 格式修改为传统的 eth 格式,并提供了详细的步骤和示例。 ... [详细]
  • 1.前言PAP和CHAP协议是目前的在PPP(MODEM或ADSL拨号)中普遍使用的认证协议,CHAP在RFC1994中定义,是一种挑战响应式协议&#x ... [详细]
  • Vulnhub DC3 实战记录与分析
    本文记录了在 Vulnhub DC3 靶机上的渗透测试过程,包括漏洞利用、内核提权等关键步骤,并总结了实战经验和教训。 ... [详细]
  • 本文介绍了如何在Linux系统中获取库源码,并在从源代码编译软件时收集所需的依赖项列表。 ... [详细]
  • 对象存储与块存储、文件存储等对比
    看到一篇文档,讲对象存储,好奇,搜索文章,摘抄,学习记录!背景:传统存储在面对海量非结构化数据时,在存储、分享与容灾上面临很大的挑战,主要表现在以下几个方面:传统存储并非为非结 ... [详细]
author-avatar
喝咖啡的小南瓜_488
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有