On 1/14/21 8:22 AM, zhenwei pi wrote: > There is a very low probability that hitting physical NVMe disk > hardware critical warning case, it's hard to write & test a monitor > agent service. > > For debugging purposes, add a new 'smart_critical_warning' property > to emulate this situation. > > The orignal version of this change is implemented by adding a fixed > property which could be initialized by QEMU command line. Suggested > by Philippe & Klaus, rework like current version. > > Test with this patch: > 1, change smart_critical_warning property for a running VM: > #virsh qemu-monitor-command nvme-upstream '{ "execute": "qom-set", > "arguments": { "path": "/machine/peripheral-anon/device[0]", > "property": "smart_critical_warning", "value":16 } }' > 2, run smartctl in guest > #smartctl -H -l error /dev/nvme0n1 > > === START OF SMART DATA SECTION === > SMART overall-health self-assessment test result: FAILED! > - volatile memory backup device has failed > > Signed-off-by: zhenwei pi <pizhen...@bytedance.com> > --- > hw/block/nvme.c | 40 ++++++++++++++++++++++++++++++++++++++++ > hw/block/nvme.h | 1 + > 2 files changed, 41 insertions(+) ...
> +static void nvme_set_smart_warning(Object *obj, Visitor *v, const char *name, > + void *opaque, Error **errp) > +{ > + NvmeCtrl *s = NVME(obj); > + uint8_t value, cap = 0; > + uint64_t pmr_cap = CAP_PMR_MASK; > + > + if (!visit_type_uint8(v, name, &value, errp)) { > + return; > + } > + > + cap = NVME_SMART_SPARE | NVME_SMART_TEMPERATURE | NVME_SMART_RELIABILITY > + | NVME_SMART_MEDIA_READ_ONLY | NVME_SMART_FAILED_VOLATILE_MEDIA; > + if (s->bar.cap & (pmr_cap << CAP_PMR_SHIFT)) { > + cap |= NVME_SMART_PMR_UNRELIABLE; > + } > + > + if ((value & cap) != value) { > + error_setg(errp, "unsupported smart critical warning value"); More useful: error_setg(errp, "unsupported smart critical warning bits: 0x%x", value & ~cap); Regardless: Reviewed-by: Philippe Mathieu-Daudé <phi...@redhat.com> Thanks!