mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
cpu/hotplug: Add sysfs state interface
Add a sysfs interface so we can actually see in which state the cpus are in. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: linux-arch@vger.kernel.org Cc: Rik van Riel <riel@redhat.com> Cc: Rafael Wysocki <rafael.j.wysocki@intel.com> Cc: "Srivatsa S. Bhat" <srivatsa@mit.edu> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Arjan van de Ven <arjan@linux.intel.com> Cc: Sebastian Siewior <bigeasy@linutronix.de> Cc: Rusty Russell <rusty@rustcorp.com.au> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Oleg Nesterov <oleg@redhat.com> Cc: Tejun Heo <tj@kernel.org> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Paul McKenney <paulmck@linux.vnet.ibm.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Paul Turner <pjt@google.com> Link: http://lkml.kernel.org/r/20160226182340.942257522@linutronix.de Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
+100
@@ -56,6 +56,7 @@ struct cpuhp_step {
|
|||||||
bool skip_onerr;
|
bool skip_onerr;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static DEFINE_MUTEX(cpuhp_state_mutex);
|
||||||
static struct cpuhp_step cpuhp_bp_states[];
|
static struct cpuhp_step cpuhp_bp_states[];
|
||||||
static struct cpuhp_step cpuhp_ap_states[];
|
static struct cpuhp_step cpuhp_ap_states[];
|
||||||
|
|
||||||
@@ -955,6 +956,105 @@ static struct cpuhp_step cpuhp_ap_states[] = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static bool cpuhp_is_ap_state(enum cpuhp_state state)
|
||||||
|
{
|
||||||
|
return (state > CPUHP_AP_OFFLINE && state < CPUHP_AP_ONLINE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct cpuhp_step *cpuhp_get_step(enum cpuhp_state state)
|
||||||
|
{
|
||||||
|
struct cpuhp_step *sp;
|
||||||
|
|
||||||
|
sp = cpuhp_is_ap_state(state) ? cpuhp_ap_states : cpuhp_bp_states;
|
||||||
|
return sp + state;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(CONFIG_SYSFS) && defined(CONFIG_HOTPLUG_CPU)
|
||||||
|
static ssize_t show_cpuhp_state(struct device *dev,
|
||||||
|
struct device_attribute *attr, char *buf)
|
||||||
|
{
|
||||||
|
struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, dev->id);
|
||||||
|
|
||||||
|
return sprintf(buf, "%d\n", st->state);
|
||||||
|
}
|
||||||
|
static DEVICE_ATTR(state, 0444, show_cpuhp_state, NULL);
|
||||||
|
|
||||||
|
static ssize_t show_cpuhp_target(struct device *dev,
|
||||||
|
struct device_attribute *attr, char *buf)
|
||||||
|
{
|
||||||
|
struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, dev->id);
|
||||||
|
|
||||||
|
return sprintf(buf, "%d\n", st->target);
|
||||||
|
}
|
||||||
|
static DEVICE_ATTR(target, 0444, show_cpuhp_target, NULL);
|
||||||
|
|
||||||
|
static struct attribute *cpuhp_cpu_attrs[] = {
|
||||||
|
&dev_attr_state.attr,
|
||||||
|
&dev_attr_target.attr,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct attribute_group cpuhp_cpu_attr_group = {
|
||||||
|
.attrs = cpuhp_cpu_attrs,
|
||||||
|
.name = "hotplug",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static ssize_t show_cpuhp_states(struct device *dev,
|
||||||
|
struct device_attribute *attr, char *buf)
|
||||||
|
{
|
||||||
|
ssize_t cur, res = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
mutex_lock(&cpuhp_state_mutex);
|
||||||
|
for (i = 0; i <= CPUHP_ONLINE; i++) {
|
||||||
|
struct cpuhp_step *sp = cpuhp_get_step(i);
|
||||||
|
|
||||||
|
if (sp->name) {
|
||||||
|
cur = sprintf(buf, "%3d: %s\n", i, sp->name);
|
||||||
|
buf += cur;
|
||||||
|
res += cur;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mutex_unlock(&cpuhp_state_mutex);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
static DEVICE_ATTR(states, 0444, show_cpuhp_states, NULL);
|
||||||
|
|
||||||
|
static struct attribute *cpuhp_cpu_root_attrs[] = {
|
||||||
|
&dev_attr_states.attr,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct attribute_group cpuhp_cpu_root_attr_group = {
|
||||||
|
.attrs = cpuhp_cpu_root_attrs,
|
||||||
|
.name = "hotplug",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __init cpuhp_sysfs_init(void)
|
||||||
|
{
|
||||||
|
int cpu, ret;
|
||||||
|
|
||||||
|
ret = sysfs_create_group(&cpu_subsys.dev_root->kobj,
|
||||||
|
&cpuhp_cpu_root_attr_group);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
for_each_possible_cpu(cpu) {
|
||||||
|
struct device *dev = get_cpu_device(cpu);
|
||||||
|
|
||||||
|
if (!dev)
|
||||||
|
continue;
|
||||||
|
ret = sysfs_create_group(&dev->kobj, &cpuhp_cpu_attr_group);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
device_initcall(cpuhp_sysfs_init);
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* cpu_bit_bitmap[] is a special, "compressed" data structure that
|
* cpu_bit_bitmap[] is a special, "compressed" data structure that
|
||||||
* represents all NR_CPUS bits binary values of 1<<nr.
|
* represents all NR_CPUS bits binary values of 1<<nr.
|
||||||
|
|||||||
Reference in New Issue
Block a user