summaryrefslogtreecommitdiffstats
path: root/toolkit
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit')
-rw-r--r--toolkit/components/glean/ipc/FOGIPC.cpp65
-rw-r--r--toolkit/components/processtools/metrics.yaml16
-rw-r--r--toolkit/moz.configure2
3 files changed, 81 insertions, 2 deletions
diff --git a/toolkit/components/glean/ipc/FOGIPC.cpp b/toolkit/components/glean/ipc/FOGIPC.cpp
index e44cf3e863..4ce009e4fa 100644
--- a/toolkit/components/glean/ipc/FOGIPC.cpp
+++ b/toolkit/components/glean/ipc/FOGIPC.cpp
@@ -37,6 +37,10 @@
#include "nsTArray.h"
#include "nsThreadUtils.h"
+#if defined(__APPLE__) && defined(__aarch64__)
+# define HAS_PROCESS_ENERGY
+#endif
+
using mozilla::dom::ContentParent;
using mozilla::gfx::GPUChild;
using mozilla::gfx::GPUProcessManager;
@@ -76,6 +80,29 @@ struct ProcessingTimeMarker {
}
};
+#ifdef HAS_PROCESS_ENERGY
+struct ProcessEnergyMarker {
+ static constexpr Span<const char> MarkerTypeName() {
+ return MakeStringSpan("ProcessEnergy");
+ }
+ static void StreamJSONMarkerData(baseprofiler::SpliceableJSONWriter& aWriter,
+ int64_t aUWh,
+ const ProfilerString8View& aType) {
+ aWriter.IntProperty("energy", aUWh);
+ aWriter.StringProperty("label", aType);
+ }
+ static MarkerSchema MarkerTypeDisplay() {
+ using MS = MarkerSchema;
+ MS schema{MS::Location::MarkerChart, MS::Location::MarkerTable};
+ schema.AddKeyLabelFormat("energy", "Energy (µWh)", MS::Format::Integer);
+ schema.SetTooltipLabel("{marker.name} - {marker.data.label}");
+ schema.SetTableLabel(
+ "{marker.name} - {marker.data.label}: {marker.data.energy}µWh");
+ return schema;
+ }
+};
+#endif
+
} // namespace geckoprofiler::markers
namespace mozilla::glean {
@@ -248,8 +275,26 @@ void GetTrackerType(nsAutoCString& aTrackerType) {
}
}
+#ifdef HAS_PROCESS_ENERGY
+static int64_t GetTaskEnergy() {
+ task_power_info_v2_data_t task_power_info;
+ mach_msg_type_number_t count = TASK_POWER_INFO_V2_COUNT;
+ kern_return_t kr = task_info(mach_task_self(), TASK_POWER_INFO_V2,
+ (task_info_t)&task_power_info, &count);
+ if (kr != KERN_SUCCESS) {
+ return 0;
+ }
+
+ // task_energy is in nanojoules. We want microwatt-hours.
+ return task_power_info.task_energy / 3.6 / 1e6;
+}
+#endif
+
void RecordPowerMetrics() {
static uint64_t previousCpuTime = 0, previousGpuTime = 0;
+#ifdef HAS_PROCESS_ENERGY
+ static int64_t previousProcessEnergy = 0;
+#endif
uint64_t cpuTime, newCpuTime = 0;
if (NS_SUCCEEDED(GetCpuTimeSinceProcessStartInMs(&cpuTime)) &&
@@ -265,7 +310,16 @@ void RecordPowerMetrics() {
newGpuTime = gpuTime - previousGpuTime;
}
- if (!newCpuTime && !newGpuTime) {
+#ifdef HAS_PROCESS_ENERGY
+ int64_t processEnergy = GetTaskEnergy();
+ int64_t newProcessEnergy = processEnergy - previousProcessEnergy;
+#endif
+
+ if (!newCpuTime && !newGpuTime
+#ifdef HAS_PROCESS_ENERGY
+ && newProcessEnergy <= 0
+#endif
+ ) {
// Nothing to record.
return;
}
@@ -358,6 +412,15 @@ void RecordPowerMetrics() {
previousGpuTime += newGpuTime;
}
+#ifdef HAS_PROCESS_ENERGY
+ if (newProcessEnergy) {
+ power::energy_per_process_type.Get(type).Add(newProcessEnergy);
+ PROFILER_MARKER("Process Energy", OTHER, {}, ProcessEnergyMarker,
+ newProcessEnergy, type);
+ previousProcessEnergy += newProcessEnergy;
+ }
+#endif
+
profiler_record_wakeup_count(type);
}
diff --git a/toolkit/components/processtools/metrics.yaml b/toolkit/components/processtools/metrics.yaml
index 6efbd22fa5..1d6e6bf133 100644
--- a/toolkit/components/processtools/metrics.yaml
+++ b/toolkit/components/processtools/metrics.yaml
@@ -112,6 +112,22 @@ power:
expires: never
telemetry_mirror: POWER_GPU_TIME_BOGUS_VALUES
+ energy_per_process_type:
+ type: labeled_counter
+ description: >
+ How much energy (in µWh) has been used, broken down by process type.
+ Only available on Apple Silicon.
+ bugs:
+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1898057
+ data_reviews:
+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1898057
+ data_sensitivity:
+ - technical
+ notification_emails:
+ - florian@mozilla.com
+ expires: never
+ labels: *per_process_type_labels
+
wakeups_per_process_type:
type: labeled_counter
description: >
diff --git a/toolkit/moz.configure b/toolkit/moz.configure
index 6ad16dc1b7..7282b80d81 100644
--- a/toolkit/moz.configure
+++ b/toolkit/moz.configure
@@ -3353,7 +3353,7 @@ with only_when(compile_environment):
set_config("MOZ_TREE_PIXMAN", True, when=in_tree_pixman)
set_define("MOZ_TREE_PIXMAN", True, when=in_tree_pixman)
- pkg_check_modules("MOZ_PIXMAN", "pixman-1 >= 0.36.0", when="--enable-system-pixman")
+ pkg_check_modules("MOZ_PIXMAN", "pixman-1 >= 0.40.0", when="--enable-system-pixman")
# Set MOZ_PIXMAN_CFLAGS to an explicit empty value when --enable-system-pixman is *not* used,
# for layout/style/extra-bindgen-flags
set_config("MOZ_PIXMAN_CFLAGS", [], when=in_tree_pixman)