1. 02 Aug, 2021 1 commit
  2. 01 Jul, 2021 1 commit
    • Viresh Kumar's avatar
      arch_topology: Avoid use-after-free for scale_freq_data · 83150f5d
      Viresh Kumar authored
      Currently topology_scale_freq_tick() (which gets called from
      scheduler_tick()) may end up using a pointer to "struct
      scale_freq_data", which was previously cleared by
      topology_clear_scale_freq_source(), as there is no protection in place
      here. The users of topology_clear_scale_freq_source() though needs a
      guarantee that the previously cleared scale_freq_data isn't used
      anymore, so they can free the related resources.
      
      Since topology_scale_freq_tick() is called from scheduler tick, we don't
      want to add locking in there. Use the RCU update mechanism instead
      (which is already used by the scheduler's utilization update path) to
      guarantee race free updates here.
      
      synchronize_rcu() makes sure that all RCU critical sections that started
      before it is called, will finish before it returns. And so the callers
      of topology_clear_scale_freq_source() don't need to worry about their
      callback getting called anymore.
      
      Cc: Paul E. McKenney <paulmck@kernel.org>
      Fixes: 01e055c1
      
       ("arch_topology: Allow multiple entities to provide sched_freq_tick() callback")
      Tested-by: vingu-linaro's avatarVincent Guittot <vincent.guittot@linaro.org>
      Reviewed-by: Ionela Voinescu's avatarIonela Voinescu <ionela.voinescu@arm.com>
      Tested-by: default avatarQian Cai <quic_qiancai@quicinc.com>
      Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
      83150f5d
  3. 12 Mar, 2021 1 commit
  4. 10 Mar, 2021 2 commits
    • Viresh Kumar's avatar
      arch_topology: Allow multiple entities to provide sched_freq_tick() callback · 01e055c1
      Viresh Kumar authored
      
      
      This patch attempts to make it generic enough so other parts of the
      kernel can also provide their own implementation of scale_freq_tick()
      callback, which is called by the scheduler periodically to update the
      per-cpu arch_freq_scale variable.
      
      The implementations now need to provide 'struct scale_freq_data' for the
      CPUs for which they have hardware counters available, and a callback
      gets registered for each possible CPU in a per-cpu variable.
      
      The arch specific (or ARM AMU) counters are updated to adapt to this and
      they take the highest priority if they are available, i.e. they will be
      used instead of CPPC based counters for example.
      
      The special code to rebuild the sched domains, in case invariance status
      change for the system, is moved out of arm64 specific code and is added
      to arch_topology.c.
      
      Note that this also defines SCALE_FREQ_SOURCE_CPUFREQ but doesn't use it
      and it is added to show that cpufreq is also acts as source of
      information for FIE and will be used by default if no other counters are
      supported for a platform.
      Reviewed-by: Ionela Voinescu's avatarIonela Voinescu <ionela.voinescu@arm.com>
      Tested-by: Ionela Voinescu's avatarIonela Voinescu <ionela.voinescu@arm.com>
      Acked-by: Will Deacon <will@kernel.org> # for arm64
      Tested-by: vingu-linaro's avatarVincent Guittot <vincent.guittot@linaro.org>
      Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
      01e055c1
    • Viresh Kumar's avatar
      arch_topology: Rename freq_scale as arch_freq_scale · eec73529
      Viresh Kumar authored
      
      
      Rename freq_scale to a less generic name, as it will get exported soon
      for modules. Since x86 already names its own implementation of this as
      arch_freq_scale, lets stick to that.
      Suggested-by: default avatarWill Deacon <will@kernel.org>
      Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
      eec73529
  5. 08 Oct, 2020 1 commit
    • Ionela Voinescu's avatar
      cpufreq,arm,arm64: restructure definitions of arch_set_freq_scale() · a20b7053
      Ionela Voinescu authored
      
      
      Compared to other arch_* functions, arch_set_freq_scale() has an atypical
      weak definition that can be replaced by a strong architecture specific
      implementation.
      
      The more typical support for architectural functions involves defining
      an empty stub in a header file if the symbol is not already defined in
      architecture code. Some examples involve:
       - #define arch_scale_freq_capacity	topology_get_freq_scale
       - #define arch_scale_freq_invariant	topology_scale_freq_invariant
       - #define arch_scale_cpu_capacity	topology_get_cpu_scale
       - #define arch_update_cpu_topology	topology_update_cpu_topology
       - #define arch_scale_thermal_pressure	topology_get_thermal_pressure
       - #define arch_set_thermal_pressure	topology_set_thermal_pressure
      
      Bring arch_set_freq_scale() in line with these functions by renaming it to
      topology_set_freq_scale() in the arch topology driver, and by defining the
      arch_set_freq_scale symbol to point to the new function for arm and arm64.
      
      While there are other users of the arch_topology driver, this patch defines
      arch_set_freq_scale for arm and arm64 only, due to their existing
      definitions of arch_scale_freq_capacity. This is the getter function of the
      frequency invariance scale factor and without a getter function, the
      setter function - arch_set_freq_scale() has not purpose.
      Signed-off-by: Ionela Voinescu's avatarIonela Voinescu <ionela.voinescu@arm.com>
      Acked-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
      Acked-by: Catalin Marinas's avatarCatalin Marinas <catalin.marinas@arm.com>
      Acked-by: Sudeep Holla <sudeep.holla@arm.com> (BL_SWITCHER and topology parts)
      Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
      a20b7053
  6. 02 Oct, 2020 1 commit
    • Joe Perches's avatar
      drivers core: Use sysfs_emit and sysfs_emit_at for show(device *...) functions · aa838896
      Joe Perches authored
      
      
      Convert the various sprintf fmaily calls in sysfs device show functions
      to sysfs_emit and sysfs_emit_at for PAGE_SIZE buffer safety.
      
      Done with:
      
      $ spatch -sp-file sysfs_emit_dev.cocci --in-place --max-width=80 .
      
      And cocci script:
      
      $ cat sysfs_emit_dev.cocci
      @@
      identifier d_show;
      identifier dev, attr, buf;
      @@
      
      ssize_t d_show(struct device *dev, struct device_attribute *attr, char *buf)
      {
      	<...
      	return
      -	sprintf(buf,
      +	sysfs_emit(buf,
      	...);
      	...>
      }
      
      @@
      identifier d_show;
      identifier dev, attr, buf;
      @@
      
      ssize_t d_show(struct device *dev, struct device_attribute *attr, char *buf)
      {
      	<...
      	return
      -	snprintf(buf, PAGE_SIZE,
      +	sysfs_emit(buf,
      	...);
      	...>
      }
      
      @@
      identifier d_show;
      identifier dev, attr, buf;
      @@
      
      ssize_t d_show(struct device *dev, struct device_attribute *attr, char *buf)
      {
      	<...
      	return
      -	scnprintf(buf, PAGE_SIZE,
      +	sysfs_emit(buf,
      	...);
      	...>
      }
      
      @@
      identifier d_show;
      identifier dev, attr, buf;
      expression chr;
      @@
      
      ssize_t d_show(struct device *dev, struct device_attribute *attr, char *buf)
      {
      	<...
      	return
      -	strcpy(buf, chr);
      +	sysfs_emit(buf, chr);
      	...>
      }
      
      @@
      identifier d_show;
      identifier dev, attr, buf;
      identifier len;
      @@
      
      ssize_t d_show(struct device *dev, struct device_attribute *attr, char *buf)
      {
      	<...
      	len =
      -	sprintf(buf,
      +	sysfs_emit(buf,
      	...);
      	...>
      	return len;
      }
      
      @@
      identifier d_show;
      identifier dev, attr, buf;
      identifier len;
      @@
      
      ssize_t d_show(struct device *dev, struct device_attribute *attr, char *buf)
      {
      	<...
      	len =
      -	snprintf(buf, PAGE_SIZE,
      +	sysfs_emit(buf,
      	...);
      	...>
      	return len;
      }
      
      @@
      identifier d_show;
      identifier dev, attr, buf;
      identifier len;
      @@
      
      ssize_t d_show(struct device *dev, struct device_attribute *attr, char *buf)
      {
      	<...
      	len =
      -	scnprintf(buf, PAGE_SIZE,
      +	sysfs_emit(buf,
      	...);
      	...>
      	return len;
      }
      
      @@
      identifier d_show;
      identifier dev, attr, buf;
      identifier len;
      @@
      
      ssize_t d_show(struct device *dev, struct device_attribute *attr, char *buf)
      {
      	<...
      -	len += scnprintf(buf + len, PAGE_SIZE - len,
      +	len += sysfs_emit_at(buf, len,
      	...);
      	...>
      	return len;
      }
      
      @@
      identifier d_show;
      identifier dev, attr, buf;
      expression chr;
      @@
      
      ssize_t d_show(struct device *dev, struct device_attribute *attr, char *buf)
      {
      	...
      -	strcpy(buf, chr);
      -	return strlen(buf);
      +	return sysfs_emit(buf, chr);
      }
      Signed-off-by: default avatarJoe Perches <joe@perches.com>
      Link: https://lore.kernel.org/r/3d033c33056d88bbe34d4ddb62afd05ee166ab9a.1600285923.git.joe@perches.com
      
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      aa838896
  7. 18 Sep, 2020 3 commits
  8. 22 Jul, 2020 1 commit
    • Valentin Schneider's avatar
      arch_topology, sched/core: Cleanup thermal pressure definition · 25980c7a
      Valentin Schneider authored
      The following commit:
      
        14533a16
      
       ("thermal/cpu-cooling, sched/core: Move the arch_set_thermal_pressure() API to generic scheduler code")
      
      moved the definition of arch_set_thermal_pressure() to sched/core.c, but
      kept its declaration in linux/arch_topology.h. When building e.g. an x86
      kernel with CONFIG_SCHED_THERMAL_PRESSURE=y, cpufreq_cooling.c ends up
      getting the declaration of arch_set_thermal_pressure() from
      include/linux/arch_topology.h, which is somewhat awkward.
      
      On top of this, sched/core.c unconditionally defines
      o The thermal_pressure percpu variable
      o arch_set_thermal_pressure()
      
      while arch_scale_thermal_pressure() does nothing unless redefined by the
      architecture.
      
      arch_*() functions are meant to be defined by architectures, so revert the
      aforementioned commit and re-implement it in a way that keeps
      arch_set_thermal_pressure() architecture-definable, and doesn't define the
      thermal pressure percpu variable for kernels that don't need
      it (CONFIG_SCHED_THERMAL_PRESSURE=n).
      Signed-off-by: default avatarValentin Schneider <valentin.schneider@arm.com>
      Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
      Link: https://lkml.kernel.org/r/20200712165917.9168-2-valentin.schneider@arm.com
      25980c7a
  9. 18 Mar, 2020 1 commit
  10. 11 Mar, 2020 2 commits
  11. 06 Mar, 2020 3 commits
    • Ionela Voinescu's avatar
      arm64: use activity monitors for frequency invariance · cd0ed03a
      Ionela Voinescu authored and Catalin Marinas's avatar Catalin Marinas committed
      
      
      The Frequency Invariance Engine (FIE) is providing a frequency
      scaling correction factor that helps achieve more accurate
      load-tracking.
      
      So far, for arm and arm64 platforms, this scale factor has been
      obtained based on the ratio between the current frequency and the
      maximum supported frequency recorded by the cpufreq policy. The
      setting of this scale factor is triggered from cpufreq drivers by
      calling arch_set_freq_scale. The current frequency used in computation
      is the frequency requested by a governor, but it may not be the
      frequency that was implemented by the platform.
      
      This correction factor can also be obtained using a core counter and a
      constant counter to get information on the performance (frequency based
      only) obtained in a period of time. This will more accurately reflect
      the actual current frequency of the CPU, compared with the alternative
      implementation that reflects the request of a performance level from
      the OS.
      
      Therefore, implement arch_scale_freq_tick to use activity monitors, if
      present, for the computation of the frequency scale factor.
      
      The use of AMU counters depends on:
       - CONFIG_ARM64_AMU_EXTN - depents on the AMU extension being present
       - CONFIG_CPU_FREQ - the current frequency obtained using counter
         information is divided by the maximum frequency obtained from the
         cpufreq policy.
      
      While it is possible to have a combination of CPUs in the system with
      and without support for activity monitors, the use of counters for
      frequency invariance is only enabled for a CPU if all related CPUs
      (CPUs in the same frequency domain) support and have enabled the core
      and constant activity monitor counters. In this way, there is a clear
      separation between the policies for which arch_set_freq_scale (cpufreq
      based FIE) is used, and the policies for which arch_scale_freq_tick
      (counter based FIE) is used to set the frequency scale factor. For
      this purpose, a late_initcall_sync is registered to trigger validation
      work for policies that will enable or disable the use of AMU counters
      for frequency invariance. If CONFIG_CPU_FREQ is not defined, the use
      of counters is enabled on all CPUs only if all possible CPUs correctly
      support the necessary counters.
      Signed-off-by: Ionela Voinescu's avatarIonela Voinescu <ionela.voinescu@arm.com>
      Reviewed-by: Lukasz Luba's avatarLukasz Luba <lukasz.luba@arm.com>
      Acked-by: Sudeep Holla's avatarSudeep Holla <sudeep.holla@arm.com>
      Cc: Sudeep Holla <sudeep.holla@arm.com>
      Cc: Will Deacon <will@kernel.org>
      Cc: Catalin Marinas <catalin.marinas@arm.com>
      Signed-off-by: Catalin Marinas's avatarCatalin Marinas <catalin.marinas@arm.com>
      cd0ed03a
    • Ingo Molnar's avatar
      thermal/cpu-cooling, sched/core: Move the arch_set_thermal_pressure() API to generic scheduler code · 14533a16
      Ingo Molnar authored
      
      
      drivers/base/arch_topology.c is only built if CONFIG_GENERIC_ARCH_TOPOLOGY=y,
      resulting in such build failures:
      
        cpufreq_cooling.c:(.text+0x1e7): undefined reference to `arch_set_thermal_pressure'
      
      Move it to sched/core.c instead, and keep it enabled on x86 despite
      us not having a arch_scale_thermal_pressure() facility there, to
      build-test this thing.
      
      Cc: Thara Gopinath <thara.gopinath@linaro.org>
      Cc: Peter Zijlstra (Intel) <peterz@infradead.org>
      Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
      14533a16
    • Thara Gopinath's avatar
      drivers/base/arch_topology: Add infrastructure to store and update instantaneous thermal pressure · ad58cc5c
      Thara Gopinath authored
      
      
      Add architecture specific APIs to update and track thermal pressure on a
      per CPU basis. A per CPU variable thermal_pressure is introduced to keep
      track of instantaneous per CPU thermal pressure. Thermal pressure is the
      delta between maximum capacity and capped capacity due to a thermal event.
      
      topology_get_thermal_pressure can be hooked into the scheduler specified
      arch_scale_thermal_pressure to retrieve instantaneous thermal pressure of
      a CPU.
      
      arch_set_thermal_pressure can be used to update the thermal pressure.
      
      Considering topology_get_thermal_pressure reads thermal_pressure and
      arch_set_thermal_pressure writes into thermal_pressure, one can argue for
      some sort of locking mechanism to avoid a stale value.  But considering
      topology_get_thermal_pressure can be called from a system critical path
      like scheduler tick function, a locking mechanism is not ideal. This means
      that it is possible the thermal_pressure value used to calculate average
      thermal pressure for a CPU can be stale for up to 1 tick period.
      Signed-off-by: default avatarThara Gopinath <thara.gopinath@linaro.org>
      Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
      Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
      Link: https://lkml.kernel.org/r/20200222005213.3873-4-thara.gopinath@linaro.org
      ad58cc5c
  12. 17 Jan, 2020 1 commit
  13. 26 Aug, 2019 1 commit
  14. 22 Jul, 2019 2 commits
  15. 03 Jul, 2019 1 commit
  16. 24 Jun, 2019 1 commit
  17. 04 Apr, 2019 1 commit
    • Lingutla Chandrasekhar's avatar
      arch_topology: Make cpu_capacity sysfs node as read-only · 5d777b18
      Lingutla Chandrasekhar authored
      If user updates any cpu's cpu_capacity, then the new value is going to
      be applied to all its online sibling cpus. But this need not to be correct
      always, as sibling cpus (in ARM, same micro architecture cpus) would have
      different cpu_capacity with different performance characteristics.
      So, updating the user supplied cpu_capacity to all cpu siblings
      is not correct.
      
      And another problem is, current code assumes that 'all cpus in a cluster
      or with same package_id (core_siblings), would have same cpu_capacity'.
      But with commit '5bdd2b3f
      
       ("arm64: topology: add support to remove
      cpu topology sibling masks")', when a cpu hotplugged out, the cpu
      information gets cleared in its sibling cpus. So, user supplied
      cpu_capacity would be applied to only online sibling cpus at the time.
      After that, if any cpu hotplugged in, it would have different cpu_capacity
      than its siblings, which breaks the above assumption.
      
      So, instead of mucking around the core sibling mask for user supplied
      value, use device-tree to set cpu capacity. And make the cpu_capacity
      node as read-only to know the asymmetry between cpus in the system.
      While at it, remove cpu_scale_mutex usage, which used for sysfs write
      protection.
      Tested-by: Dietmar Eggemann's avatarDietmar Eggemann <dietmar.eggemann@arm.com>
      Tested-by: default avatarQuentin Perret <quentin.perret@arm.com>
      Reviewed-by: default avatarQuentin Perret <quentin.perret@arm.com>
      Acked-by: Sudeep Holla's avatarSudeep Holla <sudeep.holla@arm.com>
      Signed-off-by: default avatarLingutla Chandrasekhar <clingutla@codeaurora.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      5d777b18
  18. 10 Sep, 2018 1 commit
  19. 15 Mar, 2018 1 commit
    • Gaku Inami's avatar
      Revert "base: arch_topology: fix section mismatch build warnings" · 9de9a449
      Gaku Inami authored
      This reverts commit 452562ab ("base: arch_topology: fix section
      mismatch build warnings"). It causes the notifier call hangs in some
      use-cases.
      
      In some cases with using maxcpus, some of cpus are booted first and
      then the remaining cpus are booted. As an example, some users who want
      to realize fast boot up often use the following procedure.
      
        1) Define all CPUs on device tree (CA57x4 + CA53x4)
        2) Add "maxcpus=4" in bootargs
        3) Kernel boot up with CA57x4
        4) After kernel boot up, CA53x4 is booted from user
      
      When kernel init was finished, CPUFREQ_POLICY_NOTIFIER was not still
      unregisterd. This means that "__init init_cpu_capacity_callback()"
      will be called after kernel init sequence. To avoid this problem,
      it needs to remove __init{,data} annotations by reverting this commit.
      
      Also, this commit was needed to fix kernel compile issue below.
      However, this issue was also fixed by another patch: commit 82d8ba71
      ("arch_topology: Fix section miss match warning due to
      free_raw_capacity()") in v4.15 as well.
      Whereas commit 452562ab added all the missing __init annotations,
      commit 82d8ba71 removed it from free_raw_capacity().
      
      WARNING: vmlinux.o(.text+0x548f24): Section mismatch in reference
      from the function init_cpu_capacity_callback() to the variable
      .init.text:$x
      The function init_cpu_capacity_callback() references
      the variable __init $x.
      This is often because init_cpu_capacity_callback lacks a __init
      annotation or the annotation of $x is wrong.
      
      Fixes: 82d8ba71
      
       ("arch_topology: Fix section miss match warning due to free_raw_capacity()")
      Cc: stable <stable@vger.kernel.org>
      Signed-off-by: default avatarGaku Inami <gaku.inami.xh@renesas.com>
      Reviewed-by: Dietmar Eggemann's avatarDietmar Eggemann <dietmar.eggemann@arm.com>
      Tested-by: Dietmar Eggemann's avatarDietmar Eggemann <dietmar.eggemann@arm.com>
      Acked-by: Sudeep Holla's avatarSudeep Holla <sudeep.holla@arm.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      9de9a449
  20. 07 Dec, 2017 1 commit
    • Greg Kroah-Hartman's avatar
      drivers: core: arch_topology.c: move SPDX tag to top of the file · 6ee97d35
      Greg Kroah-Hartman authored
      
      
      arch_topology.c had a SPDX tag in it, so move it to the top of the file
      like the rest of the kernel files have it.
      
      Also remove the redundant license text as it is not needed if the SPDX
      tag is in the file, as the tag identifies the license in a specific and
      legally-defined manner.
      
      This is done on a quest to remove the 700+ different ways that files in
      the kernel describe the GPL license text.  And there's unneeded stuff
      like the address (sometimes incorrect) for the FSF which is never
      needed.
      
      No copyright headers or other non-license-description text was removed.
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      6ee97d35
  21. 20 Oct, 2017 1 commit
  22. 03 Oct, 2017 3 commits
  23. 18 Sep, 2017 1 commit
    • Sudeep Holla's avatar
      base: arch_topology: fix section mismatch build warnings · 452562ab
      Sudeep Holla authored
      Commit 2ef7a295 ("arm, arm64: factorize common cpu capacity default code")
      introduced init_cpu_capacity_callback and init_cpu_capacity_notifier
      which are referenced from initcall and are missing __init{,data}
      annotations resulting the below section mismatch build warnings.
      
      "WARNING: vmlinux.o(.text+0xbab790): Section mismatch in reference from
      the function init_cpu_capacity_callback() to the variable .init.text:$x
      The function init_cpu_capacity_callback() references the variable
      __init $x. This is often because init_cpu_capacity_callback lacks a
      __init annotation or the annotation of $x is wrong."
      
      This patch fixes the above build warnings by adding the required annotations.
      
      Fixes: 2ef7a295
      
       ("arm, arm64: factorize common cpu capacity default code")
      Cc: Juri Lelli <juri.lelli@arm.com>
      Cc: stable <stable@vger.kernel.org>
      Signed-off-by: Sudeep Holla's avatarSudeep Holla <sudeep.holla@arm.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      452562ab
  24. 28 Aug, 2017 1 commit
  25. 17 Jul, 2017 5 commits
  26. 03 Jun, 2017 2 commits