PCIE协议-2-事务层规范-Transaction Ordering

news2024/9/23 3:20:00

2.4.1 事务排序规则

表2-40定义了PCI Express事务的排序要求。此表中定义的规则适用于PCI Express上的所有事务类型,包括内存、I/O、配置和消息事务。在单个流量类别(Traffic Class,TC)内,这些排序规则适用。不同TC标签之间的事务没有排序要求。请注意,这也意味着通过不同虚拟通道传输的流量之间也没有排序要求,因为具有相同TC标签的事务不允许被映射到任何PCI Express链路上的多个虚拟通道上。

对于表2-40,列代表首次发出的事务,行代表随后发出的事务。表中的条目指示两个事务之间的排序关系。表项定义如下:

Yes   第二个事务(行)必须被允许通过第一个(列),以避免死锁。(当发生阻塞时,第二个事务需要通过第一个事务。必须理解公平性以防止饥饿。)

Y/N   没有要求。第二个事务可以选择性地通过第一个事务,或者被它阻塞。

No  第二个事务不得被允许通过第一个事务。这是为了支持生产者/消费者强排序模型所必需的。

表2-40中行列标题的解释:

  • A Posted Request(转发请求)是指内存写请求或消息请求。
  • A Read Request(读请求)是指配置读取请求、I/O读取请求或内存读取请求。
  • An NPR (Non-Posted Request) with Data(带有数据的非转发请求)是指配置写请求、I/O写请求或原子操作请求。
  • A Non-Posted Request(非转发请求)是指读取请求或带有数据的非转发请求。

表2-40中条目的说明:

  • A2a:转发请求不得通过另一个转发请求,除非A2b适用。
  • A2b:如果设置了RO,则允许转发请求通过另一个转发请求。如果设置了IDO,并且两个请求者的ID不同,或者两个请求都包含PASID TLP前缀且两个PASID值不同,则允许转发请求通过另一个转发请求。
  • A3, A4:为了避免死锁,转发请求必须能够通过非转发请求。
  • A5a:转发请求被允许通过完成事务,但除非A5b适用,否则不必能够通过完成事务。
  • A5b:在PCI Express到PCI/PCI-X桥接器中,如果PCI/PCI-X总线段以传统PCI模式运行,对于PCI Express到PCI方向的事务,为了避免死锁,转发请求必须能够通过完成事务。
  • B2a:除非B2b适用,读取请求不得通过转发请求。
  • B2b:如果设置了IDO,并且两个请求者的ID不同,或者两个请求都包含PASID TLP前缀且两个PSID值不同,则允许读取请求通过转发请求。
  • C2a:除非C2b适用,带有数据的非转发请求不得通过转发请求。
  • C2b:设置了“RO”的带有数据的非转发请求(NPR)被允许通过转发请求。如果设置了“IDO”,并且两个请求者的ID不同,或者两个请求都包含PASID TLP前缀且两个PASID值不同,则允许通过转发请求。

  • B3, B4, C3, C4:非转发请求被允许通过另一个非转发请求。

  • B5, C5:非转发请求被允许通过完成事务。

  • D2a:除非D2b适用,完成事务不得通过已转发请求。

  • D2b:允许I/O或配置写入完成事务通过转发请求。如果设置了RO,则允许完成事务通过转发请求。如果设置了IDO,并且完成事务的完成者ID与转发请求的请求者ID不同,则允许完成事务通过转发请求。

  • D3, D4:为了避免死锁,完成事务必须能够通过非转发请求。

  • D5a:具有不同事务ID的完成事务被允许相互通过。

  • D5b:具有相同事务ID的完成事务不得相互通过。这确保了与单个内存读取请求关联的多个完成事务将保持地址升序排列。

  • 附加规则:

    • 允许PCI Express Switch去允许设置了宽松排序位的内存写入或消息请求通过任何之前转发的、在同一方向前进的内存写入或消息请求。Switch必须不修改转发宽松排序属性。也允许根复合体去允许请求中的数据字节以任何顺序写入系统内存(字节必须写入正确的系统内存位置。只有写入它们的顺序是未指定的)。
    • 对于根复合体和Switch,禁止内存写入合并(如[PCI]中定义)。
      • 请注意:这是必要的,以便设备可以优化其接收缓冲区和控制逻辑,以匹配它们自然预期的内存写入大小,而不是必须支持最大可能的内存写入负载大小。
    • 禁止合并内存读取请求和/或不同请求的完成事务。
    • 不监听位不影响所需的排序行为。
    • 对于根端口和Switch下游端口,接受转发请求或完成事务不得依赖于同一流量类别内非转发请求的传输。
    • 对于Switch上游端口,接受转发请求或完成事务不得依赖于下游端口内同一流量类别的非转发请求的传输。
    • 对于端点(Endpoint)、桥接器(Bridge)和交换机上游端口(Switch Upstream Ports),接受转发请求(Posted Request)不得依赖于同一上游端口(Upstream Port)内同一流量类别(Traffic Class)中传输的任何事务层包(TLP)。

    • 对于端点、桥接器和交换机上游端口,接受非转发请求(Non-posted Request)不得依赖于同一上游端口内同一流量类别中传输的非转发请求。

    • 对于端点、桥接器和交换机上游端口,接受完成事务(Completion)不得依赖于同一上游端口内同一流量类别中传输的任何TLP。

    • 请注意,端点(Endpoints)永远不允许阻止接受完成事务。

    • 针对非转发请求发出的完成事务必须返回与相应非转发请求相同的流量类别。

      • 支持点对点操作的根复合体(Root Complexes)和交换机必须对所有转发的流量强制执行这些事务排序规则。

      • 为确保无死锁操作,设备不应将流量从一个虚拟通道(Virtual Channel)转发到另一个虚拟通道。在设备转发或转换虚拟通道之间的事务时避免死锁的约束规范不在本文档范围内(有关相关议题的讨论,请参阅附录D)。

