All of lore.kernel.org
 help / color / mirror / Atom feed
* [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.