2005-04-17 06:20:36 +08:00
|
|
|
/*
|
|
|
|
* include/linux/cpu.h - generic cpu definition
|
|
|
|
*
|
|
|
|
* This is mainly for topological representation. We define the
|
|
|
|
* basic 'struct cpu' here, which can be embedded in per-arch
|
|
|
|
* definitions of processors.
|
|
|
|
*
|
|
|
|
* Basic handling of the devices is done in drivers/base/cpu.c
|
|
|
|
* and system devices are handled in drivers/base/sys.c.
|
|
|
|
*
|
2005-09-02 14:59:25 +08:00
|
|
|
* CPUs are exported via sysfs in the class/cpu/devices/
|
2005-04-17 06:20:36 +08:00
|
|
|
* directory.
|
|
|
|
*
|
|
|
|
* Per-cpu interfaces can be implemented using a struct device_interface.
|
|
|
|
* See the following for how to do this:
|
|
|
|
* - drivers/base/intf.c
|
|
|
|
* - Documentation/driver-model/interface.txt
|
|
|
|
*/
|
|
|
|
#ifndef _LINUX_CPU_H_
|
|
|
|
#define _LINUX_CPU_H_
|
|
|
|
|
|
|
|
#include <linux/sysdev.h>
|
|
|
|
#include <linux/node.h>
|
|
|
|
#include <linux/compiler.h>
|
|
|
|
#include <linux/cpumask.h>
|
|
|
|
|
|
|
|
struct cpu {
|
|
|
|
int node_id; /* The node which contains the CPU */
|
2006-12-07 09:14:10 +08:00
|
|
|
int hotpluggable; /* creates sysfs control file if hotpluggable */
|
2005-04-17 06:20:36 +08:00
|
|
|
struct sys_device sysdev;
|
|
|
|
};
|
|
|
|
|
[PATCH] node hotplug: register cpu: remove node struct
With Goto-san's patch, we can add new pgdat/node at runtime. I'm now
considering node-hot-add with cpu + memory on ACPI.
I found acpi container, which describes node, could evaluate cpu before
memory. This means cpu-hot-add occurs before memory hot add.
In most part, cpu-hot-add doesn't depend on node hot add. But register_cpu(),
which creates symbolic link from node to cpu, requires that node should be
onlined before register_cpu(). When a node is onlined, its pgdat should be
there.
This patch-set holds off creating symbolic link from node to cpu
until node is onlined.
This removes node arguments from register_cpu().
Now, register_cpu() requires 'struct node' as its argument. But the array of
struct node is now unified in driver/base/node.c now (By Goto's node hotplug
patch). We can get struct node in generic way. So, this argument is not
necessary now.
This patch also guarantees add cpu under node only when node is onlined. It
is necessary for node-hot-add vs. cpu-hot-add patch following this.
Moreover, register_cpu calculates cpu->node_id by cpu_to_node() without regard
to its 'struct node *root' argument. This patch removes it.
Also modify callers of register_cpu()/unregister_cpu, whose args are changed
by register-cpu-remove-node-struct patch.
[Brice.Goglin@ens-lyon.org: fix it]
Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: Yasunori Goto <y-goto@jp.fujitsu.com>
Cc: Ashok Raj <ashok.raj@intel.com>
Cc: Dave Hansen <haveblue@us.ibm.com>
Signed-off-by: Brice Goglin <Brice.Goglin@ens-lyon.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2006-06-27 17:53:41 +08:00
|
|
|
extern int register_cpu(struct cpu *cpu, int num);
|
2006-03-08 15:53:25 +08:00
|
|
|
extern struct sys_device *get_cpu_sysdev(unsigned cpu);
|
2006-10-25 00:31:24 +08:00
|
|
|
|
|
|
|
extern int cpu_add_sysdev_attr(struct sysdev_attribute *attr);
|
|
|
|
extern void cpu_remove_sysdev_attr(struct sysdev_attribute *attr);
|
|
|
|
|
|
|
|
extern int cpu_add_sysdev_attr_group(struct attribute_group *attrs);
|
|
|
|
extern void cpu_remove_sysdev_attr_group(struct attribute_group *attrs);
|
|
|
|
|
2007-05-08 15:27:52 +08:00
|
|
|
extern int sched_create_sysfs_power_savings_entries(struct sysdev_class *cls);
|
2006-10-25 00:31:24 +08:00
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
#ifdef CONFIG_HOTPLUG_CPU
|
[PATCH] node hotplug: register cpu: remove node struct
With Goto-san's patch, we can add new pgdat/node at runtime. I'm now
considering node-hot-add with cpu + memory on ACPI.
I found acpi container, which describes node, could evaluate cpu before
memory. This means cpu-hot-add occurs before memory hot add.
In most part, cpu-hot-add doesn't depend on node hot add. But register_cpu(),
which creates symbolic link from node to cpu, requires that node should be
onlined before register_cpu(). When a node is onlined, its pgdat should be
there.
This patch-set holds off creating symbolic link from node to cpu
until node is onlined.
This removes node arguments from register_cpu().
Now, register_cpu() requires 'struct node' as its argument. But the array of
struct node is now unified in driver/base/node.c now (By Goto's node hotplug
patch). We can get struct node in generic way. So, this argument is not
necessary now.
This patch also guarantees add cpu under node only when node is onlined. It
is necessary for node-hot-add vs. cpu-hot-add patch following this.
Moreover, register_cpu calculates cpu->node_id by cpu_to_node() without regard
to its 'struct node *root' argument. This patch removes it.
Also modify callers of register_cpu()/unregister_cpu, whose args are changed
by register-cpu-remove-node-struct patch.
[Brice.Goglin@ens-lyon.org: fix it]
Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: Yasunori Goto <y-goto@jp.fujitsu.com>
Cc: Ashok Raj <ashok.raj@intel.com>
Cc: Dave Hansen <haveblue@us.ibm.com>
Signed-off-by: Brice Goglin <Brice.Goglin@ens-lyon.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2006-06-27 17:53:41 +08:00
|
|
|
extern void unregister_cpu(struct cpu *cpu);
|
2009-11-26 01:23:25 +08:00
|
|
|
extern ssize_t arch_cpu_probe(const char *, size_t);
|
|
|
|
extern ssize_t arch_cpu_release(const char *, size_t);
|
2005-04-17 06:20:36 +08:00
|
|
|
#endif
|
|
|
|
struct notifier_block;
|
|
|
|
|
2010-06-09 03:40:36 +08:00
|
|
|
/*
|
|
|
|
* CPU notifier priorities.
|
|
|
|
*/
|
|
|
|
enum {
|
2010-06-09 03:40:36 +08:00
|
|
|
/*
|
|
|
|
* SCHED_ACTIVE marks a cpu which is coming up active during
|
|
|
|
* CPU_ONLINE and CPU_DOWN_FAILED and must be the first
|
|
|
|
* notifier. CPUSET_ACTIVE adjusts cpuset according to
|
|
|
|
* cpu_active mask right after SCHED_ACTIVE. During
|
|
|
|
* CPU_DOWN_PREPARE, SCHED_INACTIVE and CPUSET_INACTIVE are
|
|
|
|
* ordered in the similar way.
|
|
|
|
*
|
|
|
|
* This ordering guarantees consistent cpu_active mask and
|
|
|
|
* migration behavior to all cpu notifiers.
|
|
|
|
*/
|
|
|
|
CPU_PRI_SCHED_ACTIVE = INT_MAX,
|
|
|
|
CPU_PRI_CPUSET_ACTIVE = INT_MAX - 1,
|
|
|
|
CPU_PRI_SCHED_INACTIVE = INT_MIN + 1,
|
|
|
|
CPU_PRI_CPUSET_INACTIVE = INT_MIN,
|
|
|
|
|
2010-06-09 03:40:36 +08:00
|
|
|
/* migration should happen before other stuff but after perf */
|
|
|
|
CPU_PRI_PERF = 20,
|
|
|
|
CPU_PRI_MIGRATION = 10,
|
2010-06-29 16:07:12 +08:00
|
|
|
/* prepare workqueues for other notifiers */
|
|
|
|
CPU_PRI_WORKQUEUE = 5,
|
2010-06-09 03:40:36 +08:00
|
|
|
};
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
#ifdef CONFIG_SMP
|
|
|
|
/* Need to know about CPUs going up/down? */
|
2009-08-16 00:53:47 +08:00
|
|
|
#if defined(CONFIG_HOTPLUG_CPU) || !defined(MODULE)
|
|
|
|
#define cpu_notifier(fn, pri) { \
|
|
|
|
static struct notifier_block fn##_nb __cpuinitdata = \
|
|
|
|
{ .notifier_call = fn, .priority = pri }; \
|
|
|
|
register_cpu_notifier(&fn##_nb); \
|
|
|
|
}
|
|
|
|
#else /* #if defined(CONFIG_HOTPLUG_CPU) || !defined(MODULE) */
|
|
|
|
#define cpu_notifier(fn, pri) do { (void)(fn); } while (0)
|
|
|
|
#endif /* #else #if defined(CONFIG_HOTPLUG_CPU) || !defined(MODULE) */
|
2006-06-27 17:54:08 +08:00
|
|
|
#ifdef CONFIG_HOTPLUG_CPU
|
[PATCH] hotplug: Allow modules to use the cpu hotplug notifiers even if !CONFIG_HOTPLUG_CPU
The following patchset allows a host with running virtual machines to be
suspended and, on at least a subset of the machines tested, resumed. Note
that this is orthogonal to suspending and resuming an individual guest to a
file.
A side effect of implementing suspend/resume is that cpu hotplug is now
supported. This should please the owners of big iron.
This patch:
KVM wants the cpu hotplug notifications, both for cpu hotplug itself, but more
commonly for host suspend/resume.
In order to avoid extensive #ifdefs, provide stubs when CONFIG_CPU_HOTPLUG is
not defined.
In all, we have four cases:
- UP: register and unregister stubbed out
- SMP+hotplug: full register and unregister
- SMP, no hotplug, core: register as __init, unregister stubbed
(cpus are brought up during core initialization)
- SMP, no hotplug, module: register and unregister stubbed out
(cpus cannot be brought up during module lifetime)
Signed-off-by: Avi Kivity <avi@qumranet.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Cc: Oleg Nesterov <oleg@tv-sign.ru>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2007-02-12 16:54:43 +08:00
|
|
|
extern int register_cpu_notifier(struct notifier_block *nb);
|
2005-04-17 06:20:36 +08:00
|
|
|
extern void unregister_cpu_notifier(struct notifier_block *nb);
|
2006-06-27 17:54:08 +08:00
|
|
|
#else
|
[PATCH] hotplug: Allow modules to use the cpu hotplug notifiers even if !CONFIG_HOTPLUG_CPU
The following patchset allows a host with running virtual machines to be
suspended and, on at least a subset of the machines tested, resumed. Note
that this is orthogonal to suspending and resuming an individual guest to a
file.
A side effect of implementing suspend/resume is that cpu hotplug is now
supported. This should please the owners of big iron.
This patch:
KVM wants the cpu hotplug notifications, both for cpu hotplug itself, but more
commonly for host suspend/resume.
In order to avoid extensive #ifdefs, provide stubs when CONFIG_CPU_HOTPLUG is
not defined.
In all, we have four cases:
- UP: register and unregister stubbed out
- SMP+hotplug: full register and unregister
- SMP, no hotplug, core: register as __init, unregister stubbed
(cpus are brought up during core initialization)
- SMP, no hotplug, module: register and unregister stubbed out
(cpus cannot be brought up during module lifetime)
Signed-off-by: Avi Kivity <avi@qumranet.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Cc: Oleg Nesterov <oleg@tv-sign.ru>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2007-02-12 16:54:43 +08:00
|
|
|
|
|
|
|
#ifndef MODULE
|
|
|
|
extern int register_cpu_notifier(struct notifier_block *nb);
|
|
|
|
#else
|
|
|
|
static inline int register_cpu_notifier(struct notifier_block *nb)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2006-06-27 17:54:08 +08:00
|
|
|
static inline void unregister_cpu_notifier(struct notifier_block *nb)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
#endif
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
int cpu_up(unsigned int cpu);
|
2008-09-07 22:57:22 +08:00
|
|
|
void notify_cpu_starting(unsigned int cpu);
|
2008-07-25 16:47:50 +08:00
|
|
|
extern void cpu_maps_update_begin(void);
|
|
|
|
extern void cpu_maps_update_done(void);
|
2008-01-26 04:08:02 +08:00
|
|
|
|
2008-07-25 16:47:50 +08:00
|
|
|
#else /* CONFIG_SMP */
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2009-08-16 00:53:47 +08:00
|
|
|
#define cpu_notifier(fn, pri) do { (void)(fn); } while (0)
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
static inline int register_cpu_notifier(struct notifier_block *nb)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
2008-01-26 04:08:02 +08:00
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
static inline void unregister_cpu_notifier(struct notifier_block *nb)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2008-07-25 16:47:50 +08:00
|
|
|
static inline void cpu_maps_update_begin(void)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void cpu_maps_update_done(void)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
#endif /* CONFIG_SMP */
|
|
|
|
extern struct sysdev_class cpu_sysdev_class;
|
|
|
|
|
|
|
|
#ifdef CONFIG_HOTPLUG_CPU
|
|
|
|
/* Stop CPUs going up and down. */
|
2006-12-07 12:38:58 +08:00
|
|
|
|
2008-01-26 04:08:02 +08:00
|
|
|
extern void get_online_cpus(void);
|
|
|
|
extern void put_online_cpus(void);
|
2009-08-16 00:53:47 +08:00
|
|
|
#define hotcpu_notifier(fn, pri) cpu_notifier(fn, pri)
|
2006-06-27 17:54:10 +08:00
|
|
|
#define register_hotcpu_notifier(nb) register_cpu_notifier(nb)
|
|
|
|
#define unregister_hotcpu_notifier(nb) unregister_cpu_notifier(nb)
|
2005-04-17 06:20:36 +08:00
|
|
|
int cpu_down(unsigned int cpu);
|
2006-12-07 12:38:58 +08:00
|
|
|
|
2009-11-26 17:59:05 +08:00
|
|
|
#ifdef CONFIG_ARCH_CPU_PROBE_RELEASE
|
|
|
|
extern void cpu_hotplug_driver_lock(void);
|
|
|
|
extern void cpu_hotplug_driver_unlock(void);
|
|
|
|
#else
|
|
|
|
static inline void cpu_hotplug_driver_lock(void)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void cpu_hotplug_driver_unlock(void)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2006-12-07 12:38:58 +08:00
|
|
|
#else /* CONFIG_HOTPLUG_CPU */
|
|
|
|
|
2008-01-26 04:08:02 +08:00
|
|
|
#define get_online_cpus() do { } while (0)
|
|
|
|
#define put_online_cpus() do { } while (0)
|
2006-12-07 12:38:17 +08:00
|
|
|
#define hotcpu_notifier(fn, pri) do { (void)(fn); } while (0)
|
2007-10-18 18:06:38 +08:00
|
|
|
/* These aren't inline functions due to a GCC bug. */
|
|
|
|
#define register_hotcpu_notifier(nb) ({ (void)(nb); 0; })
|
|
|
|
#define unregister_hotcpu_notifier(nb) ({ (void)(nb); })
|
2006-12-07 12:38:58 +08:00
|
|
|
#endif /* CONFIG_HOTPLUG_CPU */
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2007-08-31 14:56:29 +08:00
|
|
|
#ifdef CONFIG_PM_SLEEP_SMP
|
2007-04-02 14:49:49 +08:00
|
|
|
extern int suspend_cpu_hotplug;
|
|
|
|
|
2006-09-26 14:32:48 +08:00
|
|
|
extern int disable_nonboot_cpus(void);
|
|
|
|
extern void enable_nonboot_cpus(void);
|
2007-08-31 14:56:29 +08:00
|
|
|
#else /* !CONFIG_PM_SLEEP_SMP */
|
2007-04-02 14:49:49 +08:00
|
|
|
#define suspend_cpu_hotplug 0
|
|
|
|
|
2006-09-26 14:32:48 +08:00
|
|
|
static inline int disable_nonboot_cpus(void) { return 0; }
|
|
|
|
static inline void enable_nonboot_cpus(void) {}
|
2007-08-31 14:56:29 +08:00
|
|
|
#endif /* !CONFIG_PM_SLEEP_SMP */
|
2006-09-26 14:32:48 +08:00
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
#endif /* _LINUX_CPU_H_ */
|