From 388db6efa004d2fdbbcfd13958197a2641c723b0 Mon Sep 17 00:00:00 2001 From: Will Song Date: Wed, 28 Feb 2024 20:35:18 -0800 Subject: drivers: performance: Fix update df after init Only access devfreq update code after devfreqs have been initialized. Needed for tick-driven latgov backup work path for synchronization. Test: Flash + Check freq on Perfetto Bug: 325274590 Bug: 327209413 Change-Id: I0b45406d25cc686798845010b27dd366348b0612 Signed-off-by: Will Song --- .../performance/lat_governors/gs_dsulat_devfreq.c | 2 + .../performance/lat_governors/gs_governor_dsulat.c | 55 ++++++++++++++-------- .../performance/lat_governors/gs_governor_dsulat.h | 13 +++-- .../performance/lat_governors/gs_governor_memlat.c | 51 ++++++++++++-------- .../performance/lat_governors/gs_governor_memlat.h | 7 +++ .../performance/lat_governors/gs_memlat_devfreq.c | 2 + 6 files changed, 89 insertions(+), 41 deletions(-) diff --git a/drivers/performance/lat_governors/gs_dsulat_devfreq.c b/drivers/performance/lat_governors/gs_dsulat_devfreq.c index cf3e67bfe..d78d2406e 100644 --- a/drivers/performance/lat_governors/gs_dsulat_devfreq.c +++ b/drivers/performance/lat_governors/gs_dsulat_devfreq.c @@ -385,6 +385,8 @@ static int gs_dsulat_devfreq_probe(struct platform_device *pdev) if (ret) dev_warn(dev, "failed create sysfs for devfreq pm_qos_min\n"); + gs_dsulat_governor_set_devfreq_ready(); + return 0; err_devfreq: diff --git a/drivers/performance/lat_governors/gs_governor_dsulat.c b/drivers/performance/lat_governors/gs_governor_dsulat.c index 0b1532137..a1450cc9d 100644 --- a/drivers/performance/lat_governors/gs_governor_dsulat.c +++ b/drivers/performance/lat_governors/gs_governor_dsulat.c @@ -33,6 +33,7 @@ */ struct dsulat_data { bool gov_is_on; + bool devfreq_initialized; struct exynos_devfreq_data *devfreq_data; struct attribute_group *attr_grp; int num_cpu_clusters; @@ -83,16 +84,19 @@ static struct attribute_group dsulat_dev_attr_group = { */ static void update_dsulat_gov(struct gs_cpu_perf_data *data, void* private_data) { - struct devfreq *df = dsulat_node.devfreq_data->devfreq; + struct devfreq *df; int err; - mutex_lock(&df->lock); - df->governor_data = data; - err = update_devfreq(df); - if (err) - dev_err(&df->dev, "dsulat update failed: %d\n", err); - df->governor_data = NULL; - mutex_unlock(&df->lock); + if (dsulat_node.devfreq_initialized) { + df = dsulat_node.devfreq_data->devfreq; + mutex_lock(&df->lock); + df->governor_data = data; + err = update_devfreq(df); + if (err) + dev_err(&df->dev, "dsulat update failed: %d\n", err); + df->governor_data = NULL; + mutex_unlock(&df->lock); + } } /** @@ -136,9 +140,11 @@ err_start: static int gov_suspend(struct devfreq *df) { dsulat_node.gov_is_on = false; - mutex_lock(&df->lock); - update_devfreq(df); - mutex_unlock(&df->lock); + if (dsulat_node.devfreq_initialized) { + mutex_lock(&df->lock); + update_devfreq(df); + mutex_unlock(&df->lock); + } return 0; } @@ -152,9 +158,11 @@ static int gov_suspend(struct devfreq *df) static int gov_resume(struct devfreq *df) { dsulat_node.gov_is_on = true; - mutex_lock(&df->lock); - update_devfreq(df); - mutex_unlock(&df->lock); + if (dsulat_node.devfreq_initialized) { + mutex_lock(&df->lock); + update_devfreq(df); + mutex_unlock(&df->lock); + } return 0; } @@ -172,11 +180,13 @@ static void gov_stop(struct devfreq *df) dsulat_node.gov_is_on = false; gs_perf_mon_remove_client(&dsulat_perf_client); - mutex_lock(&df->lock); - update_devfreq(df); - mutex_unlock(&df->lock); + if (dsulat_node.devfreq_initialized) { + mutex_lock(&df->lock); + update_devfreq(df); + mutex_unlock(&df->lock); - sysfs_remove_group(&df->dev.kobj, dsulat_node.attr_grp); + sysfs_remove_group(&df->dev.kobj, dsulat_node.attr_grp); + } } /** @@ -423,6 +433,13 @@ void gs_dsulat_governor_unregister(void) } EXPORT_SYMBOL(gs_dsulat_governor_unregister); + + +void gs_dsulat_governor_set_devfreq_ready(void) { + dsulat_node.devfreq_initialized = true; +} +EXPORT_SYMBOL(gs_dsulat_governor_set_devfreq_ready); + MODULE_AUTHOR("Will Song "); MODULE_LICENSE("GPL"); -MODULE_DESCRIPTION("Google Source Dsulat Governor"); \ No newline at end of file +MODULE_DESCRIPTION("Google Source Dsulat Governor"); diff --git a/drivers/performance/lat_governors/gs_governor_dsulat.h b/drivers/performance/lat_governors/gs_governor_dsulat.h index 5e9c2883c..d140504e0 100644 --- a/drivers/performance/lat_governors/gs_governor_dsulat.h +++ b/drivers/performance/lat_governors/gs_governor_dsulat.h @@ -15,15 +15,15 @@ int gs_dsulat_governor_register(void); /** - * gs_memlat_governor_unregister - Removes governor from the devfreq system. + * gs_dsulat_governor_unregister - Removes governor from the devfreq system. */ void gs_dsulat_governor_unregister(void); /** - * gs_memlat_governor_initialize - Parse and init memlat governor data. + * gs_dsulat_governor_initialize - Parse and init dsulat governor data. * * Inputs: - * @governor_node: DTSI node containing memlat data. + * @governor_node: DTSI node containing dsulat data. * @data: Devfreq data for governor. * * Returns: Non-zero on error. @@ -31,4 +31,11 @@ void gs_dsulat_governor_unregister(void); int gs_dsulat_governor_initialize(struct device_node *governor_node, struct exynos_devfreq_data *data); +/** + * gs_dsulat_governor_set_devfreq_ready: Informs governor devfreq is initialized. + * + * TODO: Remove with devfreqs in b/327482673. +*/ +void gs_dsulat_governor_set_devfreq_ready(void); + #endif /* _GS_GOVERNOR_DSULAT_H */ diff --git a/drivers/performance/lat_governors/gs_governor_memlat.c b/drivers/performance/lat_governors/gs_governor_memlat.c index 8ccba2223..8e95a125d 100644 --- a/drivers/performance/lat_governors/gs_governor_memlat.c +++ b/drivers/performance/lat_governors/gs_governor_memlat.c @@ -31,6 +31,7 @@ */ struct memlat_data { bool gov_is_on; + bool devfreq_initialized; struct exynos_devfreq_data *devfreq_data; struct attribute_group *attr_grp; int num_cpu_clusters; @@ -84,14 +85,16 @@ static void update_memlat_gov(struct gs_cpu_perf_data *data, void* private_data) struct devfreq *df; int err; - df = memlat_node.devfreq_data->devfreq; - mutex_lock(&df->lock); - df->governor_data = data; - err = update_devfreq(df); - if (err) - dev_err(&df->dev, "Memlat update failed: %d\n", err); - df->governor_data = NULL; - mutex_unlock(&df->lock); + if (memlat_node.devfreq_initialized) { + df = memlat_node.devfreq_data->devfreq; + mutex_lock(&df->lock); + df->governor_data = data; + err = update_devfreq(df); + if (err) + dev_err(&df->dev, "Memlat update failed: %d\n", err); + df->governor_data = NULL; + mutex_unlock(&df->lock); + } } /** @@ -132,9 +135,11 @@ err_start: static int gov_suspend(struct devfreq *df) { memlat_node.gov_is_on = false; - mutex_lock(&df->lock); - update_devfreq(df); - mutex_unlock(&df->lock); + if (memlat_node.devfreq_initialized) { + mutex_lock(&df->lock); + update_devfreq(df); + mutex_unlock(&df->lock); + } return 0; } @@ -148,9 +153,11 @@ static int gov_suspend(struct devfreq *df) static int gov_resume(struct devfreq *df) { memlat_node.gov_is_on = true; - mutex_lock(&df->lock); - update_devfreq(df); - mutex_unlock(&df->lock); + if (memlat_node.devfreq_initialized) { + mutex_lock(&df->lock); + update_devfreq(df); + mutex_unlock(&df->lock); + } return 0; } @@ -167,12 +174,13 @@ static void gov_stop(struct devfreq *df) { memlat_node.gov_is_on = false; gs_perf_mon_remove_client(&memlat_perf_client); + if (memlat_node.devfreq_initialized) { + mutex_lock(&df->lock); + update_devfreq(df); + mutex_unlock(&df->lock); - mutex_lock(&df->lock); - update_devfreq(df); - mutex_unlock(&df->lock); - - sysfs_remove_group(&df->dev.kobj, memlat_node.attr_grp); + sysfs_remove_group(&df->dev.kobj, memlat_node.attr_grp); + } } /** @@ -414,6 +422,11 @@ void gs_memlat_governor_unregister(void) } EXPORT_SYMBOL(gs_memlat_governor_unregister); +void gs_memlat_governor_set_devfreq_ready(void) { + memlat_node.devfreq_initialized = true; +} +EXPORT_SYMBOL(gs_memlat_governor_set_devfreq_ready); + MODULE_AUTHOR("Will Song "); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Google Source Memlat Governor"); \ No newline at end of file diff --git a/drivers/performance/lat_governors/gs_governor_memlat.h b/drivers/performance/lat_governors/gs_governor_memlat.h index 2bb577988..094dff05b 100644 --- a/drivers/performance/lat_governors/gs_governor_memlat.h +++ b/drivers/performance/lat_governors/gs_governor_memlat.h @@ -31,4 +31,11 @@ void gs_memlat_governor_unregister(void); int gs_memlat_governor_initialize(struct device_node *governor_node, struct exynos_devfreq_data *data); +/** + * gs_memlat_governor_set_devfreq_ready: Informs governor devfreq is initialized. + * + * TODO: Remove with devfreqs in b/327482673. +*/ +void gs_memlat_governor_set_devfreq_ready(void); + #endif /* _GS_GOVERNOR_MEMLAT_H */ diff --git a/drivers/performance/lat_governors/gs_memlat_devfreq.c b/drivers/performance/lat_governors/gs_memlat_devfreq.c index 3daa70e74..1c8765e90 100644 --- a/drivers/performance/lat_governors/gs_memlat_devfreq.c +++ b/drivers/performance/lat_governors/gs_memlat_devfreq.c @@ -268,6 +268,8 @@ static int gs_memlat_devfreq_probe(struct platform_device *pdev) if (ret) dev_warn(dev, "failed create sysfs for devfreq pm_qos_min\n"); + gs_memlat_governor_set_devfreq_ready(); + return 0; err_devfreq: -- cgit v1.2.3