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 --]
next 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.