All of lore.kernel.org
 help / color / mirror / Atom feed
From: kernel test robot <lkp@intel.com>
To: kbuild@lists.01.org
Subject: [chanwoo:devfreq-testing-passive-gov 3/3] drivers/devfreq/governor_passive.c:251 cpufreq_passive_notifier_call() warn: variable dereferenced before check 'freqs' (see line 247)
Date: Mon, 01 Mar 2021 16:11:47 +0800	[thread overview]
Message-ID: <202103011643.EP8gTO66-lkp@intel.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 14689 bytes --]

CC: kbuild-all(a)lists.01.org
TO: Saravana Kannan <skannan@codeaurora.org>
CC: Chanwoo Choi <cw00.choi@samsung.com>
CC: Sibi Sankar <sibis@codeaurora.org>

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/chanwoo/linux.git devfreq-testing-passive-gov
head:   82d4ff586ae2fb6d89cad871949004bed3438ccb
commit: 82d4ff586ae2fb6d89cad871949004bed3438ccb [3/3] PM / devfreq: Add cpu based scaling support to passive governor
:::::: branch date: 3 hours ago
:::::: commit date: 3 hours ago
config: x86_64-randconfig-m001-20210301 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>

New smatch warnings:
drivers/devfreq/governor_passive.c:251 cpufreq_passive_notifier_call() warn: variable dereferenced before check 'freqs' (see line 247)
drivers/devfreq/governor_passive.c:403 devfreq_passive_event_handler() warn: ignoring unreachable code.

Old smatch warnings:
drivers/devfreq/governor_passive.c:339 cpufreq_passive_register() warn: possible memory leak of 'state'
drivers/devfreq/governor_passive.c:348 cpufreq_passive_register() warn: possible memory leak of 'state'

vim +/freqs +251 drivers/devfreq/governor_passive.c

