Page MenuHomeFreeBSD

D53633.id166015.diff
No OneTemporary

D53633.id166015.diff

diff --git a/sys/dev/acpica/acpi_cpu.c b/sys/dev/acpica/acpi_cpu.c
--- a/sys/dev/acpica/acpi_cpu.c
+++ b/sys/dev/acpica/acpi_cpu.c
@@ -92,6 +92,7 @@
int cpu_non_c2; /* Index of lowest non-C2 state. */
int cpu_non_c3; /* Index of lowest non-C3 state. */
u_int cpu_cx_stats[MAX_CX_STATES];/* Cx usage history. */
+ uint64_t cpu_cx_duration[MAX_CX_STATES];/* Cx cumulative sleep */
/* Values for sysctl. */
struct sysctl_ctx_list cpu_sysctl_ctx;
struct sysctl_oid *cpu_sysctl_tree;
@@ -185,6 +186,7 @@
static void acpi_cpu_quirks_piix4(void);
static int acpi_cpu_usage_sysctl(SYSCTL_HANDLER_ARGS);
static int acpi_cpu_usage_counters_sysctl(SYSCTL_HANDLER_ARGS);
+static int acpi_cpu_duration_counters_sysctl(SYSCTL_HANDLER_ARGS);
static int acpi_cpu_set_cx_lowest(struct acpi_cpu_softc *sc);
static int acpi_cpu_cx_lowest_sysctl(SYSCTL_HANDLER_ARGS);
static int acpi_cpu_global_cx_lowest_sysctl(SYSCTL_HANDLER_ARGS);
@@ -1055,6 +1057,12 @@
"cx_usage_counters", CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE,
(void *)sc, 0, acpi_cpu_usage_counters_sysctl, "A",
"Cx sleep state counters");
+ SYSCTL_ADD_PROC(&sc->cpu_sysctl_ctx,
+ SYSCTL_CHILDREN(device_get_sysctl_tree(sc->cpu_dev)), OID_AUTO,
+ "cx_duration_counters", CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE,
+ (void *)sc, 0, acpi_cpu_duration_counters_sysctl, "A",
+ "Cx sleep duration cumulative time");
+
#if defined(__i386__) || defined(__amd64__)
SYSCTL_ADD_PROC(&sc->cpu_sysctl_ctx,
SYSCTL_CHILDREN(device_get_sysctl_tree(sc->cpu_dev)), OID_AUTO,
@@ -1168,6 +1176,7 @@
if (!cx_next->do_mwait && curthread->td_critnest == 0)
end_time = min(end_time, 500000 / hz);
sc->cpu_prev_sleep = (sc->cpu_prev_sleep * 3 + end_time) / 4;
+ sc->cpu_cx_duration[cx_next_idx] += end_time;
return;
}
@@ -1224,6 +1233,7 @@
else
end_time = ((end_ticks - start_ticks) << 20) / cpu_tickrate();
sc->cpu_prev_sleep = (sc->cpu_prev_sleep * 3 + end_time) / 4;
+ sc->cpu_cx_duration[cx_next_idx] += end_time;
}
#endif
@@ -1408,6 +1418,26 @@
return (error);
}
+static int
+acpi_cpu_duration_counters_sysctl(SYSCTL_HANDLER_ARGS)
+{
+ struct acpi_cpu_softc *sc = (struct acpi_cpu_softc *)arg1;
+ struct sbuf sb;
+ char buf[128];
+ int error, i;
+
+ sbuf_new_for_sysctl(&sb, buf, sizeof(buf), req);
+ for (i = 0; i < sc->cpu_cx_count; i++) {
+ if (i > 0)
+ sbuf_putc(&sb, ' ');
+ sbuf_printf(&sb, "%ju", (uintmax_t) sc->cpu_cx_duration[i]);
+ }
+ error = sbuf_finish(&sb);
+ sbuf_delete(&sb);
+ return (error);
+}
+
+
#if defined(__i386__) || defined(__amd64__)
static int
acpi_cpu_method_sysctl(SYSCTL_HANDLER_ARGS)

File Metadata

Mime Type
text/plain
Expires
Fri, Mar 13, 3:46 AM (2 h, 35 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29607484
Default Alt Text
D53633.id166015.diff (2 KB)

Event Timeline