[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 37/56] hw/block/nvme: trigger async event during injecting smart w
From: |
Klaus Jensen |
Subject: |
[PULL 37/56] hw/block/nvme: trigger async event during injecting smart warning |
Date: |
Tue, 9 Feb 2021 08:30:42 +0100 |
From: zhenwei pi <pizhenwei@bytedance.com>
During smart critical warning injection by setting property from QMP
command, also try to trigger asynchronous event.
Suggested by Keith, if a event has already been raised, there is no
need to enqueue the duplicate event any more.
Signed-off-by: zhenwei pi <pizhenwei@bytedance.com>
[k.jensen: fix typo in commit message]
Signed-off-by: Klaus Jensen <k.jensen@samsung.com>
---
include/block/nvme.h | 1 +
hw/block/nvme.c | 48 +++++++++++++++++++++++++++++++++++++-------
2 files changed, 42 insertions(+), 7 deletions(-)
diff --git a/include/block/nvme.h b/include/block/nvme.h
index 88af3b42348c..854fb2abb6f8 100644
--- a/include/block/nvme.h
+++ b/include/block/nvme.h
@@ -784,6 +784,7 @@ typedef struct QEMU_PACKED NvmeSmartLog {
uint8_t reserved2[320];
} NvmeSmartLog;
+#define NVME_SMART_WARN_MAX 6
enum NvmeSmartWarn {
NVME_SMART_SPARE = 1 << 0,
NVME_SMART_TEMPERATURE = 1 << 1,
diff --git a/hw/block/nvme.c b/hw/block/nvme.c
index f0cb7acd7454..09eb1f06e8b1 100644
--- a/hw/block/nvme.c
+++ b/hw/block/nvme.c
@@ -980,6 +980,35 @@ static void nvme_enqueue_event(NvmeCtrl *n, uint8_t
event_type,
nvme_process_aers(n);
}
+static void nvme_smart_event(NvmeCtrl *n, uint8_t event)
+{
+ uint8_t aer_info;
+
+ /* Ref SPEC <Asynchronous Event Information 0x2013 SMART / Health Status>
*/
+ if (!(NVME_AEC_SMART(n->features.async_config) & event)) {
+ return;
+ }
+
+ switch (event) {
+ case NVME_SMART_SPARE:
+ aer_info = NVME_AER_INFO_SMART_SPARE_THRESH;
+ break;
+ case NVME_SMART_TEMPERATURE:
+ aer_info = NVME_AER_INFO_SMART_TEMP_THRESH;
+ break;
+ case NVME_SMART_RELIABILITY:
+ case NVME_SMART_MEDIA_READ_ONLY:
+ case NVME_SMART_FAILED_VOLATILE_MEDIA:
+ case NVME_SMART_PMR_UNRELIABLE:
+ aer_info = NVME_AER_INFO_SMART_RELIABILITY;
+ break;
+ default:
+ return;
+ }
+
+ nvme_enqueue_event(n, NVME_AER_TYPE_SMART, aer_info, NVME_LOG_SMART_INFO);
+}
+
static void nvme_clear_events(NvmeCtrl *n, uint8_t event_type)
{
n->aer_mask &= ~(1 << event_type);
@@ -3317,12 +3346,9 @@ static uint16_t nvme_set_feature(NvmeCtrl *n,
NvmeRequest *req)
return NVME_INVALID_FIELD | NVME_DNR;
}
- if (((n->temperature >= n->features.temp_thresh_hi) ||
- (n->temperature <= n->features.temp_thresh_low)) &&
- NVME_AEC_SMART(n->features.async_config) & NVME_SMART_TEMPERATURE)
{
- nvme_enqueue_event(n, NVME_AER_TYPE_SMART,
- NVME_AER_INFO_SMART_TEMP_THRESH,
- NVME_LOG_SMART_INFO);
+ if ((n->temperature >= n->features.temp_thresh_hi) ||
+ (n->temperature <= n->features.temp_thresh_low)) {
+ nvme_smart_event(n, NVME_AER_INFO_SMART_TEMP_THRESH);
}
break;
@@ -4446,7 +4472,7 @@ static void nvme_set_smart_warning(Object *obj, Visitor
*v, const char *name,
void *opaque, Error **errp)
{
NvmeCtrl *n = NVME(obj);
- uint8_t value, cap = 0;
+ uint8_t value, old_value, cap = 0, index, event;
if (!visit_type_uint8(v, name, &value, errp)) {
return;
@@ -4464,7 +4490,15 @@ static void nvme_set_smart_warning(Object *obj, Visitor
*v, const char *name,
return;
}
+ old_value = n->smart_critical_warning;
n->smart_critical_warning = value;
+
+ /* only inject new bits of smart critical warning */
+ for (index = 0; index < NVME_SMART_WARN_MAX; index++) {
+ event = 1 << index;
+ if (value & ~old_value & event)
+ nvme_smart_event(n, event);
+ }
}
static const VMStateDescription nvme_vmstate = {
--
2.30.0
- [PULL 26/56] hw/block/nvme: add missing string representations for commands, (continued)
- [PULL 26/56] hw/block/nvme: add missing string representations for commands, Klaus Jensen, 2021/02/09
- [PULL 28/56] hw/block/nvme: Correct error status for unaligned ZA, Klaus Jensen, 2021/02/09
- [PULL 27/56] hw/block/nvme: remove unnecessary check for append, Klaus Jensen, 2021/02/09
- [PULL 30/56] hw/block/nvme: open code for volatile write cache, Klaus Jensen, 2021/02/09
- [PULL 33/56] hw/block/nvme: remove unused argument in nvme_ns_setup, Klaus Jensen, 2021/02/09
- [PULL 35/56] nvme: introduce bit 5 for critical warning, Klaus Jensen, 2021/02/09
- [PULL 38/56] hw/block/nvme: add size to mmio read/write trace events, Klaus Jensen, 2021/02/09
- [PULL 25/56] hw/block/nvme: zero out zones on reset, Klaus Jensen, 2021/02/09
- [PULL 45/56] hw/block/nvme: disable PMR at boot up, Klaus Jensen, 2021/02/09
- [PULL 29/56] hw/block/nvme: remove unused argument in nvme_ns_init_zoned, Klaus Jensen, 2021/02/09
- [PULL 37/56] hw/block/nvme: trigger async event during injecting smart warning,
Klaus Jensen <=
- [PULL 44/56] hw/block/nvme: remove redundant zeroing of PMR registers, Klaus Jensen, 2021/02/09
- [PULL 48/56] hw/block/nvme: bump to v1.4, Klaus Jensen, 2021/02/09
- [PULL 34/56] hw/block/nvme: fix zone write finalize, Klaus Jensen, 2021/02/09
- [PULL 31/56] hw/block/nvme: remove unused argument in nvme_ns_init_blk, Klaus Jensen, 2021/02/09
- [PULL 32/56] hw/block/nvme: split setup and register for namespace, Klaus Jensen, 2021/02/09
- [PULL 43/56] hw/block/nvme: rename PMR/CMB shift/mask fields, Klaus Jensen, 2021/02/09