2.4.2 读取事务观察到的更新排序和粒度

如果请求者(Requester)使用单个事务从完成者(Completer)读取数据块,而完成者的数据缓冲区同时正在被更新,那么在读取返回的数据中反映的多个更新的排序和每个更新的粒度不在本规范的范围之内。这既适用于通过PCI Express写入事务执行的更新,也适用于通过其他机制(如主机CPU更新主机内存)执行的更新。

如果请求者使用单个事务从完成者读取数据块,而完成者的数据缓冲区同时正在被一个或多个不在PCI Express结构上的实体更新,那么在读取返回的数据中反映的多个更新的排序和每个更新的粒度也不在本规范的范围之内。

以更新排序为例,假设数据块位于主机内存中,主机CPU首先写入位置A,然后写入不同的位置B。使用单个读取事务读取该数据块的请求者不能保证按顺序观察这些更新。换句话说,请求者可能会观察到位置B的更新值和位置A的旧值,而不管位置A和B在数据块内的排列如何。除非完成者就更新排序作出自己的保证(在本规范之外),否则依赖于更新排序的请求者必须先通过一个读取事务观察位置B的更新,然后再发起对位置A的后续读取以返回其更新值。 以更新粒度为例,如果主机CPU向主机内存写入一个四字(QW),从主机内存读取该四字的请求者可能会观察到四字的一部分被更新,而另一部分包含旧值。

虽然本规范不要求,但强烈建议主机平台保证,当主机CPU向主机内存写入对齐的双字(DW)或对齐的四字(QW)时,PCI Express读取观察到的更新粒度不会小于双字。

2.4.3 写入事务提供的更新排序和粒度

如果完成者接受了包含多个双字(DWs)且清除了宽松排序位(Relaxed Ordering bit)的单个写入事务,那么在完成者的数据缓冲区内对位置的更新观察到的排序必须按递增地址顺序。如果路径上的PCI或PCI-X桥接器将多个写入事务合并为单个事务,这种语义是必需的。然而,对完成者数据缓冲区的更新观察到的粒度不在本规范的范围之内。

虽然本规范不要求,但强烈建议主机平台保证当PCI Express写入更新主机内存时,主机CPU观察到的更新粒度不会小于双字(DW)。

以更新排序和粒度为例,如果请求者向主机内存写入一个四字(QW),在某些情况下,主机CPU从主机内存读取该四字时可能会观察到第一个双字已更新,而第二个双字包含旧值。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1679630.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VUE之旅—day2

文章目录 Vue生命周期和生命周期的四个阶段created应用—新闻列表渲染mounted应用—进入页面搜索框就获得焦点账单统计(Echarts可视化图表渲染) Vue生命周期和生命周期的四个阶段 思考: 什么时候可以发送初始化渲染请求?&#xff…

经验分享智能产品从0到1全流程

大家好,今天继续分享文章,这篇文章在网络上搜索资料时,有感而发,分享一个智能产品从0到1的整个生命周期中需要经历哪些阶段,我这里以开发一个mini补光灯为例,深入探索各个阶段可能涉及的具体活动和考虑事项…

记录计全支付切换到RabbitMQ时启动报错的问题

记录计全支付切换到RabbitMQ时启动报错的问题 首先在application.yml中切换到RabbitMQ配置安装RabbitMQ、Erlang、延时插件 rabbitmq_delayed_message_exchange,延迟插件必装 首先在application.yml中切换到RabbitMQ配置 # 第一处rabbitmq:addresses: 127.0.0.1:56…

TRL校准和De-embedding的区别以及如何操作?