996133119f5733 Chanwoo Choi    2016-03-22  238  
82d4ff586ae2fb Saravana Kannan 2021-03-01  239  static int cpufreq_passive_notifier_call(struct notifier_block *nb,
82d4ff586ae2fb Saravana Kannan 2021-03-01  240  					 unsigned long event, void *ptr)
82d4ff586ae2fb Saravana Kannan 2021-03-01  241  {
82d4ff586ae2fb Saravana Kannan 2021-03-01  242  	struct devfreq_passive_data *data =
82d4ff586ae2fb Saravana Kannan 2021-03-01  243  			container_of(nb, struct devfreq_passive_data, nb);
82d4ff586ae2fb Saravana Kannan 2021-03-01  244  	struct devfreq *devfreq = (struct devfreq *)data->this;
82d4ff586ae2fb Saravana Kannan 2021-03-01  245  	struct devfreq_cpu_state *cpu_state;
82d4ff586ae2fb Saravana Kannan 2021-03-01  246  	struct cpufreq_freqs *freqs = ptr;
82d4ff586ae2fb Saravana Kannan 2021-03-01 @247  	unsigned long freq = freqs->new;
82d4ff586ae2fb Saravana Kannan 2021-03-01  248  	unsigned int cur_freq;
82d4ff586ae2fb Saravana Kannan 2021-03-01  249  	int ret;
82d4ff586ae2fb Saravana Kannan 2021-03-01  250  
82d4ff586ae2fb Saravana Kannan 2021-03-01 @251  	if (event != CPUFREQ_POSTCHANGE || !freqs ||
82d4ff586ae2fb Saravana Kannan 2021-03-01  252  		!data->cpu_state[freqs->policy->cpu])
82d4ff586ae2fb Saravana Kannan 2021-03-01  253  		return 0;
82d4ff586ae2fb Saravana Kannan 2021-03-01  254  
82d4ff586ae2fb Saravana Kannan 2021-03-01  255  	cpu_state = data->cpu_state[freqs->policy->cpu];
82d4ff586ae2fb Saravana Kannan 2021-03-01  256  	if (cpu_state->freq == freqs->new)
82d4ff586ae2fb Saravana Kannan 2021-03-01  257  		return 0;
82d4ff586ae2fb Saravana Kannan 2021-03-01  258  
82d4ff586ae2fb Saravana Kannan 2021-03-01  259  	/* Backup current freq and pre-update cpu state freq*/
82d4ff586ae2fb Saravana Kannan 2021-03-01  260  	cur_freq = cpu_state->freq;
82d4ff586ae2fb Saravana Kannan 2021-03-01  261  	cpu_state->freq = freqs->new;
82d4ff586ae2fb Saravana Kannan 2021-03-01  262  
82d4ff586ae2fb Saravana Kannan 2021-03-01  263  	mutex_lock(&devfreq->lock);
82d4ff586ae2fb Saravana Kannan 2021-03-01  264  	ret = devfreq_update_target(devfreq, freq);
82d4ff586ae2fb Saravana Kannan 2021-03-01  265  	mutex_unlock(&devfreq->lock);
82d4ff586ae2fb Saravana Kannan 2021-03-01  266  	if (ret) {
82d4ff586ae2fb Saravana Kannan 2021-03-01  267  		cpu_state->freq = cur_freq;
82d4ff586ae2fb Saravana Kannan 2021-03-01  268  		dev_err(&devfreq->dev, "Couldn't update the frequency.\n");
82d4ff586ae2fb Saravana Kannan 2021-03-01  269  		return ret;
82d4ff586ae2fb Saravana Kannan 2021-03-01  270  	}
82d4ff586ae2fb Saravana Kannan 2021-03-01  271  
82d4ff586ae2fb Saravana Kannan 2021-03-01  272  	return 0;
82d4ff586ae2fb Saravana Kannan 2021-03-01  273  }
82d4ff586ae2fb Saravana Kannan 2021-03-01  274  
82d4ff586ae2fb Saravana Kannan 2021-03-01  275  static int cpufreq_passive_register(struct devfreq_passive_data **p_data)
82d4ff586ae2fb Saravana Kannan 2021-03-01  276  {
82d4ff586ae2fb Saravana Kannan 2021-03-01  277  	struct devfreq_passive_data *data = *p_data;
82d4ff586ae2fb Saravana Kannan 2021-03-01  278  	struct devfreq *devfreq = (struct devfreq *)data->this;
82d4ff586ae2fb Saravana Kannan 2021-03-01  279  	struct device *dev = devfreq->dev.parent;
82d4ff586ae2fb Saravana Kannan 2021-03-01  280  	struct opp_table *opp_table = NULL;
82d4ff586ae2fb Saravana Kannan 2021-03-01  281  	struct devfreq_cpu_state *state;
82d4ff586ae2fb Saravana Kannan 2021-03-01  282  	struct cpufreq_policy *policy;
82d4ff586ae2fb Saravana Kannan 2021-03-01  283  	struct device *cpu_dev;
82d4ff586ae2fb Saravana Kannan 2021-03-01  284  	unsigned int cpu;
82d4ff586ae2fb Saravana Kannan 2021-03-01  285  	int ret;
82d4ff586ae2fb Saravana Kannan 2021-03-01  286  
82d4ff586ae2fb Saravana Kannan 2021-03-01  287  	get_online_cpus();
82d4ff586ae2fb Saravana Kannan 2021-03-01  288  	data->nb.notifier_call = cpufreq_passive_notifier_call;
82d4ff586ae2fb Saravana Kannan 2021-03-01  289  	ret = cpufreq_register_notifier(&data->nb,
82d4ff586ae2fb Saravana Kannan 2021-03-01  290  					CPUFREQ_TRANSITION_NOTIFIER);
82d4ff586ae2fb Saravana Kannan 2021-03-01  291  	if (ret) {
82d4ff586ae2fb Saravana Kannan 2021-03-01  292  		dev_err(dev, "Couldn't register cpufreq notifier.\n");
82d4ff586ae2fb Saravana Kannan 2021-03-01  293  		data->nb.notifier_call = NULL;
82d4ff586ae2fb Saravana Kannan 2021-03-01  294  		goto out;
82d4ff586ae2fb Saravana Kannan 2021-03-01  295  	}
82d4ff586ae2fb Saravana Kannan 2021-03-01  296  
82d4ff586ae2fb Saravana Kannan 2021-03-01  297  	/* Populate devfreq_cpu_state */
82d4ff586ae2fb Saravana Kannan 2021-03-01  298  	for_each_online_cpu(cpu) {
82d4ff586ae2fb Saravana Kannan 2021-03-01  299  		if (data->cpu_state[cpu])
82d4ff586ae2fb Saravana Kannan 2021-03-01  300  			continue;
82d4ff586ae2fb Saravana Kannan 2021-03-01  301  
82d4ff586ae2fb Saravana Kannan 2021-03-01  302  		policy = cpufreq_cpu_get(cpu);
82d4ff586ae2fb Saravana Kannan 2021-03-01  303  		if (policy) {
82d4ff586ae2fb Saravana Kannan 2021-03-01  304  			state = kzalloc(sizeof(*state), GFP_KERNEL);
82d4ff586ae2fb Saravana Kannan 2021-03-01  305  			if (!state) {
82d4ff586ae2fb Saravana Kannan 2021-03-01  306  				ret = -ENOMEM;
82d4ff586ae2fb Saravana Kannan 2021-03-01  307  				goto out;
82d4ff586ae2fb Saravana Kannan 2021-03-01  308  			}
82d4ff586ae2fb Saravana Kannan 2021-03-01  309  
82d4ff586ae2fb Saravana Kannan 2021-03-01  310  			cpu_dev = get_cpu_device(cpu);
82d4ff586ae2fb Saravana Kannan 2021-03-01  311  			if (!cpu_dev) {
82d4ff586ae2fb Saravana Kannan 2021-03-01  312  				dev_err(dev, "Couldn't get cpu device.\n");
82d4ff586ae2fb Saravana Kannan 2021-03-01  313  				ret = -ENODEV;
82d4ff586ae2fb Saravana Kannan 2021-03-01  314  				goto out;
82d4ff586ae2fb Saravana Kannan 2021-03-01  315  			}
82d4ff586ae2fb Saravana Kannan 2021-03-01  316  
82d4ff586ae2fb Saravana Kannan 2021-03-01  317  			opp_table = dev_pm_opp_get_opp_table(cpu_dev);
82d4ff586ae2fb Saravana Kannan 2021-03-01  318  			if (IS_ERR(devfreq->opp_table)) {
82d4ff586ae2fb Saravana Kannan 2021-03-01  319  				ret = PTR_ERR(opp_table);
82d4ff586ae2fb Saravana Kannan 2021-03-01  320  				goto out;
82d4ff586ae2fb Saravana Kannan 2021-03-01  321  			}
82d4ff586ae2fb Saravana Kannan 2021-03-01  322  
82d4ff586ae2fb Saravana Kannan 2021-03-01  323  			state->dev = cpu_dev;
82d4ff586ae2fb Saravana Kannan 2021-03-01  324  			state->opp_table = opp_table;
82d4ff586ae2fb Saravana Kannan 2021-03-01  325  			state->first_cpu = cpumask_first(policy->related_cpus);
82d4ff586ae2fb Saravana Kannan 2021-03-01  326  			state->freq = policy->cur;
82d4ff586ae2fb Saravana Kannan 2021-03-01  327  			state->min_freq = policy->cpuinfo.min_freq;
82d4ff586ae2fb Saravana Kannan 2021-03-01  328  			state->max_freq = policy->cpuinfo.max_freq;
82d4ff586ae2fb Saravana Kannan 2021-03-01  329  			data->cpu_state[cpu] = state;
82d4ff586ae2fb Saravana Kannan 2021-03-01  330  			cpufreq_cpu_put(policy);
82d4ff586ae2fb Saravana Kannan 2021-03-01  331  		} else {
82d4ff586ae2fb Saravana Kannan 2021-03-01  332  			ret = -EPROBE_DEFER;
82d4ff586ae2fb Saravana Kannan 2021-03-01  333  			goto out;
82d4ff586ae2fb Saravana Kannan 2021-03-01  334  		}
82d4ff586ae2fb Saravana Kannan 2021-03-01  335  	}
82d4ff586ae2fb Saravana Kannan 2021-03-01  336  out:
82d4ff586ae2fb Saravana Kannan 2021-03-01  337  	put_online_cpus();
82d4ff586ae2fb Saravana Kannan 2021-03-01  338  	if (ret)
82d4ff586ae2fb Saravana Kannan 2021-03-01  339  		return ret;
82d4ff586ae2fb Saravana Kannan 2021-03-01  340  
82d4ff586ae2fb Saravana Kannan 2021-03-01  341  	/* Update devfreq */
82d4ff586ae2fb Saravana Kannan 2021-03-01  342  	mutex_lock(&devfreq->lock);
82d4ff586ae2fb Saravana Kannan 2021-03-01  343  	ret = update_devfreq(devfreq);
82d4ff586ae2fb Saravana Kannan 2021-03-01  344  	mutex_unlock(&devfreq->lock);
82d4ff586ae2fb Saravana Kannan 2021-03-01  345  	if (ret)
82d4ff586ae2fb Saravana Kannan 2021-03-01  346  		dev_err(dev, "Couldn't update the frequency.\n");
82d4ff586ae2fb Saravana Kannan 2021-03-01  347  
82d4ff586ae2fb Saravana Kannan 2021-03-01  348  	return ret;
82d4ff586ae2fb Saravana Kannan 2021-03-01  349  }
82d4ff586ae2fb Saravana Kannan 2021-03-01  350  
82d4ff586ae2fb Saravana Kannan 2021-03-01  351  static int cpufreq_passive_unregister(struct devfreq_passive_data **p_data)
82d4ff586ae2fb Saravana Kannan 2021-03-01  352  {
82d4ff586ae2fb Saravana Kannan 2021-03-01  353  	struct devfreq_passive_data *data = *p_data;
82d4ff586ae2fb Saravana Kannan 2021-03-01  354  	struct devfreq_cpu_state *cpu_state;
82d4ff586ae2fb Saravana Kannan 2021-03-01  355  	int cpu;
82d4ff586ae2fb Saravana Kannan 2021-03-01  356  
82d4ff586ae2fb Saravana Kannan 2021-03-01  357  	if (data->nb.notifier_call)
82d4ff586ae2fb Saravana Kannan 2021-03-01  358  		cpufreq_unregister_notifier(&data->nb,
82d4ff586ae2fb Saravana Kannan 2021-03-01  359  					    CPUFREQ_TRANSITION_NOTIFIER);
82d4ff586ae2fb Saravana Kannan 2021-03-01  360  
82d4ff586ae2fb Saravana Kannan 2021-03-01  361  	for_each_possible_cpu(cpu) {
82d4ff586ae2fb Saravana Kannan 2021-03-01  362  		cpu_state = data->cpu_state[cpu];
82d4ff586ae2fb Saravana Kannan 2021-03-01  363  		if (cpu_state) {
82d4ff586ae2fb Saravana Kannan 2021-03-01  364  			if (cpu_state->opp_table)
82d4ff586ae2fb Saravana Kannan 2021-03-01  365  				dev_pm_opp_put_opp_table(cpu_state->opp_table);
82d4ff586ae2fb Saravana Kannan 2021-03-01  366  			kfree(cpu_state);
82d4ff586ae2fb Saravana Kannan 2021-03-01  367  			cpu_state = NULL;
82d4ff586ae2fb Saravana Kannan 2021-03-01  368  		}
82d4ff586ae2fb Saravana Kannan 2021-03-01  369  	}
82d4ff586ae2fb Saravana Kannan 2021-03-01  370  
82d4ff586ae2fb Saravana Kannan 2021-03-01  371  	return 0;
82d4ff586ae2fb Saravana Kannan 2021-03-01  372  }
82d4ff586ae2fb Saravana Kannan 2021-03-01  373  
996133119f5733 Chanwoo Choi    2016-03-22  374  static int devfreq_passive_event_handler(struct devfreq *devfreq,
996133119f5733 Chanwoo Choi    2016-03-22  375  				unsigned int event, void *data)
996133119f5733 Chanwoo Choi    2016-03-22  376  {
996133119f5733 Chanwoo Choi    2016-03-22  377  	struct devfreq_passive_data *p_data
996133119f5733 Chanwoo Choi    2016-03-22  378  			= (struct devfreq_passive_data *)devfreq->data;
996133119f5733 Chanwoo Choi    2016-03-22  379  	struct devfreq *parent = (struct devfreq *)p_data->parent;
996133119f5733 Chanwoo Choi    2016-03-22  380  	struct notifier_block *nb = &p_data->nb;
996133119f5733 Chanwoo Choi    2016-03-22  381  	int ret = 0;
996133119f5733 Chanwoo Choi    2016-03-22  382  
82d4ff586ae2fb Saravana Kannan 2021-03-01  383  	if (p_data->parent_type == DEVFREQ_PARENT_DEV && !parent)
996133119f5733 Chanwoo Choi    2016-03-22  384  		return -EPROBE_DEFER;
996133119f5733 Chanwoo Choi    2016-03-22  385  
996133119f5733 Chanwoo Choi    2016-03-22  386  	switch (event) {
996133119f5733 Chanwoo Choi    2016-03-22  387  	case DEVFREQ_GOV_START:
996133119f5733 Chanwoo Choi    2016-03-22  388  		if (!p_data->this)
996133119f5733 Chanwoo Choi    2016-03-22  389  			p_data->this = devfreq;
996133119f5733 Chanwoo Choi    2016-03-22  390  
82d4ff586ae2fb Saravana Kannan 2021-03-01  391  		if (p_data->parent_type == DEVFREQ_PARENT_DEV) {
996133119f5733 Chanwoo Choi    2016-03-22  392  			nb->notifier_call = devfreq_passive_notifier_call;
0ef7c7cce43f6e Leonard Crestez 2019-08-08  393  			ret = devfreq_register_notifier(parent, nb,
996133119f5733 Chanwoo Choi    2016-03-22  394  						DEVFREQ_TRANSITION_NOTIFIER);
82d4ff586ae2fb Saravana Kannan 2021-03-01  395  		} else if (p_data->parent_type == CPUFREQ_PARENT_DEV) {
82d4ff586ae2fb Saravana Kannan 2021-03-01  396  			ret = cpufreq_passive_register(&p_data);
82d4ff586ae2fb Saravana Kannan 2021-03-01  397  		} else {
82d4ff586ae2fb Saravana Kannan 2021-03-01  398  			ret = -EINVAL;
82d4ff586ae2fb Saravana Kannan 2021-03-01  399  		}
996133119f5733 Chanwoo Choi    2016-03-22  400  		break;
996133119f5733 Chanwoo Choi    2016-03-22  401  	case DEVFREQ_GOV_STOP:
82d4ff586ae2fb Saravana Kannan 2021-03-01  402  		break;
82d4ff586ae2fb Saravana Kannan 2021-03-01 @403  		if (p_data->parent_type == DEVFREQ_PARENT_DEV)
0ef7c7cce43f6e Leonard Crestez 2019-08-08  404  			WARN_ON(devfreq_unregister_notifier(parent, nb,
0ef7c7cce43f6e Leonard Crestez 2019-08-08  405  						DEVFREQ_TRANSITION_NOTIFIER));
82d4ff586ae2fb Saravana Kannan 2021-03-01  406  		else if (p_data->parent_type == CPUFREQ_PARENT_DEV)
82d4ff586ae2fb Saravana Kannan 2021-03-01  407  			WARN_ON(cpufreq_passive_unregister(&p_data));
82d4ff586ae2fb Saravana Kannan 2021-03-01  408  		else
82d4ff586ae2fb Saravana Kannan 2021-03-01  409  			ret = -EINVAL;
996133119f5733 Chanwoo Choi    2016-03-22  410   		break;
996133119f5733 Chanwoo Choi    2016-03-22  411  	default:
996133119f5733 Chanwoo Choi    2016-03-22  412  		break;
996133119f5733 Chanwoo Choi    2016-03-22  413  	}
996133119f5733 Chanwoo Choi    2016-03-22  414  
996133119f5733 Chanwoo Choi    2016-03-22  415  	return ret;
996133119f5733 Chanwoo Choi    2016-03-22  416  }
996133119f5733 Chanwoo Choi    2016-03-22  417  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 30943 bytes --]

             reply	other threads:[~2021-03-01  8:11 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-01  8:11 kernel test robot [this message]
  -- strict thread matches above, loose matches on Subject: below --
2021-03-01  9:22 [chanwoo:devfreq-testing-passive-gov 3/3] drivers/devfreq/governor_passive.c:251 cpufreq_passive_notifier_call() warn: variable dereferenced before check 'freqs' (see line 247) Dan Carpenter

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=202103011643.EP8gTO66-lkp@intel.com \
    --to=lkp@intel.com \
    --cc=kbuild@lists.01.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.