Message ID | 20220426221523.3056696-16-daniel.lezcano@linexp.org |
---|---|
State | Superseded |
Headers | show |
Series | thermal OF rework | expand |
Hi Daniel,
I love your patch! Perhaps something to improve:
[auto build test WARNING on tegra/for-next]
[also build test WARNING on sre-power-supply/for-next linus/master v5.18-rc4]
[cannot apply to rafael-pm/thermal next-20220427]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/intel-lab-lkp/linux/commits/Daniel-Lezcano/thermal-OF-rework/20220427-061937
base: https://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux.git for-next
config: i386-randconfig-a004-20220425 (https://download.01.org/0day-ci/archive/20220427/202204271620.h0RD5aZy-lkp@intel.com/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project 1cddcfdc3c683b393df1a5c9063252eb60e52818)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/intel-lab-lkp/linux/commit/b446fa392d1d9fa791ca672608b0860fe37e040f
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Daniel-Lezcano/thermal-OF-rework/20220427-061937
git checkout b446fa392d1d9fa791ca672608b0860fe37e040f
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=i386 SHELL=/bin/bash drivers/thermal/
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All warnings (new ones prefixed by >>):
>> drivers/thermal/thermal_of.c:965:2: warning: variable 'gchild' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
if (!tz->tbps) {
^~~~~~~~~~~~~~
include/linux/compiler.h:56:28: note: expanded from macro 'if'
#define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/compiler.h:58:30: note: expanded from macro '__trace_if_var'
#define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond))
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/thermal/thermal_of.c:996:14: note: uninitialized use occurs here
of_node_put(gchild);
^~~~~~
drivers/thermal/thermal_of.c:965:2: note: remove the 'if' if its condition is always false
if (!tz->tbps) {
^~~~~~~~~~~~~~~~
include/linux/compiler.h:56:23: note: expanded from macro 'if'
#define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
^
drivers/thermal/thermal_of.c:905:43: note: initialize the variable 'gchild' to silence this warning
struct device_node *child = NULL, *gchild;
^
= NULL
1 warning generated.
vim +965 drivers/thermal/thermal_of.c
b446fa392d1d9f drivers/thermal/thermal_of.c Daniel Lezcano 2022-04-27 887
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 888 /**
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 889 * thermal_of_build_thermal_zone - parse and fill one thermal zone data
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 890 * @np: DT node containing a thermal zone node
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 891 *
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 892 * This function parses a thermal zone type of node represented by
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 893 * @np parameter and fills the read data into a __thermal_zone data structure
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 894 * and return this pointer.
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 895 *
a46dbae8abe5cd drivers/thermal/of-thermal.c Eduardo Valentin 2015-05-11 896 * TODO: Missing properties to parse: thermal-sensor-names
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 897 *
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 898 * Return: On success returns a valid struct __thermal_zone,
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 899 * otherwise, it returns a corresponding ERR_PTR(). Caller must
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 900 * check the return value with help of IS_ERR() helper.
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 901 */
c0ff8aaae36955 drivers/thermal/of-thermal.c Julia Lawall 2016-04-19 902 static struct __thermal_zone
c0ff8aaae36955 drivers/thermal/of-thermal.c Julia Lawall 2016-04-19 903 __init *thermal_of_build_thermal_zone(struct device_node *np)
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 904 {
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 905 struct device_node *child = NULL, *gchild;
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 906 struct __thermal_zone *tz;
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 907 int ret, i;
a46dbae8abe5cd drivers/thermal/of-thermal.c Eduardo Valentin 2015-05-11 908 u32 prop, coef[2];
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 909
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 910 if (!np) {
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 911 pr_err("no thermal zone np\n");
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 912 return ERR_PTR(-EINVAL);
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 913 }
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 914
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 915 tz = kzalloc(sizeof(*tz), GFP_KERNEL);
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 916 if (!tz)
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 917 return ERR_PTR(-ENOMEM);
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 918
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 919 ret = of_property_read_u32(np, "polling-delay-passive", &prop);
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 920 if (ret < 0) {
3079f340caa72a drivers/thermal/of-thermal.c Amit Kucheria 2019-01-21 921 pr_err("%pOFn: missing polling-delay-passive property\n", np);
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 922 goto free_tz;
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 923 }
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 924 tz->passive_delay = prop;
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 925
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 926 ret = of_property_read_u32(np, "polling-delay", &prop);
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 927 if (ret < 0) {
3079f340caa72a drivers/thermal/of-thermal.c Amit Kucheria 2019-01-21 928 pr_err("%pOFn: missing polling-delay property\n", np);
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 929 goto free_tz;
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 930 }
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 931 tz->polling_delay = prop;
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 932
a46dbae8abe5cd drivers/thermal/of-thermal.c Eduardo Valentin 2015-05-11 933 /*
a46dbae8abe5cd drivers/thermal/of-thermal.c Eduardo Valentin 2015-05-11 934 * REVIST: for now, the thermal framework supports only
a46dbae8abe5cd drivers/thermal/of-thermal.c Eduardo Valentin 2015-05-11 935 * one sensor per thermal zone. Thus, we are considering
a46dbae8abe5cd drivers/thermal/of-thermal.c Eduardo Valentin 2015-05-11 936 * only the first two values as slope and offset.
a46dbae8abe5cd drivers/thermal/of-thermal.c Eduardo Valentin 2015-05-11 937 */
a46dbae8abe5cd drivers/thermal/of-thermal.c Eduardo Valentin 2015-05-11 938 ret = of_property_read_u32_array(np, "coefficients", coef, 2);
a46dbae8abe5cd drivers/thermal/of-thermal.c Eduardo Valentin 2015-05-11 939 if (ret == 0) {
a46dbae8abe5cd drivers/thermal/of-thermal.c Eduardo Valentin 2015-05-11 940 tz->slope = coef[0];
a46dbae8abe5cd drivers/thermal/of-thermal.c Eduardo Valentin 2015-05-11 941 tz->offset = coef[1];
a46dbae8abe5cd drivers/thermal/of-thermal.c Eduardo Valentin 2015-05-11 942 } else {
a46dbae8abe5cd drivers/thermal/of-thermal.c Eduardo Valentin 2015-05-11 943 tz->slope = 1;
a46dbae8abe5cd drivers/thermal/of-thermal.c Eduardo Valentin 2015-05-11 944 tz->offset = 0;
a46dbae8abe5cd drivers/thermal/of-thermal.c Eduardo Valentin 2015-05-11 945 }
a46dbae8abe5cd drivers/thermal/of-thermal.c Eduardo Valentin 2015-05-11 946
b446fa392d1d9f drivers/thermal/thermal_of.c Daniel Lezcano 2022-04-27 947 tz->trips = thermal_of_trips_init(np, &tz->ntrips);
b446fa392d1d9f drivers/thermal/thermal_of.c Daniel Lezcano 2022-04-27 948 if (IS_ERR(tz->trips)) {
b446fa392d1d9f drivers/thermal/thermal_of.c Daniel Lezcano 2022-04-27 949 ret = PTR_ERR(tz->trips);
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 950 goto finish;
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 951 }
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 952
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 953 /* cooling-maps */
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 954 child = of_get_child_by_name(np, "cooling-maps");
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 955
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 956 /* cooling-maps not provided */
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 957 if (!child)
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 958 goto finish;
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 959
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 960 tz->num_tbps = of_get_child_count(child);
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 961 if (tz->num_tbps == 0)
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 962 goto finish;
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 963
6396bb221514d2 drivers/thermal/of-thermal.c Kees Cook 2018-06-12 964 tz->tbps = kcalloc(tz->num_tbps, sizeof(*tz->tbps), GFP_KERNEL);
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 @965 if (!tz->tbps) {
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 966 ret = -ENOMEM;
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 967 goto free_trips;
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 968 }
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 969
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 970 i = 0;
ca9521b770c988 drivers/thermal/of-thermal.c Stephen Boyd 2014-06-18 971 for_each_child_of_node(child, gchild) {
b446fa392d1d9f drivers/thermal/thermal_of.c Daniel Lezcano 2022-04-27 972 ret = thermal_of_populate_bind_params(np, gchild, &tz->tbps[i++]);
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 973 if (ret)
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 974 goto free_tbps;
ca9521b770c988 drivers/thermal/of-thermal.c Stephen Boyd 2014-06-18 975 }
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 976
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 977 finish:
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 978 of_node_put(child);
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 979
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 980 return tz;
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 981
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 982 free_tbps:
a92bab8919e3fb drivers/thermal/of-thermal.c Viresh Kumar 2018-08-08 983 for (i = i - 1; i >= 0; i--) {
a92bab8919e3fb drivers/thermal/of-thermal.c Viresh Kumar 2018-08-08 984 struct __thermal_bind_params *tbp = tz->tbps + i;
a92bab8919e3fb drivers/thermal/of-thermal.c Viresh Kumar 2018-08-08 985 int j;
a92bab8919e3fb drivers/thermal/of-thermal.c Viresh Kumar 2018-08-08 986
a92bab8919e3fb drivers/thermal/of-thermal.c Viresh Kumar 2018-08-08 987 for (j = 0; j < tbp->count; j++)
a92bab8919e3fb drivers/thermal/of-thermal.c Viresh Kumar 2018-08-08 988 of_node_put(tbp->tcbp[j].cooling_device);
a92bab8919e3fb drivers/thermal/of-thermal.c Viresh Kumar 2018-08-08 989
a92bab8919e3fb drivers/thermal/of-thermal.c Viresh Kumar 2018-08-08 990 kfree(tbp->tcbp);
a92bab8919e3fb drivers/thermal/of-thermal.c Viresh Kumar 2018-08-08 991 }
a92bab8919e3fb drivers/thermal/of-thermal.c Viresh Kumar 2018-08-08 992
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 993 kfree(tz->tbps);
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 994 free_trips:
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 995 kfree(tz->trips);
c2aad93c7edd5e drivers/thermal/of-thermal.c Vladimir Zapolskiy 2014-09-29 996 of_node_put(gchild);
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 997 free_tz:
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 998 kfree(tz);
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 999 of_node_put(child);
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 1000
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 1001 return ERR_PTR(ret);
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 1002 }
4e5e4705bf69ea drivers/thermal/of-thermal.c Eduardo Valentin 2013-07-03 1003
diff --git a/drivers/thermal/thermal_of.c b/drivers/thermal/thermal_of.c index a356a7b2d73d..ef9c2e7f1af4 100644 --- a/drivers/thermal/thermal_of.c +++ b/drivers/thermal/thermal_of.c @@ -681,7 +681,8 @@ static int of_find_trip_id(struct device_node *np, struct device_node *trip) * * Return: 0 on success, proper error code otherwise */ -static int thermal_of_populate_bind_params(struct device_node *np, +static int thermal_of_populate_bind_params(struct device_node *tz_np, + struct device_node *np, struct __thermal_bind_params *__tbp) { struct of_phandle_args cooling_spec; @@ -703,7 +704,7 @@ static int thermal_of_populate_bind_params(struct device_node *np, return -ENODEV; } - trip_id = of_find_trip_id(np, trip); + trip_id = of_find_trip_id(tz_np, trip); if (trip_id < 0) { ret = trip_id; goto end; @@ -837,6 +838,53 @@ static int thermal_of_populate_trip(struct device_node *np, return 0; } +static struct thermal_trip *thermal_of_trips_init(struct device_node *np, int *ntrips) +{ + struct thermal_trip *tt; + struct device_node *trips, *trip; + int ret, count; + + trips = of_get_child_by_name(np, "trips"); + if (!trips) { + pr_err("Failed to find 'trips' node\n"); + return ERR_PTR(-EINVAL); + } + + count = of_get_child_count(trips); + if (!count) { + pr_err("No trip point defined\n"); + ret = -EINVAL; + goto out_of_node_put; + } + + tt = kzalloc(sizeof(*tt) * count, GFP_KERNEL); + if (!tt) { + ret = -ENOMEM; + goto out_of_node_put; + } + + *ntrips = count; + + count = 0; + for_each_child_of_node(trips, trip) { + ret = thermal_of_populate_trip(trip, &tt[count++]); + if (ret) + goto out_kfree; + } + + of_node_put(trips); + + return tt; + +out_kfree: + kfree(tt); + *ntrips = 0; +out_of_node_put: + of_node_put(trips); + + return ERR_PTR(ret); +} + /** * thermal_of_build_thermal_zone - parse and fill one thermal zone data * @np: DT node containing a thermal zone node @@ -855,7 +903,6 @@ static struct __thermal_zone __init *thermal_of_build_thermal_zone(struct device_node *np) { struct device_node *child = NULL, *gchild; - struct device_node *trips; struct __thermal_zone *tz; int ret, i; u32 prop, coef[2]; @@ -897,28 +944,10 @@ __init *thermal_of_build_thermal_zone(struct device_node *np) tz->offset = 0; } - /* trips */ - trips = of_get_child_by_name(np, "trips"); - - /* No trips provided */ - if (!trips) + tz->trips = thermal_of_trips_init(np, &tz->ntrips); + if (IS_ERR(tz->trips)) { + ret = PTR_ERR(tz->trips); goto finish; - - tz->ntrips = of_get_child_count(trips); - if (tz->ntrips == 0) /* must have at least one child */ - goto finish; - - tz->trips = kcalloc(tz->ntrips, sizeof(*tz->trips), GFP_KERNEL); - if (!tz->trips) { - ret = -ENOMEM; - goto free_tz; - } - - i = 0; - for_each_child_of_node(trips, gchild) { - ret = thermal_of_populate_trip(gchild, &tz->trips[i++]); - if (ret) - goto free_trips; } /* cooling-maps */ @@ -940,7 +969,7 @@ __init *thermal_of_build_thermal_zone(struct device_node *np) i = 0; for_each_child_of_node(child, gchild) { - ret = thermal_of_populate_bind_params(gchild, &tz->tbps[i++]); + ret = thermal_of_populate_bind_params(np, gchild, &tz->tbps[i++]); if (ret) goto free_tbps; }
Self contain the trip initialization from the device tree in a single function for the sake of making the code flow more clear. Cc: Alexandre Bailon <abailon@baylibre.com> Cc: Kevin Hilman <khilman@baylibre.com> Cc; Eduardo Valentin <eduval@amazon.com> Signed-off-by: Daniel Lezcano <daniel.lezcano@linexp.org> --- drivers/thermal/thermal_of.c | 79 ++++++++++++++++++++++++------------ 1 file changed, 54 insertions(+), 25 deletions(-)