* [chanwoo:devfreq-testing-passive-gov 3/3] drivers/devfreq/governor_passive.c:247:23: warning: Either the condition '!freqs' is redundant or there is possible null pointer dereference: freqs.
@ 2021-03-01 10:27 kernel test robot
0 siblings, 0 replies; 2+ messages in thread
From: kernel test robot @ 2021-03-01 10:27 UTC (permalink / raw)
To: kbuild
[-- Attachment #1: Type: text/plain, Size: 14950 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: 5 hours ago
:::::: commit date: 5 hours ago
compiler: riscv64-linux-gcc (GCC) 9.3.0
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
cppcheck possible warnings: (new ones prefixed by >>, may not real problems)
>> drivers/devfreq/governor_passive.c:247:23: warning: Either the condition '!freqs' is redundant or there is possible null pointer dereference: freqs. [nullPointerRedundantCheck]
unsigned long freq = freqs->new;
^
drivers/devfreq/governor_passive.c:251:37: note: Assuming that condition '!freqs' is not redundant
if (event != CPUFREQ_POSTCHANGE || !freqs ||
^
drivers/devfreq/governor_passive.c:247:23: note: Null pointer dereference
unsigned long freq = freqs->new;
^
>> drivers/devfreq/governor_passive.c:403:3: warning: Statements following return, break, continue, goto or throw will never be executed. [unreachableCode]
if (p_data->parent_type == DEVFREQ_PARENT_DEV)
^
vim +247 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
^ permalink raw reply [flat|nested] 2+ messages in thread
* [chanwoo:devfreq-testing-passive-gov 3/3] drivers/devfreq/governor_passive.c:247:23: warning: Either the condition '!freqs' is redundant or there is possible null pointer dereference: freqs.
@ 2021-03-02 0:30 kernel test robot
0 siblings, 0 replies; 2+ messages in thread
From: kernel test robot @ 2021-03-02 0:30 UTC (permalink / raw)
To: kbuild-all
[-- Attachment #1: Type: text/plain, Size: 14723 bytes --]
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
compiler: riscv64-linux-gcc (GCC) 9.3.0
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
cppcheck possible warnings: (new ones prefixed by >>, may not real problems)
>> drivers/devfreq/governor_passive.c:247:23: warning: Either the condition '!freqs' is redundant or there is possible null pointer dereference: freqs. [nullPointerRedundantCheck]
unsigned long freq = freqs->new;
^
drivers/devfreq/governor_passive.c:251:37: note: Assuming that condition '!freqs' is not redundant
if (event != CPUFREQ_POSTCHANGE || !freqs ||
^
drivers/devfreq/governor_passive.c:247:23: note: Null pointer dereference
unsigned long freq = freqs->new;
^
>> drivers/devfreq/governor_passive.c:403:3: warning: Statements following return, break, continue, goto or throw will never be executed. [unreachableCode]
if (p_data->parent_type == DEVFREQ_PARENT_DEV)
^
vim +247 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
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2021-03-02 0:30 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-01 10:27 [chanwoo:devfreq-testing-passive-gov 3/3] drivers/devfreq/governor_passive.c:247:23: warning: Either the condition '!freqs' is redundant or there is possible null pointer dereference: freqs kernel test robot
2021-03-02 0:30 kernel test robot
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.