NVDIMM 运行时固件激活¶
一些持久性内存设备在设备/“DIMM”本地运行固件,以执行诸如媒体管理、容量配置和健康监控之类的任务。 更新该固件的过程通常涉及重新启动,因为它对正在进行的内存事务有影响。 但是,重新启动具有破坏性,并且至少 Intel 持久性内存平台实现(由 Intel 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”触发内核在相当于休眠“freeze”状态下运行固件激活,在该状态下通知驱动程序和应用程序停止修改系统内存。 值“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:运行时固件激活失败,但仍然可以通过电源循环系统的旧方法激活固件。