2005-04-16 22:20:36 +00:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2002, Erich Focht, NEC
|
|
|
|
*
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*/
|
|
|
|
#ifndef _ASM_IA64_TOPOLOGY_H
|
|
|
|
#define _ASM_IA64_TOPOLOGY_H
|
|
|
|
|
|
|
|
#include <asm/acpi.h>
|
|
|
|
#include <asm/numa.h>
|
|
|
|
#include <asm/smp.h>
|
|
|
|
|
|
|
|
#ifdef CONFIG_NUMA
|
2006-01-17 21:42:46 +00:00
|
|
|
|
|
|
|
/* Nodes w/o CPUs are preferred for memory allocations, see build_zonelists */
|
|
|
|
#define PENALTY_FOR_NODE_WITH_CPUS 255
|
|
|
|
|
2006-04-14 01:23:53 +00:00
|
|
|
/*
|
|
|
|
* Distance above which we begin to use zone reclaim
|
|
|
|
*/
|
|
|
|
#define RECLAIM_DISTANCE 15
|
|
|
|
|
2005-04-16 22:20:36 +00:00
|
|
|
/*
|
|
|
|
* Returns the number of the node containing CPU 'cpu'
|
|
|
|
*/
|
|
|
|
#define cpu_to_node(cpu) (int)(cpu_to_node_map[cpu])
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Returns a bitmask of CPUs on Node 'node'.
|
|
|
|
*/
|
|
|
|
#define node_to_cpumask(node) (node_to_cpu_mask[node])
|
2008-12-26 11:53:40 +00:00
|
|
|
#define cpumask_of_node(node) (&node_to_cpu_mask[node])
|
2005-04-16 22:20:36 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Returns the number of the node containing Node 'nid'.
|
|
|
|
* Not implemented here. Multi-level hierarchies detected with
|
|
|
|
* the help of node_distance().
|
|
|
|
*/
|
|
|
|
#define parent_node(nid) (nid)
|
|
|
|
|
2005-07-07 23:59:00 +00:00
|
|
|
/*
|
|
|
|
* Determines the node for a given pci bus
|
|
|
|
*/
|
|
|
|
#define pcibus_to_node(bus) PCI_CONTROLLER(bus)->node
|
|
|
|
|
2005-04-16 22:20:36 +00:00
|
|
|
void build_cpu_to_node_map(void);
|
|
|
|
|
2005-06-25 21:57:21 +00:00
|
|
|
#define SD_CPU_INIT (struct sched_domain) { \
|
|
|
|
.parent = NULL, \
|
2006-10-03 08:14:08 +00:00
|
|
|
.child = NULL, \
|
2005-06-25 21:57:21 +00:00
|
|
|
.groups = NULL, \
|
|
|
|
.min_interval = 1, \
|
|
|
|
.max_interval = 4, \
|
|
|
|
.busy_factor = 64, \
|
|
|
|
.imbalance_pct = 125, \
|
|
|
|
.cache_nice_tries = 2, \
|
|
|
|
.busy_idx = 2, \
|
|
|
|
.idle_idx = 1, \
|
|
|
|
.newidle_idx = 2, \
|
2009-09-03 11:16:51 +00:00
|
|
|
.wake_idx = 0, \
|
2005-06-25 21:57:21 +00:00
|
|
|
.forkexec_idx = 1, \
|
|
|
|
.flags = SD_LOAD_BALANCE \
|
|
|
|
| SD_BALANCE_NEWIDLE \
|
|
|
|
| SD_BALANCE_EXEC \
|
2009-09-03 11:16:51 +00:00
|
|
|
| SD_BALANCE_FORK \
|
sched: Merge select_task_rq_fair() and sched_balance_self()
The problem with wake_idle() is that is doesn't respect things like
cpu_power, which means it doesn't deal well with SMT nor the recent
RT interaction.
To cure this, it needs to do what sched_balance_self() does, which
leads to the possibility of merging select_task_rq_fair() and
sched_balance_self().
Modify sched_balance_self() to:
- update_shares() when walking up the domain tree,
(it only called it for the top domain, but it should
have done this anyway), which allows us to remove
this ugly bit from try_to_wake_up().
- do wake_affine() on the smallest domain that contains
both this (the waking) and the prev (the wakee) cpu for
WAKE invocations.
Then use the top-down balance steps it had to replace wake_idle().
This leads to the dissapearance of SD_WAKE_BALANCE and
SD_WAKE_IDLE_FAR, with SD_WAKE_IDLE replaced with SD_BALANCE_WAKE.
SD_WAKE_AFFINE needs SD_BALANCE_WAKE to be effective.
Touch all topology bits to replace the old with new SD flags --
platforms might need re-tuning, enabling SD_BALANCE_WAKE
conditionally on a NUMA distance seems like a good additional
feature, magny-core and small nehalem systems would want this
enabled, systems with slow interconnects would not.
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
LKML-Reference: <new-submission>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
2009-09-10 11:50:02 +00:00
|
|
|
| SD_BALANCE_WAKE \
|
2005-06-25 21:57:21 +00:00
|
|
|
| SD_WAKE_AFFINE, \
|
|
|
|
.last_balance = jiffies, \
|
|
|
|
.balance_interval = 1, \
|
|
|
|
.nr_balance_failed = 0, \
|
|
|
|
}
|
|
|
|
|
2005-04-16 22:20:36 +00:00
|
|
|
/* sched_domains SD_NODE_INIT for IA64 NUMA machines */
|
|
|
|
#define SD_NODE_INIT (struct sched_domain) { \
|
|
|
|
.parent = NULL, \
|
2006-10-03 08:14:08 +00:00
|
|
|
.child = NULL, \
|
2005-04-16 22:20:36 +00:00
|
|
|
.groups = NULL, \
|
2005-06-25 21:57:21 +00:00
|
|
|
.min_interval = 8, \
|
2009-01-15 20:09:44 +00:00
|
|
|
.max_interval = 8*(min(num_online_cpus(), 32U)), \
|
2005-06-25 21:57:21 +00:00
|
|
|
.busy_factor = 64, \
|
2005-04-16 22:20:36 +00:00
|
|
|
.imbalance_pct = 125, \
|
2005-06-25 21:57:21 +00:00
|
|
|
.cache_nice_tries = 2, \
|
|
|
|
.busy_idx = 3, \
|
|
|
|
.idle_idx = 2, \
|
2008-04-15 05:04:23 +00:00
|
|
|
.newidle_idx = 2, \
|
2009-09-03 11:16:51 +00:00
|
|
|
.wake_idx = 0, \
|
2005-06-25 21:57:21 +00:00
|
|
|
.forkexec_idx = 1, \
|
2005-04-16 22:20:36 +00:00
|
|
|
.flags = SD_LOAD_BALANCE \
|
|
|
|
| SD_BALANCE_EXEC \
|
2005-06-25 21:57:21 +00:00
|
|
|
| SD_BALANCE_FORK \
|
sched: Merge select_task_rq_fair() and sched_balance_self()
The problem with wake_idle() is that is doesn't respect things like
cpu_power, which means it doesn't deal well with SMT nor the recent
RT interaction.
To cure this, it needs to do what sched_balance_self() does, which
leads to the possibility of merging select_task_rq_fair() and
sched_balance_self().
Modify sched_balance_self() to:
- update_shares() when walking up the domain tree,
(it only called it for the top domain, but it should
have done this anyway), which allows us to remove
this ugly bit from try_to_wake_up().
- do wake_affine() on the smallest domain that contains
both this (the waking) and the prev (the wakee) cpu for
WAKE invocations.
Then use the top-down balance steps it had to replace wake_idle().
This leads to the dissapearance of SD_WAKE_BALANCE and
SD_WAKE_IDLE_FAR, with SD_WAKE_IDLE replaced with SD_BALANCE_WAKE.
SD_WAKE_AFFINE needs SD_BALANCE_WAKE to be effective.
Touch all topology bits to replace the old with new SD flags --
platforms might need re-tuning, enabling SD_BALANCE_WAKE
conditionally on a NUMA distance seems like a good additional
feature, magny-core and small nehalem systems would want this
enabled, systems with slow interconnects would not.
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
LKML-Reference: <new-submission>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
2009-09-10 11:50:02 +00:00
|
|
|
| SD_BALANCE_WAKE \
|
|
|
|
| SD_SERIALIZE, \
|
2005-04-16 22:20:36 +00:00
|
|
|
.last_balance = jiffies, \
|
2005-06-25 21:57:21 +00:00
|
|
|
.balance_interval = 64, \
|
2005-04-16 22:20:36 +00:00
|
|
|
.nr_balance_failed = 0, \
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* CONFIG_NUMA */
|
|
|
|
|
[PATCH] Export cpu topology in sysfs
The patch implements cpu topology exportation by sysfs.
Items (attributes) are similar to /proc/cpuinfo.
1) /sys/devices/system/cpu/cpuX/topology/physical_package_id:
represent the physical package id of cpu X;
2) /sys/devices/system/cpu/cpuX/topology/core_id:
represent the cpu core id to cpu X;
3) /sys/devices/system/cpu/cpuX/topology/thread_siblings:
represent the thread siblings to cpu X in the same core;
4) /sys/devices/system/cpu/cpuX/topology/core_siblings:
represent the thread siblings to cpu X in the same physical package;
To implement it in an architecture-neutral way, a new source file,
driver/base/topology.c, is to export the 5 attributes.
If one architecture wants to support this feature, it just needs to
implement 4 defines, typically in file include/asm-XXX/topology.h.
The 4 defines are:
#define topology_physical_package_id(cpu)
#define topology_core_id(cpu)
#define topology_thread_siblings(cpu)
#define topology_core_siblings(cpu)
The type of **_id is int.
The type of siblings is cpumask_t.
To be consistent on all architectures, the 4 attributes should have
deafult values if their values are unavailable. Below is the rule.
1) physical_package_id: If cpu has no physical package id, -1 is the
default value.
2) core_id: If cpu doesn't support multi-core, its core id is 0.
3) thread_siblings: Just include itself, if the cpu doesn't support
HT/multi-thread.
4) core_siblings: Just include itself, if the cpu doesn't support
multi-core and HT/Multi-thread.
So be careful when declaring the 4 defines in include/asm-XXX/topology.h.
If an attribute isn't defined on an architecture, it won't be exported.
Thank Nathan, Greg, Andi, Paul and Venki.
The patch provides defines for i386/x86_64/ia64.
Signed-off-by: Zhang, Yanmin <yanmin.zhang@intel.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Nick Piggin <nickpiggin@yahoo.com.au>
Cc: Greg KH <greg@kroah.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2006-02-03 11:04:36 +00:00
|
|
|
#ifdef CONFIG_SMP
|
|
|
|
#define topology_physical_package_id(cpu) (cpu_data(cpu)->socket_id)
|
|
|
|
#define topology_core_id(cpu) (cpu_data(cpu)->core_id)
|
|
|
|
#define topology_core_siblings(cpu) (cpu_core_map[cpu])
|
2007-10-16 08:24:05 +00:00
|
|
|
#define topology_thread_siblings(cpu) (per_cpu(cpu_sibling_map, cpu))
|
2008-12-31 23:42:21 +00:00
|
|
|
#define topology_core_cpumask(cpu) (&cpu_core_map[cpu])
|
|
|
|
#define topology_thread_cpumask(cpu) (&per_cpu(cpu_sibling_map, cpu))
|
2006-06-27 09:54:42 +00:00
|
|
|
#define smt_capable() (smp_num_siblings > 1)
|
[PATCH] Export cpu topology in sysfs
The patch implements cpu topology exportation by sysfs.
Items (attributes) are similar to /proc/cpuinfo.
1) /sys/devices/system/cpu/cpuX/topology/physical_package_id:
represent the physical package id of cpu X;
2) /sys/devices/system/cpu/cpuX/topology/core_id:
represent the cpu core id to cpu X;
3) /sys/devices/system/cpu/cpuX/topology/thread_siblings:
represent the thread siblings to cpu X in the same core;
4) /sys/devices/system/cpu/cpuX/topology/core_siblings:
represent the thread siblings to cpu X in the same physical package;
To implement it in an architecture-neutral way, a new source file,
driver/base/topology.c, is to export the 5 attributes.
If one architecture wants to support this feature, it just needs to
implement 4 defines, typically in file include/asm-XXX/topology.h.
The 4 defines are:
#define topology_physical_package_id(cpu)
#define topology_core_id(cpu)
#define topology_thread_siblings(cpu)
#define topology_core_siblings(cpu)
The type of **_id is int.
The type of siblings is cpumask_t.
To be consistent on all architectures, the 4 attributes should have
deafult values if their values are unavailable. Below is the rule.
1) physical_package_id: If cpu has no physical package id, -1 is the
default value.
2) core_id: If cpu doesn't support multi-core, its core id is 0.
3) thread_siblings: Just include itself, if the cpu doesn't support
HT/multi-thread.
4) core_siblings: Just include itself, if the cpu doesn't support
multi-core and HT/Multi-thread.
So be careful when declaring the 4 defines in include/asm-XXX/topology.h.
If an attribute isn't defined on an architecture, it won't be exported.
Thank Nathan, Greg, Andi, Paul and Venki.
The patch provides defines for i386/x86_64/ia64.
Signed-off-by: Zhang, Yanmin <yanmin.zhang@intel.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Nick Piggin <nickpiggin@yahoo.com.au>
Cc: Greg KH <greg@kroah.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2006-02-03 11:04:36 +00:00
|
|
|
#endif
|
|
|
|
|
2008-04-29 22:05:29 +00:00
|
|
|
extern void arch_fix_phys_package_id(int num, u32 slot);
|
|
|
|
|
2008-12-26 11:53:40 +00:00
|
|
|
#define cpumask_of_pcibus(bus) (pcibus_to_node(bus) == -1 ? \
|
|
|
|
cpu_all_mask : \
|
2009-01-06 15:19:22 +00:00
|
|
|
cpumask_of_node(pcibus_to_node(bus)))
|
2008-12-26 11:53:40 +00:00
|
|
|
|
2005-04-16 22:20:36 +00:00
|
|
|
#include <asm-generic/topology.h>
|
|
|
|
|
|
|
|
#endif /* _ASM_IA64_TOPOLOGY_H */
|