Fiture的性能可以在测试前利用TRL校准件移除掉,但是TRL的步骤比较繁琐或者说TRL校准件(包含直通、反射、多条Line)很难设计(如果做到很高的频率对设计和加工制造的要求都很高),此时可以选择只做一根2x Through(直通件&…

电脑常用的PDF阅读器-嗨动PDF编辑器!带你详细了解它

电脑常用的PDF阅读器-嗨动PDF编辑器!在数字化信息爆炸的时代,PDF格式的文件因其易于打印和保留原始格式等优点,成为了人们日常工作和学习的常用格式。而对于PDF文件的处理,一款功能强大、操作简便的PDF阅读器是必不可少的。今天&a…

世界500强企业建设软件开发安全体系,打造DevSecOps示范标杆

某世界500强企业旗下拥有众多知名汽车品牌,业务涵盖出行服务、科技创新、金融服务、教育等。该集团一直专注于技术创新和人才培养,同时也是国内第一批倡议并践行“数字化转型”的汽车行业企业。 数智化建设转型,研发安全体系建设势在必行 在…

C#【进阶】委托和事件

委托和事件 文章目录 1、委托1、委托概念2、基本语法3、定义自定义委托4、使用自定义委托5、委托变量可以存储多个函数6、系统定义好的委托思考 怪物死亡数据更新 2、事件1、事件概念2、事件的使用3、为什么有事件思考 热水器 3、匿名函数1、匿名函数概念2、基本语法3、使用4、…

27_Scala功能函数

文章目录 功能函数1.功能函数处理集合数据2.扁平化操作3.按照指定条件将数据集中的数据进行过滤4.集合通过 自定义函数进行分组5.mapValues6.sortBy函数 功能函数 1.功能函数处理集合数据 –集合的功能函数 map List --> map( logical ) --> newList–实现一个不确定的…

Blender雕刻建模流程

1.构形 先构造一个大致相像的外形 可使用的方法包含 -多边形:表面细分,布尔 -曲线:曲线倒角 -融球(使用较少) -曲面(使用较少) 构形之后的准备 -应用缩放 -应用修改器 -曲线转网格 1.1…

8个迹象表明你需要一台新笔记本电脑,看一下你的笔记本是否有其中一个

序言 当你第一次打开你的笔记本电脑的盒子时,它会以最高性能运行,电池寿命更长,过热最小,资源使用效率高。然而,随着笔记本电脑的老化,它将不能满足预期用途。以下几个迹象表明,可能是时候寻找并投资一款新设备了。 你的设备不再具有预期用途 如果你的笔记本电脑不再…

战网国际服注册教程 暴雪战网国际服账号注册一站式教程分享

战网国际版,也即Battle.net环球版,是由暴雪娱乐操刀的全球化游戏交流枢纽,它突破地理限制,拥抱全世界的游戏玩家。与仅限特定地区的版本不同,国际版为玩家开辟了无障碍通道,让他们得以自由探索暴雪庞大游戏…

MacOS docker 安装与配置

orbstack 安装 官网: https://orbstack.dev 下载链接:Download OrbStack Fast, light, simple Docker Desktop alternative 选择是Apple M系列处理器, 或 Intel系列处理器 到这里就安装好了Orbstack软件,下面开始配置docker 下…

C语言/数据结构——栈的实现

一.前言 今天我们讲解新的领域——栈。 二.正文 1.栈 1.1栈的概念及结构 栈:一种特殊的线性表,其允许在固定的一段进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#…

css笔记总结2

找到所有的 h1 标签。 选择器(选对人) 设置这些标签的样式,比如颜色为红色(做对事)。 ##css基础选择器 基础选择器又包括:标签选择器、类选择器、id 选择器和通配符选择器 ###标签选择器: 标签…

PostgreSQL(十二)报错:Tried to send an out-of-range integer as a 2-byte value: 51000

目录 一、报错场景二、源码分析三、实际原因(更加复杂)四、解决思路 一、报错场景 今天写了一个历史数据处理程序,在开发环境、测试环境都可以正常执行,但是放到生产环境上就不行,报了一个这样的错误: or…

【SpringBoot】SpringBoot整合jasypt进行重要数据加密

📝个人主页:哈__ 期待您的关注 目录 📕jasypt简介 🔥SpringBoot使用jasypt 📂创建我需要的数据库文件 📕引入依赖 🔓配置数据库文件(先不进行加密) 🌙创…

十二.吊打面试官系列-JVM优化-深入JVM内存模型

JVM内存模型 1.JVM的组成 整个JVM组成由 :运行时数据区 , 类加载子系统 , 执行引擎 , 本地方法库 几部分组成 上面是Java7的内存模型,Java8以后做了一些调整,把方法区变成了元空间,元空间不在…

Linux 第三十三章

🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C,linux 🔥座右铭:“不要等到什么都没有了…

Golang | Leetcode Golang题解之第80题删除有序数组中的重复项II

题目&#xff1a; 题解&#xff1a; func removeDuplicates(nums []int) int {n : len(nums)if n < 2 {return n}slow, fast : 2, 2for fast < n {if nums[slow-2] ! nums[fast] {nums[slow] nums[fast]slow}fast}return slow }

1、sql server数据库进行sql注入

靶机取自&#xff1a;墨者sql server 1、判断数据库类型 抓包知sql server&#xff0c;所以注入语句跟MySQL有些区别 2、判断注入点 “http://219.153.49.228:42514/new_list.asp?id2 ”&#xff0c;当id2 and 11时显示正确&#xff0c;id2 and 12时页面报错。 3、确定列…