@@ -9,6 +9,19 @@
#include "private.h"
#include "hyperv.h"
+static bool hyperv_cmd_is_supported(struct ndctl_dimm *dimm, int cmd)
+{
+ /*
+ * "ndctl monitor" requires ND_CMD_SMART, which is not really supported
+ * by Hyper-V virtual NVDIMM. Nevertheless, ND_CMD_SMART can be emulated
+ * by ND_HYPERV_CMD_GET_HEALTH_INFO and ND_HYPERV_CMD_GET_SHUTDOWN_INFO.
+ */
+ if (cmd == ND_CMD_SMART )
+ return true;
+
+ return !!(dimm->cmd_mask & (1ULL << cmd));
+}
+
static struct ndctl_cmd *alloc_hyperv_cmd(struct ndctl_dimm *dimm,
unsigned int command)
{
@@ -161,6 +174,7 @@ static int hyperv_cmd_xlat_firmware_status(struct ndctl_cmd *cmd)
}
struct ndctl_dimm_ops * const hyperv_dimm_ops = &(struct ndctl_dimm_ops) {
+ .cmd_is_supported = hyperv_cmd_is_supported,
.new_smart = hyperv_dimm_cmd_new_smart,
.smart_get_flags = hyperv_cmd_get_flags,
.smart_get_health = hyperv_cmd_get_health,
Currently "ndctl monitor" fails for Hyper-V virtual NVDIMM due to "no smart support". According to http://www.uefi.org/RFIC_LIST ("Virtual NVDIMM 0x1901"), Hyper-V doesn't really support ND_CMD_SMART, but it supports "Get Health Information (Function Index 1)" and "Get Unsafe Shutdown Count (Function Index 2)", which is basically a "weak" variant of ND_CMD_SMART. Implement the dimm-ops to allow "ndctl monitor" to work with Hyper-V NVDIMM. Now when an error happens, "ndctl monitor" can show such a line: {"timestamp":"1550547497.431731497","pid":1571,"event": {"dimm-health-state":true},"dimm":{"dev":"nmem1", "id":"04d5-01-1701-01000000","handle":1,"phys_id":0, "health":{"health_state":"fatal","shutdown_count":8}}} Here the meaningful info is: "health":{"health_state":"fatal","shutdown_count":8} Signed-off-by: Dexuan Cui <decui@microsoft.com> --- ndctl/lib/hyperv.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+)