diff options
Diffstat (limited to 'drivers/base/topology.c')
-rw-r--r-- | drivers/base/topology.c | 41 |
1 files changed, 34 insertions, 7 deletions
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 |