Page MenuHomeFreeBSD

D46369.id142228.diff
No OneTemporary

D46369.id142228.diff

diff --git a/sys/dev/ena/ena.h b/sys/dev/ena/ena.h
--- a/sys/dev/ena/ena.h
+++ b/sys/dev/ena/ena.h
@@ -394,6 +394,7 @@
counter_u64_t rx_desc_malformed;
counter_u64_t missing_admin_interrupt;
counter_u64_t admin_to;
+ counter_u64_t device_request_reset;
};
struct ena_hw_stats {
@@ -556,6 +557,7 @@
ENA_RESET_STATS_ENTRY(ENA_REGS_RESET_TX_DESCRIPTOR_MALFORMED, tx_desc_malformed),
ENA_RESET_STATS_ENTRY(ENA_REGS_RESET_RX_DESCRIPTOR_MALFORMED, rx_desc_malformed),
ENA_RESET_STATS_ENTRY(ENA_REGS_RESET_MISSING_ADMIN_INTERRUPT, missing_admin_interrupt),
+ ENA_RESET_STATS_ENTRY(ENA_REGS_RESET_DEVICE_REQUEST, device_request_reset),
};
int ena_up(struct ena_adapter *adapter);
diff --git a/sys/dev/ena/ena.c b/sys/dev/ena/ena.c
--- a/sys/dev/ena/ena.c
+++ b/sys/dev/ena/ena.c
@@ -2990,7 +2990,8 @@
BIT(ENA_ADMIN_WARNING) |
BIT(ENA_ADMIN_NOTIFICATION) |
BIT(ENA_ADMIN_KEEP_ALIVE) |
- BIT(ENA_ADMIN_CONF_NOTIFICATIONS);
+ BIT(ENA_ADMIN_CONF_NOTIFICATIONS) |
+ BIT(ENA_ADMIN_DEVICE_REQUEST_RESET);
aenq_groups &= get_feat_ctx->aenq.supported_groups;
rc = ena_com_set_aenq_config(ena_dev, aenq_groups);
@@ -4193,12 +4194,22 @@
}
}
+static void ena_admin_device_request_reset(void *adapter_data,
+ struct ena_admin_aenq_entry *aenq_e)
+{
+ struct ena_adapter *adapter = (struct ena_adapter *)adapter_data;
+ ena_log(adapter->pdev, WARN,
+ "The device has detected an unhealthy state, reset is requested\n");
+ ena_trigger_reset(adapter, ENA_REGS_RESET_DEVICE_REQUEST);
+}
+
static struct ena_aenq_handlers aenq_handlers = {
.handlers = {
[ENA_ADMIN_LINK_CHANGE] = ena_update_on_link_change,
[ENA_ADMIN_NOTIFICATION] = ena_notification,
[ENA_ADMIN_KEEP_ALIVE] = ena_keep_alive_wd,
[ENA_ADMIN_CONF_NOTIFICATIONS] = ena_conf_notification,
+ [ENA_ADMIN_DEVICE_REQUEST_RESET] = ena_admin_device_request_reset,
},
.unimplemented_handler = unimplemented_aenq_handler
};
diff --git a/sys/dev/ena/ena_sysctl.c b/sys/dev/ena/ena_sysctl.c
--- a/sys/dev/ena/ena_sysctl.c
+++ b/sys/dev/ena/ena_sysctl.c
@@ -301,6 +301,8 @@
&dev_stats->missing_admin_interrupt, "Missing admin interrupts count");
SYSCTL_ADD_COUNTER_U64(ctx, child, OID_AUTO, "admin_to", CTLFLAG_RD,
&dev_stats->admin_to, "Admin queue timeouts count");
+ SYSCTL_ADD_COUNTER_U64(ctx, child, OID_AUTO, "device_request_reset", CTLFLAG_RD,
+ &dev_stats->device_request_reset, "Device reset requests count");
SYSCTL_ADD_COUNTER_U64(ctx, child, OID_AUTO, "total_resets", CTLFLAG_RD,
&dev_stats->total_resets, "Total resets count");

File Metadata

Mime Type
text/plain
Expires
Sat, Oct 10, 12:13 AM (4 h, 33 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
40513324
Default Alt Text
D46369.id142228.diff (2 KB)

Event Timeline