[bug report] cpufreq: mediatek: Link CCI device to CPU
Dan Carpenter
error27 at gmail.com
Mon Feb 27 00:07:12 PST 2023
Hello Rex-BC Chen,
The patch 0daa47325bae: "cpufreq: mediatek: Link CCI device to CPU"
from May 5, 2022, leads to the following Smatch static checker
warning:
drivers/cpufreq/mediatek-cpufreq.c:405 mtk_cpu_dvfs_info_init()
warn: passing zero to 'PTR_ERR'
drivers/cpufreq/mediatek-cpufreq.c
387 static int mtk_cpu_dvfs_info_init(struct mtk_cpu_dvfs_info *info, int cpu)
388 {
389 struct device *cpu_dev;
390 struct dev_pm_opp *opp;
391 unsigned long rate;
392 int ret;
393
394 cpu_dev = get_cpu_device(cpu);
395 if (!cpu_dev) {
396 dev_err(cpu_dev, "failed to get cpu%d device\n", cpu);
397 return -ENODEV;
398 }
399 info->cpu_dev = cpu_dev;
400
401 info->ccifreq_bound = false;
402 if (info->soc_data->ccifreq_supported) {
403 info->cci_dev = of_get_cci(info->cpu_dev);
404 if (IS_ERR_OR_NULL(info->cci_dev)) {
--> 405 ret = PTR_ERR(info->cci_dev);
406 dev_err(cpu_dev, "cpu%d: failed to get cci device\n", cpu);
407 return -ENODEV;
This code is "harmless" in terms of run time but it's also wrong. Linus
once complained about this Smatch check that actually passing zero to
PTR_ERR() is allowed but I explained to him that in real life 95% or
19 times out of 20 then when people have this warning there is something
wrong. Today I have seen many of these bugs and 1 non-bug.
[Btw, this code will also trigger another warning because the "ret = "
assignment is never used.]
This driver does a lot of checking for IS_ERR_OR_NULL() and in each case
the code is doing something wrong. I have explained this in my blog:
https://staticthinking.wordpress.com/2022/08/01/mixing-error-pointers-and-null/
The existance of the IS_ERR_OR_NULL() function doesn't mean that we
don't have to care if the function returns NULL or if it returns error
pointers...
If a function returns NULL, then we have to check for NULL. If a
function returns error pointers we have to check for error pointers.
If a function returns a mix of error pointers and NULL the *most* of the
time the errors need to be handled differently from the NULL returns.
For these functions a NULL is *not* an error but is instead a special
kind of success where the feature is not enabled.
Q: Give me the feature
A: The feature is disables so here is a NULL. Success!
The driver then has to written to handle an optional feature which has
been disabled. Do not print an error message. Do not return an error
code.
408 }
409 }
regards,
dan carpenter
More information about the Linux-mediatek
mailing list