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系列之 内核框架的更多相关文章

  1. Sql Server来龙去脉系列之二 框架和配置

    本节主要讲维持数据的元数据,以及数据库框架结构.内存管理.系统配置等.这些技术点在我们使用数据库时很少接触到,但如果要深入学习Sql Server这一章节也是不得不看.本人能力有限不能把所有核心的知识 ...

  2. Winform开发框架之客户关系管理系统(CRM)的开发总结系列2-基于框架的开发过程

    在上篇随笔<Winform开发框架之客户关系管理系统(CRM)的开发总结系列1-界面功能展示>中介绍了我的整个CRM系统的概貌,本篇继续本系列的文章,介绍如何基于我的<winform ...

  3. Java 集合系列 01 总体框架

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  4. Windows 8实例教程系列 - 理解应用框架

    原文:Windows 8实例教程系列 - 理解应用框架 Windows 操作系统之所以风靡世界,是因为其“易学易用”,从用户的角度出发,让数以万计的非IT人员使用计算机实现娱乐,工作等目的.Windo ...

  5. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建    ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2 ...

  6. asp.net core 系列 8 Razor框架路由(下)

    三.页面路由操作约定 接着上篇讲asp.net core 系列 7 Razor框架路由.在上篇继续第三节 "页面路由操作约定" 的最后一小节 AddPageRoute . 3.3. ...

  7. SpringBoot系列之日志框架使用教程

    目录 1.SpringBoot日志级别 1).日志级别简介 2).默认日志级别 3).配置日志级别 4).日志分组设置 2.SpringBoot日志格式设置 1).默认格式原理简介 2).默认日志格式 ...

  8. SpringBoot系列之日志框架介绍及其原理简介

    SpringBoot系列之日志框架介绍及其原理简介 1.常用日志框架简介 市面上常用日志框架:JUL.JCL.jboss-logging.logback.log4j.log4j2.slf4j.etc. ...

  9. .NET面试题系列[1] - .NET框架基础知识(1)

    很明显,CLS是CTS的一个子集,而且是最小的子集. - 张子阳 .NET框架基础知识(1) 参考资料: http://www.tracefact.net/CLR-and-Framework/DotN ...

  10. NIO系列1:框架拆解

    最近一年用NIO写了不少网络程序,也研究了一些开源NIO网络框架netty.mina等,总结了一下NIO的架构特点. 无论是netty还是mina它们都在java原生NIO的基础上进行了完善的封装,虽 ...

随机推荐

  1. AWS IAM介绍

    前言 AWS是世界上最大的云服务提供商,它提供了很多组件供消费者使用,其中进行访问控制的组件叫做IAM(Identity and Access Management), 用来进行身份验证和对AWS资源 ...

  2. Git链接上游仓库

    技术背景 在Git的操作过程中,一般的组织内部工作模式可以在同一个仓库上的master-develop-feature不同分支上进行开发,也有一些人和外部协作者会通过Fork到自己本地的仓库进行更新的 ...

  3. 京东获得店铺的所有商品API接口(item_search_shop-获得店铺的所有商品)

    京东获得店铺的所有商品API接口(item_search_shop-获得店铺的所有商品)接口展示说明及教程: 公共参数 名称 类型 必须 描述key String 是 调用key(必须以GET方式拼接 ...

  4. 系统优化脚本支持Ubuntu和CentOS

    系统优化脚本支持Ubuntu和CentOS 经常会部署各种用途的操作系统,但在这些工作中,我们会发现很多工作其实是重复性的劳动,操作的内容也是大同小异,基于这类情况,我们可以把相同的操作做成统一执行的 ...

  5. 在idea中将一个javase项目转成ee项目

    在idea中将java项目转成web项目 1.创建一个java项目,new一个directory名为web(与src同级) 2. 为web指定根目录:ctrl+shift+alt+s,在module中 ...

  6. Redis性能瓶颈揭秘:如何优化大key问题?

    1. 什么是Redis大key问题 Redis大key问题指的是某个key对应的value值所占的内存空间比较大,导致Redis的性能下降.内存不足.数据不均衡以及主从同步延迟等问题. 到底多大的数据 ...

  7. Java SpringBoot 加载 yml 配置文件中字典项

    将字典数据,配置在 yml 文件中,通过加载yml将数据加载到 Map中 Spring Boot 中 yml 配置.引用其它 yml 中的配置.# 在配置文件目录(如:resources)下新建app ...

  8. PowerBI(一) : 如何将powerBI报表嵌入内部web应用程序?

    最近做了一个PowerBI报表嵌入内部web应用系统的项目,分享一下主要步骤以及踩坑记录. 微软官网完整教程这里:https://learn.microsoft.com/zh-cn/power-bi/ ...

  9. 2023-02-23:请用go语言调用ffmpeg,解码mp4文件并保存为YUV420P格式文件。

    2023-02-23:请用go语言调用ffmpeg,解码mp4文件并保存为YUV420P格式文件. 答案2023-02-23: 使用 github.com/moonfdd/ffmpeg-go 库. 解 ...

  10. 2020-11-06:go中,谈一下调度器。

    福哥答案2020-11-06:·MPG模型:goroutine的并发模型可以归纳为MPG模型:·MPG概念:线程(machine,系统线程,物理线程)-内核(processor)-协程(gorouti ...