From: Thomas Gleixner <tglx@linutronix.de>
To: LKML <linux-kernel@vger.kernel.org>
Cc: Rafael Wysocki <rjw@sisk.pl>,
x86@kernel.org, Peter Zijlstra <peterz@infradead.org>,
linux-pm@vger.kernel.org,
Srinivas Pandruvada <srinivas.pandruvada@intel.com>,
Jacob Pan <jacob.jun.pan@linux.intel.com>
Subject: [patch 5/5] powercap/intel_rapl: Track active CPUs internally
Date: Tue, 22 Nov 2016 21:16:05 -0000 [thread overview]
Message-ID: <20161122211438.755830906@linutronix.de> (raw)
In-Reply-To: 20161122210518.079483154@linutronix.de
[-- Attachment #1: powercap-intel_rapl--Track-active-cpus-internally.patch --]
[-- Type: text/plain, Size: 3793 bytes --]
The ability of the CPU hotplug code to stop online/offline at each step
makes it necessary to track the activated CPUs in a package directly,
because outerwise a CPU offline callback can find CPUs which have already
executed the offline callback, but are not yet marked offline in the
topology mask. That could make such a CPU the package leader and in case
that CPU goes fully offline leave the package lead orphaned.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/powercap/intel_rapl.c | 59 +++++++++++++++++-------------------------
1 file changed, 24 insertions(+), 35 deletions(-)
--- a/drivers/powercap/intel_rapl.c
+++ b/drivers/powercap/intel_rapl.c
@@ -189,14 +189,13 @@ struct rapl_package {
unsigned int time_unit;
struct rapl_domain *domains; /* array of domains, sized at runtime */
struct powercap_zone *power_zone; /* keep track of parent zone */
- int nr_cpus; /* active cpus on the package, topology info is lost during
- * cpu hotplug. so we have to track ourselves.
- */
unsigned long power_limit_irq; /* keep track of package power limit
* notify interrupt enable status.
*/
struct list_head plist;
int lead_cpu; /* one active cpu per package for access */
+ /* Track active cpus */
+ struct cpumask cpumask;
};
struct rapl_defaults {
@@ -1432,19 +1431,17 @@ static void rapl_remove_package(struct r
}
/* called from CPU hotplug notifier, hotplug lock held */
-static int rapl_add_package(int cpu)
+static struct rapl_package *rapl_add_package(int cpu, int pkgid)
{
struct rapl_package *rp;
- int ret, phy_package_id;
+ int ret;
- phy_package_id = topology_physical_package_id(cpu);
rp = kzalloc(sizeof(struct rapl_package), GFP_KERNEL);
if (!rp)
- return -ENOMEM;
+ return ERR_PTR(-ENOMEM);
/* add the new package to the list */
- rp->id = phy_package_id;
- rp->nr_cpus = 1;
+ rp->id = pkgid;
rp->lead_cpu = cpu;
/* check if the package contains valid domains */
@@ -1457,14 +1454,13 @@ static int rapl_add_package(int cpu)
if (!ret) {
INIT_LIST_HEAD(&rp->plist);
list_add(&rp->plist, &rapl_packages);
- return 0;
+ return rp;
}
err_free_package:
kfree(rp->domains);
kfree(rp);
-
- return ret;
+ return ERR_PTR(ret);
}
/* Handles CPU hotplug on multi-socket systems.
@@ -1476,42 +1472,35 @@ static int rapl_add_package(int cpu)
*/
static int rapl_cpu_online(unsigned int cpu)
{
+ int pkgid = topology_physical_package_id(cpu);
struct rapl_package *rp;
- int phy_package_id;
-
- phy_package_id = topology_physical_package_id(cpu);
- rp = find_package_by_id(phy_package_id);
- if (rp) {
- rp->nr_cpus++;
- return 0;
+ rp = find_package_by_id(pkgid);
+ if (!rp) {
+ rp = rapl_add_package(cpu, pkgid);
+ if (IS_ERR(rp))
+ return PTR_ERR(rp);
}
- return rapl_add_package(cpu);
+ cpumask_set_cpu(cpu, &rp->cpumask);
+ return 0;
}
static int rapl_cpu_down_prep(unsigned int cpu)
{
- int phy_package_id;
+ int pkgid = topology_physical_package_id(cpu);
struct rapl_package *rp;
int lead_cpu;
- phy_package_id = topology_physical_package_id(cpu);
- rp = find_package_by_id(phy_package_id);
+ rp = find_package_by_id(pkgid);
if (!rp)
return 0;
- if (--rp->nr_cpus == 0) {
+
+ cpumask_clear_cpu(cpu, &rp->cpumask);
+ lead_cpu = cpumask_first(&rp->cpumask);
+ if (lead_cpu >= nr_cpu_ids)
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);
- }
- }
+ else if (rp->lead_cpu == cpu)
+ rp->lead_cpu = lead_cpu;
return 0;
}
next prev parent reply other threads:[~2016-11-22 21:16 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-11-22 21:15 [patch 0/5] powercap/intel_rapl: Fixes, hotplug conversion and simplifcation Thomas Gleixner
2016-11-22 21:15 ` [patch 1/5] powercap/intel_rapl: Add missing domain data update on hotplug Thomas Gleixner
2016-11-23 1:22 ` Jacob Pan
2016-11-22 21:15 ` [patch 2/5] powercap/intel_rapl: Propagate error code when registration fails Thomas Gleixner
2016-11-22 21:16 ` [patch 3/5] powercap/intel rapl: Convert to hotplug state machine Thomas Gleixner
2016-11-22 21:16 ` [patch 4/5] powercap/intel_rapl: Cleanup duplicated init code Thomas Gleixner
2016-11-22 21:16 ` Thomas Gleixner [this message]
2016-11-23 19:06 ` [patch 0/5] powercap/intel_rapl: Fixes, hotplug conversion and simplifcation Jacob Pan
2016-11-23 21:12 ` Rafael J. Wysocki
2016-11-24 8:33 ` Thomas Gleixner
2016-11-24 21:04 ` Rafael J. Wysocki
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20161122211438.755830906@linutronix.de \
--to=tglx@linutronix.de \
--cc=jacob.jun.pan@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=peterz@infradead.org \
--cc=rjw@sisk.pl \
--cc=srinivas.pandruvada@intel.com \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.