FUA,冲洗和订购

FUA, flush and ordering

A FUA 命令通常意味着数据需要在信号完成之前提交给 NVM

根据我的理解,FUA命令之前没有要求将数据刷新到NVM

1。 如果我们有 LBA0(缓存),LBA1(缓存),LBA0 带 FUA,

是否可以先完成带有FUA 的LBA0,然后再完成Cache 中的LBA0? 两者有顺序要求吗?

2。 同样,如果我们有命令:

Write LBA0 with X

Write LBA1 with Y

Write LBA0 with Z and FUA is set. 

READ LBA0 

可以读取 LBA0 return X 或 Z?


3。 另一个问题是关于FLUSH的:

如果flush自带一个数据:

写入缓存中的数据必须在执行标记为 Flush 的 BIO 之前提交。

如果 FS 问题:

WRITE LBA0 with X (1) 

FLUSH

WRITE LBA0 with Y (2)

如果 (2) 在 FLUSH 完成后发出,则保证顺序。 但是,如果 (2) 在 FLUSH 完成之前发出,那么两者都在飞行命令中,(2) 可以在 FLUSH 之前完成吗?

我的理解是 Linux 内核处理块 I/O 障碍的当前状态由 https://lwn.net/Articles/400541/

描述

也就是说,排队的请求(无论是软件还是硬件(NCQ、TCQ))通常是无序的,内核或硬件可以自由地以任何顺序处理它们。如果需要排序,更高层(例如文件系统)负责等待完成。

比如说,如果文件系统想要在写入日志提交记录 X 之前将 A、B、C 写入磁盘,它必须执行类似

的操作
  1. 提交 A、B、C
  2. 等待A、B、C完成
  3. 发出 FLUSH(确保 A、B、C 从磁盘缓存转到持久存储)
  4. 设置 FUA 位写入 X
    • 或者,如果硬件不支持 FUA,可以通过以下方式模拟
      1. 写 X
      2. 等待 X 完成
      3. 发出 FLUSH

现在,针对您的问题:

  1. 没有,没有订购要求

  2. 未指定。

  3. 我不确定,但我相信 FLUSH 是无序的,就像其他命令一样。