Hi Daniel,

I love your patch! Perhaps something to improve:

[auto build test WARNING on pm/linux-next]
[also build test WARNING on v4.17-rc4 next-20180510]
[if your patch is applied to the wrong git tree, please drop us a note to help 
improve the system]

url:    
https://github.com/0day-ci/linux/commits/Daniel-Lezcano/powercap-drivers-idle_injection-Add-an-idle-injection-framework/20180511-074751
base:   https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git 
linux-next
reproduce:
        # apt-get install sparse
        make ARCH=x86_64 allmodconfig
        make C=1 CF=-D__CHECK_ENDIAN__


sparse warnings: (new ones prefixed by >>)

>> drivers/powercap/idle_injection.c:242:36: sparse: incorrect type in 
>> initializer (different address spaces) @@    expected struct task_struct 
>> [noderef] <asn:3>**store @@    got struct task_struct [noderef] 
>> <asn:3>**store @@
   drivers/powercap/idle_injection.c:242:36:    expected struct task_struct 
[noderef] <asn:3>**store
   drivers/powercap/idle_injection.c:242:36:    got struct task_struct 
*[noderef] <asn:3>*<noident>

vim +242 drivers/powercap/idle_injection.c

   138  
   139  /**
   140   * idle_injection_set_duration - idle and run duration helper
   141   * @run_duration_ms: an unsigned int giving the running time in 
milliseconds
   142   * @idle_duration_ms: an unsigned int giving the idle time in 
milliseconds
   143   */
 > 144  void idle_injection_set_duration(struct idle_injection_device *ii_dev,
   145                                   unsigned int run_duration_ms,
   146                                   unsigned int idle_duration_ms)
   147  {
   148          atomic_set(&ii_dev->run_duration_ms, run_duration_ms);
   149          atomic_set(&ii_dev->idle_duration_ms, idle_duration_ms);
   150  }
   151  
   152  
   153  /**
   154   * idle_injection_get_duration - idle and run duration helper
   155   * @run_duration_ms: a pointer to an unsigned int to store the running 
time
   156   * @idle_duration_ms: a pointer to an unsigned int to store the idle 
time
   157   */
   158  void idle_injection_get_duration(struct idle_injection_device *ii_dev,
   159                                   unsigned int *run_duration_ms,
   160                                   unsigned int *idle_duration_ms)
   161  {
   162          *run_duration_ms = atomic_read(&ii_dev->run_duration_ms);
   163          *idle_duration_ms = atomic_read(&ii_dev->idle_duration_ms);
   164  }
   165  
   166  /**
   167   * idle_injection_start - starts the idle injections
   168   * @ii_dev: a pointer to an idle_injection_device structure
   169   *
   170   * The function starts the idle injection cycles by first waking up
   171   * all the tasks the ii_dev is attached to and let them handle the
   172   * idle-run periods
   173   *
   174   * Returns -EINVAL if the idle or the running duration are not set
   175   */
   176  int idle_injection_start(struct idle_injection_device *ii_dev)
   177  {
   178          if (!atomic_read(&ii_dev->idle_duration_ms))
   179                  return -EINVAL;
   180  
   181          if (!atomic_read(&ii_dev->run_duration_ms))
   182                  return -EINVAL;
   183  
   184          pr_debug("Starting injecting idle cycles on CPUs '%*pbl'\n",
   185                   cpumask_pr_args(ii_dev->smp_hotplug_thread->cpumask));
   186  
   187          idle_injection_wakeup(ii_dev);
   188  
   189          return 0;
   190  }
   191  
   192  /**
   193   * idle_injection_stop - stops the idle injections
   194   * @ii_dev: a pointer to an idle injection_device structure
   195   *
   196   * The function stops the idle injection by canceling the timer in
   197   * charge of waking up the tasks to inject idle and unset the idle and
   198   * running durations.
   199   */
   200  void idle_injection_stop(struct idle_injection_device *ii_dev)
   201  {
   202          pr_debug("Stopping injecting idle cycles on CPUs '%*pbl'\n",
   203                   cpumask_pr_args(ii_dev->smp_hotplug_thread->cpumask));
   204  
   205          hrtimer_cancel(&ii_dev->timer);
   206  
   207          idle_injection_set_duration(ii_dev, 0, 0);
   208  }
   209  
   210  /**
   211   * idle_injection_setup - initialize the current task as a RT task
   212   * @cpu: the CPU number where the kthread is running on (not used)
   213   *
   214   */
   215  static void idle_injection_setup(unsigned int cpu)
   216  {
   217          struct sched_param param = { .sched_priority = 
MAX_USER_RT_PRIO/2 };
   218  
   219          set_freezable();
   220  
   221          sched_setscheduler(current, SCHED_FIFO, &param);
   222  }
   223  
   224  /**
   225   * idle_injection_should_run - function helper for the smpboot API
   226   * @cpu: the CPU number where the kthread is running on
   227   *
   228   * Returns the boolean telling if the thread can run
   229   */
   230  static int idle_injection_should_run(unsigned int cpu)
   231  {
   232          struct idle_injection_thread *iit =
   233                  per_cpu_ptr(&idle_injection_thread, cpu);
   234  
   235          return iit->should_run;
   236  }
   237  
   238  /*
   239   * idle_injection_threads - smp hotplug threads ops
   240   */
   241  static struct smp_hotplug_thread idle_injection_threads = {
 > 242          .store                  = &idle_injection_thread.tsk,
   243          .thread_fn              = idle_injection_fn,
   244          .thread_should_run      = idle_injection_should_run,
   245          .setup                  = idle_injection_setup,
   246  };
   247  

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

Reply via email to