summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWill Song <jinpengsong@google.com>2024-03-05 04:27:01 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2024-03-05 04:27:01 +0000
commit59de658aceca6e3fab75ca0be97202154ebc9993 (patch)
tree4839bd1c8e8d29d553bbc6ecd9210ef2def080ad
parente6437f973e39127c0d4e4848b5de62a3ea5ee45d (diff)
parentbd44fe6294ac6b04e449e8d3a9afe1f9b62c07a0 (diff)
downloadgs-59de658aceca6e3fab75ca0be97202154ebc9993.tar.gz
drivers: performance: Move mon start_stop to inits am: bd44fe6294
Original change: https://partner-android-review.googlesource.com/c/kernel/private/google-modules/soc/gs/+/2756403 Change-Id: I94307b5aae460a51d8d601990917fc5c51f94c3e Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r--drivers/performance/gs_perf_mon/gs_perf_mon.c54
1 files changed, 37 insertions, 17 deletions
diff --git a/drivers/performance/gs_perf_mon/gs_perf_mon.c b/drivers/performance/gs_perf_mon/gs_perf_mon.c
index fe4ed846e..f8fa8a46f 100644
--- a/drivers/performance/gs_perf_mon/gs_perf_mon.c
+++ b/drivers/performance/gs_perf_mon/gs_perf_mon.c
@@ -161,12 +161,6 @@ int gs_perf_mon_add_client(struct gs_perf_mon_client *client)
return -EINVAL;
mutex_lock(&perf_mon_metadata.client_list_lock);
-
- /* Start the perf monitor on registration of first client. */
- if (perf_mon_metadata.perf_monitor_initialized &&
- list_empty(&perf_mon_metadata.client_list))
- gs_perf_mon_start();
-
INIT_LIST_HEAD(&client->node);
list_add(&client->node, &perf_mon_metadata.client_list);
@@ -181,9 +175,6 @@ void gs_perf_mon_remove_client(struct gs_perf_mon_client *client)
return;
mutex_lock(&perf_mon_metadata.client_list_lock);
list_del(&client->node);
- if (perf_mon_metadata.perf_monitor_initialized &&
- list_empty(&perf_mon_metadata.client_list))
- gs_perf_mon_stop();
mutex_unlock(&perf_mon_metadata.client_list_lock);
}
EXPORT_SYMBOL(gs_perf_mon_remove_client);
@@ -853,13 +844,13 @@ int gs_perf_mon_driver_probe(struct platform_device *pdev)
goto err_cpuhp_init;
}
- /* Check for if clients registered before we probed. */
- mutex_lock(&perf_mon_metadata.client_list_lock);
- if (!list_empty(&perf_mon_metadata.client_list))
- gs_perf_mon_start();
+ /* Start the perf monitor. */
+ ret = gs_perf_mon_start();
+ if (ret) {
+ dev_err(dev, "gs_perf_mon could not stop with error code %d\n", ret);
+ goto err_cpuhp_init;
+ }
perf_mon_metadata.perf_monitor_initialized = true;
- mutex_unlock(&perf_mon_metadata.client_list_lock);
-
return 0;
/* If any of the above steps failed, we need to free resources and unregister hooks. */
@@ -935,12 +926,41 @@ static int gs_perf_mon_param_get_ticks(char *buf, const struct kernel_param *kp)
return sysfs_emit_at(buf, 0, "%u\n", perf_mon_config.param_ticks_per_counter_update);
}
-static const struct kernel_param_ops param_ops = {
+static const struct kernel_param_ops param_tick = {
.set = gs_perf_mon_param_set_ticks,
.get = gs_perf_mon_param_get_ticks,
};
-module_param_cb(gs_perf_mon_ticks, &param_ops, NULL, 0644);
+module_param_cb(gs_perf_mon_param_ticks, &param_tick, NULL, 0644);
+
+static int gs_perf_mon_param_set_active(const char *val, const struct kernel_param *kp)
+{
+ bool is_active;
+
+ if (kstrtobool(val, &is_active)) {
+ pr_err("%s: gs_perf_mon parse error", __func__);
+ return -EINVAL;
+ }
+
+ if (is_active)
+ gs_perf_mon_start();
+ else
+ gs_perf_mon_stop();
+
+ return 0;
+}
+
+static int gs_perf_mon_param_get_active(char *buf, const struct kernel_param *kp)
+{
+ return sysfs_emit_at(buf, 0, "%u\n", perf_mon_metadata.is_active);
+}
+
+static const struct kernel_param_ops param_is_active = {
+ .set = gs_perf_mon_param_set_active,
+ .get = gs_perf_mon_param_get_active,
+};
+
+module_param_cb(gs_perf_mon_param_on, &param_is_active, NULL, 0644);
module_init(gs_perf_mon_init);
module_exit(gs_perf_mon_exit);