Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F149168866
D46358.1789619001.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D46358.1789619001.diff
View Options
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
@@ -381,6 +381,14 @@
counter_u64_t interface_up;
counter_u64_t interface_down;
counter_u64_t admin_q_pause;
+ counter_u64_t total_resets;
+ counter_u64_t os_trigger;
+ counter_u64_t missing_tx_cmpl;
+ counter_u64_t bad_rx_req_id;
+ counter_u64_t bad_tx_req_id;
+ counter_u64_t bad_rx_desc_num;
+ counter_u64_t invalid_state;
+ counter_u64_t missing_intr;
};
struct ena_hw_stats {
@@ -519,6 +527,29 @@
extern struct sx ena_global_lock;
+#define ENA_RESET_STATS_ENTRY(reset_reason, stat) \
+ [reset_reason] = { \
+ .stat_offset = offsetof(struct ena_stats_dev, stat) / sizeof(u64), \
+ .has_counter = true \
+}
+
+struct ena_reset_stats_offset {
+ int stat_offset;
+ bool has_counter;
+};
+
+static const struct ena_reset_stats_offset resets_to_stats_offset_map[ENA_REGS_RESET_LAST] = {
+ ENA_RESET_STATS_ENTRY(ENA_REGS_RESET_KEEP_ALIVE_TO, wd_expired),
+ ENA_RESET_STATS_ENTRY(ENA_REGS_RESET_ADMIN_TO, admin_q_pause),
+ ENA_RESET_STATS_ENTRY(ENA_REGS_RESET_OS_TRIGGER, os_trigger),
+ ENA_RESET_STATS_ENTRY(ENA_REGS_RESET_MISS_TX_CMPL, missing_tx_cmpl),
+ ENA_RESET_STATS_ENTRY(ENA_REGS_RESET_INV_RX_REQ_ID, bad_rx_req_id),
+ ENA_RESET_STATS_ENTRY(ENA_REGS_RESET_INV_TX_REQ_ID, bad_tx_req_id),
+ ENA_RESET_STATS_ENTRY(ENA_REGS_RESET_TOO_MANY_RX_DESCS, bad_rx_desc_num),
+ ENA_RESET_STATS_ENTRY(ENA_REGS_RESET_DRIVER_INVALID_STATE, invalid_state),
+ ENA_RESET_STATS_ENTRY(ENA_REGS_RESET_MISS_INTERRUPT, missing_intr),
+};
+
int ena_up(struct ena_adapter *adapter);
void ena_down(struct ena_adapter *adapter);
int ena_restore_device(struct ena_adapter *adapter);
@@ -547,6 +578,17 @@
enum ena_regs_reset_reason_types reset_reason)
{
if (likely(!ENA_FLAG_ISSET(ENA_FLAG_TRIGGER_RESET, adapter))) {
+ const struct ena_reset_stats_offset *ena_reset_stats_offset =
+ &resets_to_stats_offset_map[reset_reason];
+
+ if (ena_reset_stats_offset->has_counter) {
+ uint64_t *stat_ptr = (uint64_t *)&adapter->dev_stats +
+ ena_reset_stats_offset->stat_offset;
+
+ counter_u64_add((counter_u64_t)(*stat_ptr), 1);
+ }
+
+ counter_u64_add(adapter->dev_stats.total_resets, 1);
adapter->reset_reason = reset_reason;
ENA_FLAG_SET_ATOMIC(ENA_FLAG_TRIGGER_RESET, 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
@@ -3014,7 +3014,6 @@
time = getsbinuptime() - timestamp;
if (unlikely(time > adapter->keep_alive_timeout)) {
ena_log(adapter->pdev, ERR, "Keep alive watchdog timeout.\n");
- counter_u64_add(adapter->dev_stats.wd_expired, 1);
ena_trigger_reset(adapter, ENA_REGS_RESET_KEEP_ALIVE_TO);
}
}
@@ -3026,7 +3025,6 @@
if (unlikely(ena_com_get_admin_running_state(adapter->ena_dev) == false)) {
ena_log(adapter->pdev, ERR,
"ENA admin queue is not in running state!\n");
- counter_u64_add(adapter->dev_stats.admin_q_pause, 1);
ena_trigger_reset(adapter, ENA_REGS_RESET_ADMIN_TO);
}
}
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
@@ -280,6 +280,22 @@
"Network interface down count");
SYSCTL_ADD_COUNTER_U64(ctx, child, OID_AUTO, "admin_q_pause",
CTLFLAG_RD, &dev_stats->admin_q_pause, "Admin queue pauses");
+ SYSCTL_ADD_COUNTER_U64(ctx, child, OID_AUTO, "os_trigger", CTLFLAG_RD,
+ &dev_stats->os_trigger, "OS trigger count");
+ SYSCTL_ADD_COUNTER_U64(ctx, child, OID_AUTO, "missing_tx_cmpl", CTLFLAG_RD,
+ &dev_stats->missing_tx_cmpl, "Missing TX completions resets count");
+ SYSCTL_ADD_COUNTER_U64(ctx, child, OID_AUTO, "bad_rx_req_id", CTLFLAG_RD,
+ &dev_stats->bad_rx_req_id, "Bad RX req id count");
+ SYSCTL_ADD_COUNTER_U64(ctx, child, OID_AUTO, "bad_tx_req_id", CTLFLAG_RD,
+ &dev_stats->bad_tx_req_id, "Bad TX req id count");
+ SYSCTL_ADD_COUNTER_U64(ctx, child, OID_AUTO, "bad_rx_desc_num", CTLFLAG_RD,
+ &dev_stats->bad_rx_desc_num, "Bad RX descriptors number count");
+ SYSCTL_ADD_COUNTER_U64(ctx, child, OID_AUTO, "invalid_state", CTLFLAG_RD,
+ &dev_stats->invalid_state, "Driver invalid state count");
+ SYSCTL_ADD_COUNTER_U64(ctx, child, OID_AUTO, "missing_intr", CTLFLAG_RD,
+ &dev_stats->missing_intr, "Missing interrupt count");
+ SYSCTL_ADD_COUNTER_U64(ctx, child, OID_AUTO, "total_resets", CTLFLAG_RD,
+ &dev_stats->total_resets, "Total resets count");
for (i = 0; i < adapter->num_io_queues; ++i, ++tx_ring, ++rx_ring) {
snprintf(namebuf, QUEUE_NAME_LEN, "queue%d", i);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Sep 17, 4:23 AM (4 h, 18 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29720524
Default Alt Text
D46358.1789619001.diff (4 KB)
Attached To
Mode
D46358: ena: Improve reset reason statistics
Attached
Detach File
Event Timeline
Log In to Comment