1. Oct 08, 2018
  2. Oct 04, 2018
    • Dave Gerlach's avatar
      PM / OPP: _of_add_opp_table_v2(): increment count only if OPP is added · deac8703
      Dave Gerlach authored
      Currently the _of_add_opp_table_v2 call loops through the OPP nodes in
      the operating-points-v2 table in the device tree and calls
      _opp_add_static_v2 for each to add them to the table. It counts each
      iteration through this loop as an added OPP, however there are cases
      where _opp_add_static_v2() returns 0 but no new OPP is added to the
      list.
      
      This can happen while adding duplicate OPP or if the OPP isn't supported
      by hardware.
      
      Because of this the count variable will contain the number of OPP nodes
      in the table in device tree but not necessarily the ones that are
      actually added.
      
      As this count value is what is checked to determine if there are any
      valid OPPs, if a platform has an operating-points-v2 table with all OPP
      nodes containing opp-supported-hw values that are not currently
      supported, then _of_add_opp_table_v2 will fail to abort as it should due
      to an empty table.
      
      Additionally, since commit 3ba98324 ("PM / OPP: Get
      performance state using genpd helper"), the same count variable is
      compared against the number of OPPs containing performance states and
      requires that either all or none have pstates set, however in the case
      of any opp table that has any entries that do not get added by
      _opp_add_static_v2 due to incompatible opp-supported-hw fields, these
      numbers will not match and _of_add_opp_table_v2 will incorrectly fail.
      
      We need to clearly identify all the three cases (success, failure,
      unsupported/duplicate OPPs) and then increment count only on success
      case. Change return type of _opp_add_static_v2() to return the pointer
      to the newly added OPP instead of an integer. This routine now returns a
      valid pointer if the OPP is really added, NULL for unsupported or
      duplicate OPPs, and error value cased as a pointer on errors.
      
      Ideally the fixes tag in this commit should point back to the commit
      that introduced OPP v2 initially, as that's where we started incorrectly
      accounting for duplicate OPPs:
      
      commit 27465902 ("PM / OPP: Add support to parse "operating-points-v2" bindings")
      
      But it wasn't a real problem until recently as the count was only used
      to check if any OPPs are added or not. And so this commit points to a
      rather recent commit where we added more code that depends on the value
      of "count".
      
      Fixes: 3ba98324
      
       ("PM / OPP: Get performance state using genpd helper")
      Reported-by: default avatarDave Gerlach <d-gerlach@ti.com>
      Reported-by: default avatarNiklas Cassel <niklas.cassel@linaro.org>
      Tested-by: default avatarNiklas Cassel <niklas.cassel@linaro.org>
      Signed-off-by: default avatarDave Gerlach <d-gerlach@ti.com>
      Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
      deac8703
    • Viresh Kumar's avatar
      cpufreq: dt: Try freeing static OPPs only if we have added them · 51c99dd2
      Viresh Kumar authored
      
      
      We can not call dev_pm_opp_of_cpumask_remove_table() freely anymore
      since the latest OPP core updates as that uses reference counting to
      free resources. There are cases where no static OPPs are added (using
      DT) for a platform and trying to remove the OPP table may end up
      decrementing refcount which is already zero and hence generating
      warnings.
      
      Lets track if we were able to add static OPPs or not and then only
      remove the table based on that. Some reshuffling of code is also done to
      do that.
      
      Reported-by: default avatarNiklas Cassel <niklas.cassel@linaro.org>
      Tested-by: default avatarNiklas Cassel <niklas.cassel@linaro.org>
      Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
      51c99dd2
    • Viresh Kumar's avatar
      OPP: Return error on error from dev_pm_opp_get_opp_count() · 09f662f9
      Viresh Kumar authored
      Return error number instead of 0 on failures.
      
      Fixes: a1e8c136
      
       ("PM / OPP: "opp-hz" is optional for power domains")
      Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
      09f662f9
    • Viresh Kumar's avatar
      OPP: Improve error handling in dev_pm_opp_of_cpumask_add_table() · 50b6b87c
      Viresh Kumar authored
      
      
      The error handling wasn't appropriate in
      dev_pm_opp_of_cpumask_add_table(). For example it returns 0 on success
      and also for the case where cpumask is empty or cpu_device wasn't found
      for any of the CPUs.
      
      It should really return error on such cases, so that the callers can be
      aware of the outcome.
      
      Fix it.
      
      Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
      50b6b87c
  3. Oct 01, 2018
    • Rafael J. Wysocki's avatar
      Merge branch 'opp/linux-next' of... · fb64207b
      Rafael J. Wysocki authored
      Merge branch 'opp/linux-next' of git://git.kernel.org/pub/scm/linux/kernel/git/vireshk/pm into pm-opp
      
      Pull operating performance points (OPP) material for 4.20 from Viresh Kumar.
      
      "This contains patches that fix several bugs in the OPP core and
      makes it more stable."
      
      * 'opp/linux-next' of git://git.kernel.org/pub/scm/linux/kernel/git/vireshk/pm:
        OPP: Pass OPP table to _of_add_opp_table_v{1|2}()
        OPP: Prevent creating multiple OPP tables for devices sharing OPP nodes
        OPP: Use a single mechanism to free the OPP table
        OPP: Don't remove dynamic OPPs from _dev_pm_opp_remove_table()
        cpufreq: mvebu: Remove OPPs using dev_pm_opp_remove()
        OPP: Create separate kref for static OPPs list
        OPP: Don't take OPP table's kref for static OPPs
        OPP: Parse OPP table's DT properties from _of_init_opp_table()
        OPP: Pass index to _of_init_opp_table()
        OPP: Protect dev_list with opp_table lock
        OPP: Don't try to remove all OPP tables on failure
        OPP: Free OPP table properly on performance state irregularities
      fb64207b
    • Viresh Kumar's avatar
      OPP: Pass OPP table to _of_add_opp_table_v{1|2}() · 5ed4cecd
      Viresh Kumar authored
      
      
      Both _of_add_opp_table_v1() and _of_add_opp_table_v2() contain similar
      code to get the OPP table and their parent routine also parses the DT to
      find the OPP table's node pointer. This can be simplified by getting the
      OPP table in advance and then passing it as argument to these routines.
      
      Tested-by: default avatarNiklas Cassel <niklas.cassel@linaro.org>
      Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
      5ed4cecd
    • Viresh Kumar's avatar
      OPP: Prevent creating multiple OPP tables for devices sharing OPP nodes · 283d55e6
      Viresh Kumar authored
      
      
      When two or more devices are sharing their clock and voltage rails, they
      share the same OPP table. But there are some corner cases where the OPP
      core incorrectly creates separate OPP tables for them.
      
      For example, CPU 0 and 1 share clock/voltage rails. The platform
      specific code calls dev_pm_opp_set_regulators() for CPU0 and the OPP
      core creates an OPP table for it (the individual OPPs aren't initialized
      as of now). The same is repeated for CPU1 then. Because
      _opp_get_opp_table() doesn't compare DT node pointers currently, it
      fails to find the link between CPU0 and CPU1 and so creates a new OPP
      table.
      
      Fix this by calling _managed_opp() from _opp_get_opp_table().
      _managed_opp() gain an additional argument (index) to get the right node
      pointer. This resulted in simplifying code in _of_add_opp_table_v2() as
      well.
      
      Tested-by: default avatarNiklas Cassel <niklas.cassel@linaro.org>
      Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
      283d55e6
  4. Sep 30, 2018
  5. Sep 29, 2018
  6. Sep 28, 2018
  7. Sep 27, 2018
    • Guoju Fang's avatar
      bcache: add separate workqueue for journal_write to avoid deadlock · 0f843e65
      Guoju Fang authored
      
      
      After write SSD completed, bcache schedules journal_write work to
      system_wq, which is a public workqueue in system, without WQ_MEM_RECLAIM
      flag. system_wq is also a bound wq, and there may be no idle kworker on
      current processor. Creating a new kworker may unfortunately need to
      reclaim memory first, by shrinking cache and slab used by vfs, which
      depends on bcache device. That's a deadlock.
      
      This patch create a new workqueue for journal_write with WQ_MEM_RECLAIM
      flag. It's rescuer thread will work to avoid the deadlock.
      
      Signed-off-by: default avatarGuoju Fang <fangguoju@gmail.com>
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarColy Li <colyli@suse.de>
      Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
      0f843e65