diff options
-rw-r--r-- | drivers/base/node.c | 24 | ||||
-rw-r--r-- | drivers/base/topology.c | 41 | ||||
-rw-r--r-- | drivers/pci/pci-sysfs.c | 20 | ||||
-rw-r--r-- | drivers/pci/probe.c | 27 | ||||
-rw-r--r-- | kernel/cpuset.c | 8 | ||||
-rw-r--r-- | kernel/sched_stats.h | 8 |
6 files changed, 108 insertions, 20 deletions
diff --git a/drivers/base/node.c b/drivers/base/node.c index 8e3f25bb8f80..12fde2d03d69 100644 --- a/drivers/base/node.c +++ b/drivers/base/node.c | |||
@@ -19,22 +19,34 @@ static struct sysdev_class node_class = { | |||
19 | }; | 19 | }; |
20 | 20 | ||
21 | 21 | ||
22 | static ssize_t node_read_cpumap(struct sys_device * dev, char * buf) | 22 | static ssize_t node_read_cpumap(struct sys_device *dev, int type, char *buf) |
23 | { | 23 | { |
24 | struct node *node_dev = to_node(dev); | 24 | struct node *node_dev = to_node(dev); |
25 | node_to_cpumask_ptr(mask, node_dev->sysdev.id); | 25 | node_to_cpumask_ptr(mask, node_dev->sysdev.id); |
26 | int len; | 26 | int len; |
27 | 27 | ||
28 | /* 2004/06/03: buf currently PAGE_SIZE, need > 1 char per 4 bits. */ | 28 | /* 2008/04/07: buf currently PAGE_SIZE, need 9 chars per 32 bits. */ |
29 | BUILD_BUG_ON(MAX_NUMNODES/4 > PAGE_SIZE/2); | 29 | BUILD_BUG_ON((NR_CPUS/32 * 9) > (PAGE_SIZE-1)); |
30 | 30 | ||
31 | len = cpumask_scnprintf(buf, PAGE_SIZE-2, *mask); | 31 | len = type? |
32 | cpulist_scnprintf(buf, PAGE_SIZE-2, *mask): | ||
33 | cpumask_scnprintf(buf, PAGE_SIZE-2, *mask); | ||
32 | buf[len++] = '\n'; | 34 | buf[len++] = '\n'; |
33 | buf[len] = '\0'; | 35 | buf[len] = '\0'; |
34 | return len; | 36 | return len; |
35 | } | 37 | } |
36 | 38 | ||
37 | static SYSDEV_ATTR(cpumap, S_IRUGO, node_read_cpumap, NULL); | 39 | static inline ssize_t node_read_cpumask(struct sys_device *dev, char *buf) |
40 | { | ||
41 | return node_read_cpumap(dev, 0, buf); | ||
42 | } | ||
43 | static inline ssize_t node_read_cpulist(struct sys_device *dev, char *buf) | ||
44 | { | ||
45 | return node_read_cpumap(dev, 1, buf); | ||
46 | } | ||
47 | |||
48 | static SYSDEV_ATTR(cpumap, S_IRUGO, node_read_cpumask, NULL); | ||
49 | static SYSDEV_ATTR(cpulist, S_IRUGO, node_read_cpulist, NULL); | ||
38 | 50 | ||
39 | #define K(x) ((x) << (PAGE_SHIFT - 10)) | 51 | #define K(x) ((x) << (PAGE_SHIFT - 10)) |
40 | static ssize_t node_read_meminfo(struct sys_device * dev, char * buf) | 52 | static ssize_t node_read_meminfo(struct sys_device * dev, char * buf) |
@@ -150,6 +162,7 @@ int register_node(struct node *node, int num, struct node *parent) | |||
150 | 162 | ||
151 | if (!error){ | 163 | if (!error){ |
152 | sysdev_create_file(&node->sysdev, &attr_cpumap); | 164 | sysdev_create_file(&node->sysdev, &attr_cpumap); |
165 | sysdev_create_file(&node->sysdev, &attr_cpulist); | ||
153 | sysdev_create_file(&node->sysdev, &attr_meminfo); | 166 | sysdev_create_file(&node->sysdev, &attr_meminfo); |
154 | sysdev_create_file(&node->sysdev, &attr_numastat); | 167 | sysdev_create_file(&node->sysdev, &attr_numastat); |
155 | sysdev_create_file(&node->sysdev, &attr_distance); | 168 | sysdev_create_file(&node->sysdev, &attr_distance); |
@@ -167,6 +180,7 @@ int register_node(struct node *node, int num, struct node *parent) | |||
167 | void unregister_node(struct node *node) | 180 | void unregister_node(struct node *node) |
168 | { | 181 | { |
169 | sysdev_remove_file(&node->sysdev, &attr_cpumap); | 182 | sysdev_remove_file(&node->sysdev, &attr_cpumap); |
183 | sysdev_remove_file(&node->sysdev, &attr_cpulist); | ||
170 | sysdev_remove_file(&node->sysdev, &attr_meminfo); | 184 | sysdev_remove_file(&node->sysdev, &attr_meminfo); |
171 | sysdev_remove_file(&node->sysdev, &attr_numastat); | 185 | sysdev_remove_file(&node->sysdev, &attr_numastat); |
172 | sysdev_remove_file(&node->sysdev, &attr_distance); | 186 | sysdev_remove_file(&node->sysdev, &attr_distance); |
diff --git a/drivers/base/topology.c b/drivers/base/topology.c index e1d3ad4db2f0..fdf4044d2e74 100644 --- a/drivers/base/topology.c +++ b/drivers/base/topology.c | |||
@@ -40,15 +40,38 @@ static ssize_t show_##name(struct sys_device *dev, char *buf) \ | |||
40 | return sprintf(buf, "%d\n", topology_##name(cpu)); \ | 40 | return sprintf(buf, "%d\n", topology_##name(cpu)); \ |
41 | } | 41 | } |
42 | 42 | ||
43 | #define define_siblings_show_func(name) \ | 43 | static ssize_t show_cpumap(int type, cpumask_t *mask, char *buf) |
44 | static ssize_t show_##name(struct sys_device *dev, char *buf) \ | 44 | { |
45 | ptrdiff_t len = PTR_ALIGN(buf + PAGE_SIZE - 1, PAGE_SIZE) - buf; | ||
46 | int n = 0; | ||
47 | |||
48 | if (len > 1) { | ||
49 | n = type? | ||
50 | cpulist_scnprintf(buf, len-2, *mask): | ||
51 | cpumask_scnprintf(buf, len-2, *mask); | ||
52 | buf[n++] = '\n'; | ||
53 | buf[n] = '\0'; | ||
54 | } | ||
55 | return n; | ||
56 | } | ||
57 | |||
58 | #define define_siblings_show_map(name) \ | ||
59 | static inline ssize_t show_##name(struct sys_device *dev, char *buf) \ | ||
45 | { \ | 60 | { \ |
46 | ssize_t len = -1; \ | ||
47 | unsigned int cpu = dev->id; \ | 61 | unsigned int cpu = dev->id; \ |
48 | len = cpumask_scnprintf(buf, NR_CPUS+1, topology_##name(cpu)); \ | 62 | return show_cpumap(0, &(topology_##name(cpu)), buf); \ |
49 | return (len + sprintf(buf + len, "\n")); \ | ||
50 | } | 63 | } |
51 | 64 | ||
65 | #define define_siblings_show_list(name) \ | ||
66 | static inline ssize_t show_##name##_list(struct sys_device *dev, char *buf) \ | ||
67 | { \ | ||
68 | unsigned int cpu = dev->id; \ | ||
69 | return show_cpumap(1, &(topology_##name(cpu)), buf); \ | ||
70 | } | ||
71 | |||
72 | #define define_siblings_show_func(name) \ | ||
73 | define_siblings_show_map(name); define_siblings_show_list(name) | ||
74 | |||
52 | #ifdef topology_physical_package_id | 75 | #ifdef topology_physical_package_id |
53 | define_id_show_func(physical_package_id); | 76 | define_id_show_func(physical_package_id); |
54 | define_one_ro(physical_package_id); | 77 | define_one_ro(physical_package_id); |
@@ -68,7 +91,9 @@ define_one_ro(core_id); | |||
68 | #ifdef topology_thread_siblings | 91 | #ifdef topology_thread_siblings |
69 | define_siblings_show_func(thread_siblings); | 92 | define_siblings_show_func(thread_siblings); |
70 | define_one_ro(thread_siblings); | 93 | define_one_ro(thread_siblings); |
71 | #define ref_thread_siblings_attr &attr_thread_siblings.attr, | 94 | define_one_ro(thread_siblings_list); |
95 | #define ref_thread_siblings_attr \ | ||
96 | &attr_thread_siblings.attr, &attr_thread_siblings_list.attr, | ||
72 | #else | 97 | #else |
73 | #define ref_thread_siblings_attr | 98 | #define ref_thread_siblings_attr |
74 | #endif | 99 | #endif |
@@ -76,7 +101,9 @@ define_one_ro(thread_siblings); | |||
76 | #ifdef topology_core_siblings | 101 | #ifdef topology_core_siblings |
77 | define_siblings_show_func(core_siblings); | 102 | define_siblings_show_func(core_siblings); |
78 | define_one_ro(core_siblings); | 103 | define_one_ro(core_siblings); |
79 | #define ref_core_siblings_attr &attr_core_siblings.attr, | 104 | define_one_ro(core_siblings_list); |
105 | #define ref_core_siblings_attr \ | ||
106 | &attr_core_siblings.attr, &attr_core_siblings_list.attr, | ||
80 | #else | 107 | #else |
81 | #define ref_core_siblings_attr | 108 | #define ref_core_siblings_attr |
82 | #endif | 109 | #endif |
diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index 8dcf1458aa2f..8d9d648daeba 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c | |||
@@ -73,8 +73,23 @@ static ssize_t local_cpus_show(struct device *dev, | |||
73 | 73 | ||
74 | mask = pcibus_to_cpumask(to_pci_dev(dev)->bus); | 74 | mask = pcibus_to_cpumask(to_pci_dev(dev)->bus); |
75 | len = cpumask_scnprintf(buf, PAGE_SIZE-2, mask); | 75 | len = cpumask_scnprintf(buf, PAGE_SIZE-2, mask); |
76 | strcat(buf,"\n"); | 76 | buf[len++] = '\n'; |
77 | return 1+len; | 77 | buf[len] = '\0'; |
78 | return len; | ||
79 | } | ||
80 | |||
81 | |||
82 | static ssize_t local_cpulist_show(struct device *dev, | ||
83 | struct device_attribute *attr, char *buf) | ||
84 | { | ||
85 | cpumask_t mask; | ||
86 | int len; | ||
87 | |||
88 | mask = pcibus_to_cpumask(to_pci_dev(dev)->bus); | ||
89 | len = cpulist_scnprintf(buf, PAGE_SIZE-2, mask); | ||
90 | buf[len++] = '\n'; | ||
91 | buf[len] = '\0'; | ||
92 | return len; | ||
78 | } | 93 | } |
79 | 94 | ||
80 | /* show resources */ | 95 | /* show resources */ |
@@ -201,6 +216,7 @@ struct device_attribute pci_dev_attrs[] = { | |||
201 | __ATTR_RO(class), | 216 | __ATTR_RO(class), |
202 | __ATTR_RO(irq), | 217 | __ATTR_RO(irq), |
203 | __ATTR_RO(local_cpus), | 218 | __ATTR_RO(local_cpus), |
219 | __ATTR_RO(local_cpulist), | ||
204 | __ATTR_RO(modalias), | 220 | __ATTR_RO(modalias), |
205 | #ifdef CONFIG_NUMA | 221 | #ifdef CONFIG_NUMA |
206 | __ATTR_RO(numa_node), | 222 | __ATTR_RO(numa_node), |
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 2db2e4bb0d1e..4b3011a23eff 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c | |||
@@ -82,6 +82,7 @@ void pci_remove_legacy_files(struct pci_bus *bus) { return; } | |||
82 | * PCI Bus Class Devices | 82 | * PCI Bus Class Devices |
83 | */ | 83 | */ |
84 | static ssize_t pci_bus_show_cpuaffinity(struct device *dev, | 84 | static ssize_t pci_bus_show_cpuaffinity(struct device *dev, |
85 | int type, | ||
85 | struct device_attribute *attr, | 86 | struct device_attribute *attr, |
86 | char *buf) | 87 | char *buf) |
87 | { | 88 | { |
@@ -89,12 +90,30 @@ static ssize_t pci_bus_show_cpuaffinity(struct device *dev, | |||
89 | cpumask_t cpumask; | 90 | cpumask_t cpumask; |
90 | 91 | ||
91 | cpumask = pcibus_to_cpumask(to_pci_bus(dev)); | 92 | cpumask = pcibus_to_cpumask(to_pci_bus(dev)); |
92 | ret = cpumask_scnprintf(buf, PAGE_SIZE, cpumask); | 93 | ret = type? |
93 | if (ret < PAGE_SIZE) | 94 | cpulist_scnprintf(buf, PAGE_SIZE-2, cpumask): |
94 | buf[ret++] = '\n'; | 95 | cpumask_scnprintf(buf, PAGE_SIZE-2, cpumask); |
96 | buf[ret++] = '\n'; | ||
97 | buf[ret] = '\0'; | ||
95 | return ret; | 98 | return ret; |
96 | } | 99 | } |
97 | DEVICE_ATTR(cpuaffinity, S_IRUGO, pci_bus_show_cpuaffinity, NULL); | 100 | |
101 | static ssize_t inline pci_bus_show_cpumaskaffinity(struct device *dev, | ||
102 | struct device_attribute *attr, | ||
103 | char *buf) | ||
104 | { | ||
105 | return pci_bus_show_cpuaffinity(dev, 0, attr, buf); | ||
106 | } | ||
107 | |||
108 | static ssize_t inline pci_bus_show_cpulistaffinity(struct device *dev, | ||
109 | struct device_attribute *attr, | ||
110 | char *buf) | ||
111 | { | ||
112 | return pci_bus_show_cpuaffinity(dev, 1, attr, buf); | ||
113 | } | ||
114 | |||
115 | DEVICE_ATTR(cpuaffinity, S_IRUGO, pci_bus_show_cpumaskaffinity, NULL); | ||
116 | DEVICE_ATTR(cpulistaffinity, S_IRUGO, pci_bus_show_cpulistaffinity, NULL); | ||
98 | 117 | ||
99 | /* | 118 | /* |
100 | * PCI Bus Class | 119 | * PCI Bus Class |
diff --git a/kernel/cpuset.c b/kernel/cpuset.c index 6b9ac296a05c..b0c870b2ac30 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c | |||
@@ -2254,8 +2254,16 @@ void cpuset_task_status_allowed(struct seq_file *m, struct task_struct *task) | |||
2254 | m->count += cpumask_scnprintf(m->buf + m->count, m->size - m->count, | 2254 | m->count += cpumask_scnprintf(m->buf + m->count, m->size - m->count, |
2255 | task->cpus_allowed); | 2255 | task->cpus_allowed); |
2256 | seq_printf(m, "\n"); | 2256 | seq_printf(m, "\n"); |
2257 | seq_printf(m, "Cpus_allowed_list:\t"); | ||
2258 | m->count += cpulist_scnprintf(m->buf + m->count, m->size - m->count, | ||
2259 | task->cpus_allowed); | ||
2260 | seq_printf(m, "\n"); | ||
2257 | seq_printf(m, "Mems_allowed:\t"); | 2261 | seq_printf(m, "Mems_allowed:\t"); |
2258 | m->count += nodemask_scnprintf(m->buf + m->count, m->size - m->count, | 2262 | m->count += nodemask_scnprintf(m->buf + m->count, m->size - m->count, |
2259 | task->mems_allowed); | 2263 | task->mems_allowed); |
2260 | seq_printf(m, "\n"); | 2264 | seq_printf(m, "\n"); |
2265 | seq_printf(m, "Mems_allowed_list:\t"); | ||
2266 | m->count += nodelist_scnprintf(m->buf + m->count, m->size - m->count, | ||
2267 | task->mems_allowed); | ||
2268 | seq_printf(m, "\n"); | ||
2261 | } | 2269 | } |
diff --git a/kernel/sched_stats.h b/kernel/sched_stats.h index 5b32433e7ee5..5bae2e0c3ff2 100644 --- a/kernel/sched_stats.h +++ b/kernel/sched_stats.h | |||
@@ -9,6 +9,11 @@ | |||
9 | static int show_schedstat(struct seq_file *seq, void *v) | 9 | static int show_schedstat(struct seq_file *seq, void *v) |
10 | { | 10 | { |
11 | int cpu; | 11 | int cpu; |
12 | int mask_len = NR_CPUS/32 * 9; | ||
13 | char *mask_str = kmalloc(mask_len, GFP_KERNEL); | ||
14 | |||
15 | if (mask_str == NULL) | ||
16 | return -ENOMEM; | ||
12 | 17 | ||
13 | seq_printf(seq, "version %d\n", SCHEDSTAT_VERSION); | 18 | seq_printf(seq, "version %d\n", SCHEDSTAT_VERSION); |
14 | seq_printf(seq, "timestamp %lu\n", jiffies); | 19 | seq_printf(seq, "timestamp %lu\n", jiffies); |
@@ -36,9 +41,8 @@ static int show_schedstat(struct seq_file *seq, void *v) | |||
36 | preempt_disable(); | 41 | preempt_disable(); |
37 | for_each_domain(cpu, sd) { | 42 | for_each_domain(cpu, sd) { |
38 | enum cpu_idle_type itype; | 43 | enum cpu_idle_type itype; |
39 | char mask_str[NR_CPUS]; | ||
40 | 44 | ||
41 | cpumask_scnprintf(mask_str, NR_CPUS, sd->span); | 45 | cpumask_scnprintf(mask_str, mask_len, sd->span); |
42 | seq_printf(seq, "domain%d %s", dcount++, mask_str); | 46 | seq_printf(seq, "domain%d %s", dcount++, mask_str); |
43 | for (itype = CPU_IDLE; itype < CPU_MAX_IDLE_TYPES; | 47 | for (itype = CPU_IDLE; itype < CPU_MAX_IDLE_TYPES; |
44 | itype++) { | 48 | itype++) { |