lkml.org 
[lkml]   [2016]   [Nov]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:smp/hotplug] powercap/intel rapl: Convert to hotplug state machine
    Commit-ID:  29d9013958a6a25f9810a00b0d4ce72d601682ad
    Gitweb: http://git.kernel.org/tip/29d9013958a6a25f9810a00b0d4ce72d601682ad
    Author: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
    AuthorDate: Thu, 17 Nov 2016 19:35:30 +0100
    Committer: Thomas Gleixner <tglx@linutronix.de>
    CommitDate: Mon, 21 Nov 2016 16:37:06 +0100

    powercap/intel rapl: Convert to hotplug state machine

    Install the callbacks via the state machine as a first step. The init/exit
    code is a duplicate of the hotplug code. This is cleaned up in a
    consecutive patch.

    Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
    Cc: rt@linuxtronix.de
    Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
    Cc: linux-pm@vger.kernel.org
    Link: http://lkml.kernel.org/r/20161117183541.8588-10-bigeasy@linutronix.de
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>

    ---
    drivers/powercap/intel_rapl.c | 94 ++++++++++++++++++++++---------------------
    1 file changed, 49 insertions(+), 45 deletions(-)

    diff --git a/drivers/powercap/intel_rapl.c b/drivers/powercap/intel_rapl.c
    index 44b12e2..a42dd3b 100644
    --- a/drivers/powercap/intel_rapl.c
    +++ b/drivers/powercap/intel_rapl.c
    @@ -1607,50 +1607,48 @@ err_free_package:
    * associated domains. Cooling devices are handled accordingly at
    * per-domain level.
    */
    -static int rapl_cpu_callback(struct notifier_block *nfb,
    - unsigned long action, void *hcpu)
    +static int rapl_cpu_online(unsigned int cpu)
    +{
    + int phy_package_id;
    + struct rapl_package *rp;
    +
    + phy_package_id = topology_physical_package_id(cpu);
    +
    + rp = find_package_by_id(phy_package_id);
    + if (rp)
    + ++rp->nr_cpus;
    + else
    + rapl_add_package(cpu);
    + return 0;
    +}
    +
    +static int rapl_cpu_down_prep(unsigned int cpu)
    {
    - unsigned long cpu = (unsigned long)hcpu;
    int phy_package_id;
    struct rapl_package *rp;
    int lead_cpu;

    phy_package_id = topology_physical_package_id(cpu);
    - switch (action) {
    - case CPU_ONLINE:
    - case CPU_ONLINE_FROZEN:
    - case CPU_DOWN_FAILED:
    - case CPU_DOWN_FAILED_FROZEN:
    - rp = find_package_by_id(phy_package_id);
    - if (rp)
    - ++rp->nr_cpus;
    - else
    - rapl_add_package(cpu);
    - break;
    - case CPU_DOWN_PREPARE:
    - case CPU_DOWN_PREPARE_FROZEN:
    - rp = find_package_by_id(phy_package_id);
    - if (!rp)
    - break;
    - if (--rp->nr_cpus == 0)
    - rapl_remove_package(rp);
    - else if (cpu == rp->lead_cpu) {
    - /* choose another active cpu in the package */
    - lead_cpu = cpumask_any_but(topology_core_cpumask(cpu), cpu);
    - if (lead_cpu < nr_cpu_ids)
    - rp->lead_cpu = lead_cpu;
    - else /* should never go here */
    - pr_err("no active cpu available for package %d\n",
    - phy_package_id);
    + rp = find_package_by_id(phy_package_id);
    + if (!rp)
    + return 0;
    + if (--rp->nr_cpus == 0) {
    + rapl_remove_package(rp);
    + } else if (cpu == rp->lead_cpu) {
    + /* choose another active cpu in the package */
    + lead_cpu = cpumask_any_but(topology_core_cpumask(cpu), cpu);
    + if (lead_cpu < nr_cpu_ids) {
    + rp->lead_cpu = lead_cpu;
    + } else {
    + /* should never go here */
    + pr_err("no active cpu available for package %d\n",
    + phy_package_id);
    }
    }
    -
    - return NOTIFY_OK;
    + return 0;
    }

    -static struct notifier_block rapl_cpu_notifier = {
    - .notifier_call = rapl_cpu_callback,
    -};
    +static enum cpuhp_state pcap_rapl_online;

    static int __init rapl_init(void)
    {
    @@ -1667,36 +1665,42 @@ static int __init rapl_init(void)

    rapl_defaults = (struct rapl_defaults *)id->driver_data;

    - cpu_notifier_register_begin();
    -
    /* prevent CPU hotplug during detection */
    get_online_cpus();
    ret = rapl_detect_topology();
    if (ret)
    - goto done;
    + goto err;

    if (rapl_register_powercap()) {
    - rapl_cleanup_data();
    ret = -ENODEV;
    - goto done;
    + goto err_cleanup;
    }
    - __register_hotcpu_notifier(&rapl_cpu_notifier);
    -done:
    + ret = cpuhp_setup_state_nocalls(CPUHP_AP_ONLINE_DYN,
    + "powercap/rapl:online",
    + rapl_cpu_online, rapl_cpu_down_prep);
    + if (ret < 0)
    + goto err_unreg;
    + pcap_rapl_online = ret;
    put_online_cpus();
    - cpu_notifier_register_done();
    + return 0;
    +
    +err_unreg:
    + rapl_unregister_powercap();

    +err_cleanup:
    + rapl_cleanup_data();
    +err:
    + put_online_cpus();
    return ret;
    }

    static void __exit rapl_exit(void)
    {
    - cpu_notifier_register_begin();
    get_online_cpus();
    - __unregister_hotcpu_notifier(&rapl_cpu_notifier);
    + cpuhp_remove_state(pcap_rapl_online);
    rapl_unregister_powercap();
    rapl_cleanup_data();
    put_online_cpus();
    - cpu_notifier_register_done();
    }

    module_init(rapl_init);
    \
     
     \ /
      Last update: 2016-11-21 16:50    [W:4.233 / U:0.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site