From: Greg Kroah-Hartman Date: Mon, 30 Jan 2023 10:21:23 +0000 (+0100) Subject: 5.15-stable patches X-Git-Tag: v5.10.166~26 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4e257f7978dc7cf5b96d06f6df0a0e7268d8ff40;p=thirdparty%2Fkernel%2Fstable-queue.git 5.15-stable patches added patches: cpufreq-governor-use-kobject-release-method-to-free-dbs_data.patch cpufreq-move-to_gov_attr_set-to-cpufreq.h.patch --- diff --git a/queue-5.15/cpufreq-governor-use-kobject-release-method-to-free-dbs_data.patch b/queue-5.15/cpufreq-governor-use-kobject-release-method-to-free-dbs_data.patch new file mode 100644 index 00000000000..d7f5fab052e --- /dev/null +++ b/queue-5.15/cpufreq-governor-use-kobject-release-method-to-free-dbs_data.patch @@ -0,0 +1,135 @@ +From a85ee6401a47ae3fc64ba506cacb3e7873823c65 Mon Sep 17 00:00:00 2001 +From: Kevin Hao +Date: Sun, 23 Jan 2022 20:45:08 +0800 +Subject: cpufreq: governor: Use kobject release() method to free dbs_data + +From: Kevin Hao + +commit a85ee6401a47ae3fc64ba506cacb3e7873823c65 upstream. + +The struct dbs_data embeds a struct gov_attr_set and +the struct gov_attr_set embeds a kobject. Since every kobject must have +a release() method and we can't use kfree() to free it directly, +so introduce cpufreq_dbs_data_release() to release the dbs_data via +the kobject::release() method. This fixes the calltrace like below: + + ODEBUG: free active (active state 0) object type: timer_list hint: delayed_work_timer_fn+0x0/0x34 + WARNING: CPU: 12 PID: 810 at lib/debugobjects.c:505 debug_print_object+0xb8/0x100 + Modules linked in: + CPU: 12 PID: 810 Comm: sh Not tainted 5.16.0-next-20220120-yocto-standard+ #536 + Hardware name: Marvell OcteonTX CN96XX board (DT) + pstate: 60400009 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--) + pc : debug_print_object+0xb8/0x100 + lr : debug_print_object+0xb8/0x100 + sp : ffff80001dfcf9a0 + x29: ffff80001dfcf9a0 x28: 0000000000000001 x27: ffff0001464f0000 + x26: 0000000000000000 x25: ffff8000090e3f00 x24: ffff80000af60210 + x23: ffff8000094dfb78 x22: ffff8000090e3f00 x21: ffff0001080b7118 + x20: ffff80000aeb2430 x19: ffff800009e8f5e0 x18: 0000000000000000 + x17: 0000000000000002 x16: 00004d62e58be040 x15: 013590470523aff8 + x14: ffff8000090e1828 x13: 0000000001359047 x12: 00000000f5257d14 + x11: 0000000000040591 x10: 0000000066c1ffea x9 : ffff8000080d15e0 + x8 : ffff80000a1765a8 x7 : 0000000000000000 x6 : 0000000000000001 + x5 : ffff800009e8c000 x4 : ffff800009e8c760 x3 : 0000000000000000 + x2 : 0000000000000000 x1 : 0000000000000000 x0 : ffff0001474ed040 + Call trace: + debug_print_object+0xb8/0x100 + __debug_check_no_obj_freed+0x1d0/0x25c + debug_check_no_obj_freed+0x24/0xa0 + kfree+0x11c/0x440 + cpufreq_dbs_governor_exit+0xa8/0xac + cpufreq_exit_governor+0x44/0x90 + cpufreq_set_policy+0x29c/0x570 + store_scaling_governor+0x110/0x154 + store+0xb0/0xe0 + sysfs_kf_write+0x58/0x84 + kernfs_fop_write_iter+0x12c/0x1c0 + new_sync_write+0xf0/0x18c + vfs_write+0x1cc/0x220 + ksys_write+0x74/0x100 + __arm64_sys_write+0x28/0x3c + invoke_syscall.constprop.0+0x58/0xf0 + do_el0_svc+0x70/0x170 + el0_svc+0x54/0x190 + el0t_64_sync_handler+0xa4/0x130 + el0t_64_sync+0x1a0/0x1a4 + irq event stamp: 189006 + hardirqs last enabled at (189005): [] finish_task_switch.isra.0+0xe0/0x2c0 + hardirqs last disabled at (189006): [] el1_dbg+0x24/0xa0 + softirqs last enabled at (188966): [] __do_softirq+0x4b0/0x6a0 + softirqs last disabled at (188957): [] __irq_exit_rcu+0x108/0x1a4 + +[ rjw: Because can be freed by the gov_attr_set_put() in + cpufreq_dbs_governor_exit() now, it is also necessary to put the + invocation of the governor ->exit() callback into the new + cpufreq_dbs_data_release() function. ] + +Fixes: c4435630361d ("cpufreq: governor: New sysfs show/store callbacks for governor tunables") +Signed-off-by: Kevin Hao +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Greg Kroah-Hartman +--- + drivers/cpufreq/cpufreq_governor.c | 20 +++++++++++++------- + drivers/cpufreq/cpufreq_governor.h | 1 + + 2 files changed, 14 insertions(+), 7 deletions(-) + +--- a/drivers/cpufreq/cpufreq_governor.c ++++ b/drivers/cpufreq/cpufreq_governor.c +@@ -388,6 +388,15 @@ static void free_policy_dbs_info(struct + gov->free(policy_dbs); + } + ++static void cpufreq_dbs_data_release(struct kobject *kobj) ++{ ++ struct dbs_data *dbs_data = to_dbs_data(to_gov_attr_set(kobj)); ++ struct dbs_governor *gov = dbs_data->gov; ++ ++ gov->exit(dbs_data); ++ kfree(dbs_data); ++} ++ + int cpufreq_dbs_governor_init(struct cpufreq_policy *policy) + { + struct dbs_governor *gov = dbs_governor_of(policy); +@@ -425,6 +434,7 @@ int cpufreq_dbs_governor_init(struct cpu + goto free_policy_dbs_info; + } + ++ dbs_data->gov = gov; + gov_attr_set_init(&dbs_data->attr_set, &policy_dbs->list); + + ret = gov->init(dbs_data); +@@ -447,6 +457,7 @@ int cpufreq_dbs_governor_init(struct cpu + policy->governor_data = policy_dbs; + + gov->kobj_type.sysfs_ops = &governor_sysfs_ops; ++ gov->kobj_type.release = cpufreq_dbs_data_release; + ret = kobject_init_and_add(&dbs_data->attr_set.kobj, &gov->kobj_type, + get_governor_parent_kobj(policy), + "%s", gov->gov.name); +@@ -488,13 +499,8 @@ void cpufreq_dbs_governor_exit(struct cp + + policy->governor_data = NULL; + +- if (!count) { +- if (!have_governor_per_policy()) +- gov->gdbs_data = NULL; +- +- gov->exit(dbs_data); +- kfree(dbs_data); +- } ++ if (!count && !have_governor_per_policy()) ++ gov->gdbs_data = NULL; + + free_policy_dbs_info(policy_dbs, gov); + +--- a/drivers/cpufreq/cpufreq_governor.h ++++ b/drivers/cpufreq/cpufreq_governor.h +@@ -37,6 +37,7 @@ enum {OD_NORMAL_SAMPLE, OD_SUB_SAMPLE}; + /* Governor demand based switching data (per-policy or global). */ + struct dbs_data { + struct gov_attr_set attr_set; ++ struct dbs_governor *gov; + void *tuners; + unsigned int ignore_nice_load; + unsigned int sampling_rate; diff --git a/queue-5.15/cpufreq-move-to_gov_attr_set-to-cpufreq.h.patch b/queue-5.15/cpufreq-move-to_gov_attr_set-to-cpufreq.h.patch new file mode 100644 index 00000000000..80866fca1e8 --- /dev/null +++ b/queue-5.15/cpufreq-move-to_gov_attr_set-to-cpufreq.h.patch @@ -0,0 +1,47 @@ +From ae26508651272695a3ab353f75ab9a8daf3da324 Mon Sep 17 00:00:00 2001 +From: Kevin Hao +Date: Sun, 23 Jan 2022 20:45:06 +0800 +Subject: cpufreq: Move to_gov_attr_set() to cpufreq.h + +From: Kevin Hao + +commit ae26508651272695a3ab353f75ab9a8daf3da324 upstream. + +So it can be reused by other codes. + +Signed-off-by: Kevin Hao +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Greg Kroah-Hartman +--- + drivers/cpufreq/cpufreq_governor_attr_set.c | 5 ----- + include/linux/cpufreq.h | 5 +++++ + 2 files changed, 5 insertions(+), 5 deletions(-) + +--- a/drivers/cpufreq/cpufreq_governor_attr_set.c ++++ b/drivers/cpufreq/cpufreq_governor_attr_set.c +@@ -8,11 +8,6 @@ + + #include "cpufreq_governor.h" + +-static inline struct gov_attr_set *to_gov_attr_set(struct kobject *kobj) +-{ +- return container_of(kobj, struct gov_attr_set, kobj); +-} +- + static inline struct governor_attr *to_gov_attr(struct attribute *attr) + { + return container_of(attr, struct governor_attr, attr); +--- a/include/linux/cpufreq.h ++++ b/include/linux/cpufreq.h +@@ -643,6 +643,11 @@ struct gov_attr_set { + /* sysfs ops for cpufreq governors */ + extern const struct sysfs_ops governor_sysfs_ops; + ++static inline struct gov_attr_set *to_gov_attr_set(struct kobject *kobj) ++{ ++ return container_of(kobj, struct gov_attr_set, kobj); ++} ++ + void gov_attr_set_init(struct gov_attr_set *attr_set, struct list_head *list_node); + void gov_attr_set_get(struct gov_attr_set *attr_set, struct list_head *list_node); + unsigned int gov_attr_set_put(struct gov_attr_set *attr_set, struct list_head *list_node); diff --git a/queue-5.15/series b/queue-5.15/series index ce67332978f..31a7865f564 100644 --- a/queue-5.15/series +++ b/queue-5.15/series @@ -195,3 +195,5 @@ net-mdio-mux-meson-g12a-force-internal-phy-off-on-mu.patch treewide-fix-up-files-incorrectly-marked-executable.patch tools-gpio-fix-c-option-of-gpio-event-mon.patch revert-input-synaptics-switch-touchpad-on-hp-laptop-15-da3001tu-to-rmi-mode.patch +cpufreq-move-to_gov_attr_set-to-cpufreq.h.patch +cpufreq-governor-use-kobject-release-method-to-free-dbs_data.patch