热门标签 | 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机制隔离设备(冻结设备)。通常,在发生这种情况后,操作系统会尝试取消冻结并重置设备,但是由于许多原因,这可能会失败,尤其是在较旧的内核上。


推荐阅读
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 近年来,大数据成为互联网世界的新宠儿,被列入阿里巴巴、谷歌等公司的战略规划中,也在政府报告中频繁提及。据《大数据人才报告》显示,目前全国大数据人才仅46万,未来3-5年将出现高达150万的人才缺口。根据领英报告,数据剖析人才供应指数最低,且跳槽速度最快。中国商业结合会数据剖析专业委员会统计显示,未来中国基础性数据剖析人才缺口将高达1400万。目前BAT企业中,60%以上的招聘职位都是针对大数据人才的。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文主要讨论了在xps15上安装双系统win10和MacOS后,win10无法正常更新的问题。分析了可能的引导问题,并提供了解决方法。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • 树莓派Linux基础(一):查看文件系统的命令行操作
    本文介绍了在树莓派上通过SSH服务使用命令行查看文件系统的操作,包括cd命令用于变更目录、pwd命令用于显示当前目录位置、ls命令用于显示文件和目录列表。详细讲解了这些命令的使用方法和注意事项。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 后台自动化测试与持续部署实践
    后台自动化测试与持续部署实践https:mp.weixin.qq.comslqwGUCKZM0AvEw_xh-7BDA后台自动化测试与持续部署实践原创 腾讯程序员 腾讯技术工程 2 ... [详细]
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社区 版权所有