NVDIMM 运行时固件激活

某些持久性内存设备在设备/“DIMM”上本地运行固件,以执行诸如介质管理、容量配置和健康状况监控等任务。更新该固件的过程通常涉及重新启动,因为它会影响正在进行的内存事务。但是,重新启动是破坏性的,并且至少英特尔持久性内存平台实现(由英特尔 ACPI DSM 规范 [1] 描述)已添加对在运行时激活固件的支持。

libnvdimm 中实现了一个本地 sysfs 接口,以允许平台通告和控制其本地运行时固件激活功能。

libnvdimm 总线对象 ndbusX 实现一个 ndbusX/firmware/activate 属性,该属性将固件激活的状态显示为“idle”、“armed”、“overflow”和“busy”之一。

  • idle:未设置/准备激活固件的设备

  • armed:至少有一个设备已准备好

  • busy:在忙碌状态下,准备好的设备正在转换回空闲状态并完成激活周期。

  • overflow:如果平台具有执行激活所需的增量工作的概念,则可能会出现太多 DIMM 被准备激活的情况。在这种情况下,“overflow”状态指示固件激活超时的可能性。

可以使用值“live”或“quiesce”写入“ndbusX/firmware/activate”属性。值“quiesce”会触发内核在休眠“冻结”状态的等效项中运行固件激活,其中通知驱动程序和应用程序停止修改系统内存。值“live”会在没有此休眠周期的情况下尝试固件激活。如果未检测到任何固件激活功能,“ndbusX/firmware/activate”属性将完全省略。

另一个属性“ndbusX/firmware/capability”指示值“live”或“quiesce”,其中“live”表示固件不需要或不会在系统上施加任何静止期来更新固件。功能值“quiesce”表示固件确实需要并为内存控制器注入一个静止期,但仍可以将“live”写入“ndbusX/firmware/activate”以覆盖与正在进行的设备和应用程序活动竞争固件更新的风险。如果未检测到任何固件激活功能,“ndbusX/firmware/capability”属性将完全省略。

libnvdimm 内存设备/DIMM 对象 nmemX 实现“nmemX/firmware/activate”和“nmemX/firmware/result”属性来传达每个设备的固件激活状态。与“ndbusX/firmware/activate”属性类似,“nmemX/firmware/activate”属性指示“idle”、“armed”或“busy”。当系统准备激活固件、固件暂存 + 状态设置为“armed”并且触发“ndbusX/firmware/activate”时,状态从“armed”转换为“idle”。在该激活事件之后,nmemX/firmware/result 属性反映了上次激活的状态,如下所示:

  • none:自上次设备重置以来未触发运行时激活

  • success:上次运行时激活成功完成。

  • fail:由于设备特定的原因,上次运行时激活失败。

  • not_staged:上次运行时激活失败,原因是固件映像未暂存的排序错误。

  • need_reset:运行时固件激活失败,但仍可以通过系统断电重启的传统方法激活固件。

[1]:https://docs.pmem.io/persistent-memory/