pcie reset系列之 内核框架
FLR是pci reset的一种。
关于FLR的寄存器操作比较简单, 相关的寄存器有:
配置空间里device cap里的FLR capability bit, 这个表示设备是否支持FLR。
配置空间里device control里的BCR_FLR bit, 写这个bit可以触发FLR。
调用函数检测是否支持FLR:
/* drivers/pci/pci.c */ pcie_has_flr(struct pci_dev *dev)
Linux kernel里pcie_flr会被下面的函数调用到, 触发FLR
/* drivers/pci/pci.c: below tree functions will call __pci_reset_function_locked */
pci_reset_function(struct pci_dev *dev)
pci_reset_function_locked(struct pci_dev *dev)
pci_try_reset_function(struct pci_dev *dev)
=> __pci_reset_function_locked(struct pci_dev *dev)
-> pcie_flr(struct pci_dev *dev)
执行 __pci_reset_function_locked 的时候,6.2内核提供的reset方法有:
/* dev->reset_methods[] is a 0-terminated list of indices into this array */ static const struct pci_reset_fn_method pci_reset_fn_methods[] = { { }, { pci_dev_specific_reset, .name = "device_specific" }, { pci_dev_acpi_reset, .name = "acpi" }, { pcie_reset_flr, .name = "flr" }, { pci_af_flr, .name = "af_flr" }, { pci_pm_reset, .name = "pm" }, { pci_reset_bus_function, .name = "bus" }, };
那么这些reset的优先级,是从数组下标小的,优先级就高。在4.19的内核中,并没有做成table,但顺序是一样的。
且前面reset只要返回不是 -ENOTTY,则不会执行后面的reset。
首先,暴露给用户态的接口,通过这个设备的sysfs接口可以触发FLR:
/* drivers/pci/pci-sysfs.c */ reset_store -> pci_reset_function(struct pci_dev *dev)
另外,vfio里也提供的接口,可以供给用户态触发FLR。这些接口包括,vfio设备的enable,
disable, 以及一个vfio设备相关的ioctl。
`
/* drivers/vfio/pci/vfio_pci_config.c */
vfio_exp_config_write
-> pci_try_reset_function
/* drivers/vfio/pci/vfio_pci.c */
vfio_pci_enable
vfio_pci_disable
vfio_pci_ioctl (cmd == VFIO_DEVICE_RESET)
=> pci_try_reset_function(pdev);
`
单独的FLR操作需要配合整个reset流程工作, 在上面的调用pcie_flr的函数里,他们基本
的处理流程都是, 先做reset_prepare, 再触发FLR,最后做reset后的恢复:
`
the logic of pci_reset_function and its brother functions are:
- reset_prepare
- flr operation if supporting flr
- reset_done
reset_prepare and reset_done callbacks are stored in pci_driver’s pci_error_handlers,大多数驱动注册了pci_error_handler,但很多没有实现prepare。
these callbacks should be offered by your device driver:
驱动中的函数:
struct pci_driver {
...
const struct pci_error_handlers {
...
void (*reset_prepare)(struct pci_dev dev);
void (reset_done)(struct pci_dev *dev);
...
}
...
}
`
从上面的代码分析中可以看出,linux内核中的flr流程并不涉及到软件中设备结构的销毁.包括驱动资源的释放。
所以,只要在发生flr这段时间不去下发硬件请求,如果用lspci看,设备理论上会一直都在。对于使能了sriov的硬件,
在实现flr的时候,如果对pf执行flr,在硬件层面都有pf到vf的通知方式, 包括业务黑洞的设置,这样可以保证在pf flr时候通知到
flr做必要的处理,当pf flr完成后,可以通知vf驱动做必要的硬件配置上的恢复。
如果只是flr 某一个vf,不应该影响到其他vf的业务流。
注意,这个跟pcie g5 spec有一些相差。
pcie reset系列之 内核框架的更多相关文章
- Sql Server来龙去脉系列之二 框架和配置
本节主要讲维持数据的元数据,以及数据库框架结构.内存管理.系统配置等.这些技术点在我们使用数据库时很少接触到,但如果要深入学习Sql Server这一章节也是不得不看.本人能力有限不能把所有核心的知识 ...
- Winform开发框架之客户关系管理系统(CRM)的开发总结系列2-基于框架的开发过程
在上篇随笔<Winform开发框架之客户关系管理系统(CRM)的开发总结系列1-界面功能展示>中介绍了我的整个CRM系统的概貌,本篇继续本系列的文章,介绍如何基于我的<winform ...
- Java 集合系列 01 总体框架
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- Windows 8实例教程系列 - 理解应用框架
原文:Windows 8实例教程系列 - 理解应用框架 Windows 操作系统之所以风靡世界,是因为其“易学易用”,从用户的角度出发,让数以万计的非IT人员使用计算机实现娱乐,工作等目的.Windo ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 (2 ...
- asp.net core 系列 8 Razor框架路由(下)
三.页面路由操作约定 接着上篇讲asp.net core 系列 7 Razor框架路由.在上篇继续第三节 "页面路由操作约定" 的最后一小节 AddPageRoute . 3.3. ...
- SpringBoot系列之日志框架使用教程
目录 1.SpringBoot日志级别 1).日志级别简介 2).默认日志级别 3).配置日志级别 4).日志分组设置 2.SpringBoot日志格式设置 1).默认格式原理简介 2).默认日志格式 ...
- SpringBoot系列之日志框架介绍及其原理简介
SpringBoot系列之日志框架介绍及其原理简介 1.常用日志框架简介 市面上常用日志框架:JUL.JCL.jboss-logging.logback.log4j.log4j2.slf4j.etc. ...
- .NET面试题系列[1] - .NET框架基础知识(1)
很明显,CLS是CTS的一个子集,而且是最小的子集. - 张子阳 .NET框架基础知识(1) 参考资料: http://www.tracefact.net/CLR-and-Framework/DotN ...
- NIO系列1:框架拆解
最近一年用NIO写了不少网络程序,也研究了一些开源NIO网络框架netty.mina等,总结了一下NIO的架构特点. 无论是netty还是mina它们都在java原生NIO的基础上进行了完善的封装,虽 ...
随机推荐
- w11修改ie保护模式方法
IE安全设置下有4个区域 对应的设置在不同的注册表中.[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Set ...
- 【云享专刊】开源遇上华为云,OCP架构变身“云原生框架”
摘要:华为云DTSE团队出品云原生改造指南,助力轻松实践OCP上云. 本文分享自华为云社区<[云享专刊]开源遇上华为云,OCP架构变身"云原生框架">,作者:华为云社区 ...
- xtrabackup: error: xb_load_tablespaces() failed with error code 57
问题描述:在数据库上运行xtrabackup备份脚本出现的一些报错 DB_version:mysql8.0.26 Xtrabackup:percona-xtrabackup-8.0.27-19-Lin ...
- RDIFramework.NET代码生成器全新V5.1版本发布
RDIFramework.NET代码生成器介绍 RDIFramework.NET代码生成器,代码.文档一键生成. RDIFramework.NET代码生成器集代码生成.各数据库对象文档生成.数据库常用 ...
- shell脚本编程(一)
c81ba641-5ed7-4ab9-a7c0-e319e0f3890b 初识shell脚本编程 最近项目需求,需要了解下shell脚本编程,所以自己就必须玩玩了= = 初识shell脚本编程,找了几 ...
- vivo 推送系统的容灾建设与实践
作者:vivo 互联网服务器团队 - Yu Quan 本文介绍了推送系统容灾建设和关键技术方案,以及实践过程中的思考与挑战. 一.推送系统介绍 vivo推送平台是vivo公司向开发者提供的消息推送服务 ...
- css 文本超出,显示省略号
单行文本省略号 显示省略号 text-overflow: ellipsis; overflow: hidden; max-width: 110px; 文本不换行 wor ...
- mac 如何快捷键打开当前文件夹对应的终端窗口
- 2022-06-10:薯队长从北向南穿过一片红薯地(南北长M,东西宽N),红薯地被划分为1x1的方格, 他可以从北边的任何一个格子出发,到达南边的任何一个格子, 但每一步只能走到东南、正南、西南方向的
2022-06-10:薯队长从北向南穿过一片红薯地(南北长M,东西宽N),红薯地被划分为1x1的方格, 他可以从北边的任何一个格子出发,到达南边的任何一个格子, 但每一步只能走到东南.正南.西南方向的 ...
- 函数strncpy和memcpy的区别
1定义 1.1 memcpy void *memcpy(void *destin, void *source, unsigned n); 参数 *destin ---- 需要粘贴的新数据(地址) *s ...