Messages in this thread Patch in this message | | | From | Prarit Bhargava <> | Subject | [PATCH 1/3] drivers/base, Combine topology.c and cpu.c | Date | Fri, 30 Oct 2015 11:48:37 -0400 |
| |
The topology.c file contains sysfs files that describe a cpu's location and its siblings. This patch combines topology.c into cpu.c to make the next set of changes easier to understand.
There are no functional changes with this patch.
Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Ingo Molnar <mingo@redhat.com> Cc: "H. Peter Anvin" <hpa@zytor.com> Cc: x86@kernel.org Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Len Brown <len.brown@intel.com> Cc: Borislav Petkov <bp@alien8.de> Cc: Andy Lutomirski <luto@amacapital.net> Cc: Zhu Guihua <zhugh.fnst@cn.fujitsu.com> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: "Jan H. Schönherr" <jschoenh@amazon.de> Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com> Cc: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> Signed-off-by: Prarit Bhargava <prarit@redhat.com> --- drivers/base/Makefile | 2 +- drivers/base/cpu.c | 127 ++++++++++++++++++++++++++++++++++++++ drivers/base/topology.c | 155 ----------------------------------------------- 3 files changed, 128 insertions(+), 156 deletions(-) delete mode 100644 drivers/base/topology.c
diff --git a/drivers/base/Makefile b/drivers/base/Makefile index 6b2a84e..567ab7c 100644 --- a/drivers/base/Makefile +++ b/drivers/base/Makefile @@ -4,7 +4,7 @@ obj-y := component.o core.o bus.o dd.o syscore.o \ driver.o class.o platform.o \ cpu.o firmware.o init.o map.o devres.o \ attribute_container.o transport_class.o \ - topology.o container.o property.o cacheinfo.o + container.o property.o cacheinfo.o obj-$(CONFIG_DEVTMPFS) += devtmpfs.o obj-$(CONFIG_DMA_CMA) += dma-contiguous.o obj-y += power/ diff --git a/drivers/base/cpu.c b/drivers/base/cpu.c index 91bbb19..b939c98 100644 --- a/drivers/base/cpu.c +++ b/drivers/base/cpu.c @@ -17,6 +17,8 @@ #include <linux/of.h> #include <linux/cpufeature.h> #include <linux/tick.h> +#include <linux/mm.h> +#include <linux/hardirq.h> #include "base.h" @@ -175,11 +177,136 @@ static struct attribute *crash_note_cpu_attrs[] = { NULL }; +#define define_id_show_func(name) \ +static ssize_t name##_show(struct device *dev, \ + struct device_attribute *attr, char *buf) \ +{ \ + return sprintf(buf, "%d\n", topology_##name(dev->id)); \ +} + +#define define_siblings_show_map(name, mask) \ +static ssize_t name##_show(struct device *dev, \ + struct device_attribute *attr, char *buf) \ +{ \ + return cpumap_print_to_pagebuf(false, buf, topology_##mask(dev->id));\ +} + +#define define_siblings_show_list(name, mask) \ +static ssize_t name##_list_show(struct device *dev, \ + struct device_attribute *attr, \ + char *buf) \ +{ \ + return cpumap_print_to_pagebuf(true, buf, topology_##mask(dev->id));\ +} + +#define define_siblings_show_func(name, mask) \ + define_siblings_show_map(name, mask); \ + define_siblings_show_list(name, mask) + +define_id_show_func(physical_package_id); +static DEVICE_ATTR_RO(physical_package_id); + +define_id_show_func(core_id); +static DEVICE_ATTR_RO(core_id); + +define_siblings_show_func(thread_siblings, sibling_cpumask); +static DEVICE_ATTR_RO(thread_siblings); +static DEVICE_ATTR_RO(thread_siblings_list); + +define_siblings_show_func(core_siblings, core_cpumask); +static DEVICE_ATTR_RO(core_siblings); +static DEVICE_ATTR_RO(core_siblings_list); + +#ifdef CONFIG_SCHED_BOOK +define_id_show_func(book_id); +static DEVICE_ATTR_RO(book_id); +define_siblings_show_func(book_siblings, book_cpumask); +static DEVICE_ATTR_RO(book_siblings); +static DEVICE_ATTR_RO(book_siblings_list); +#endif + +static struct attribute *topology_attrs[] = { + &dev_attr_physical_package_id.attr, + &dev_attr_core_id.attr, + &dev_attr_thread_siblings.attr, + &dev_attr_thread_siblings_list.attr, + &dev_attr_core_siblings.attr, + &dev_attr_core_siblings_list.attr, +#ifdef CONFIG_SCHED_BOOK + &dev_attr_book_id.attr, + &dev_attr_book_siblings.attr, + &dev_attr_book_siblings_list.attr, +#endif + NULL +}; + static struct attribute_group crash_note_cpu_attr_group = { .attrs = crash_note_cpu_attrs, }; #endif +static struct attribute_group topology_attr_group = { + .attrs = topology_attrs, + .name = "topology" +}; + +/* Add/Remove cpu_topology interface for CPU device */ +static int topology_add_dev(unsigned int cpu) +{ + struct device *dev = get_cpu_device(cpu); + + return sysfs_create_group(&dev->kobj, &topology_attr_group); +} + +static void topology_remove_dev(unsigned int cpu) +{ + struct device *dev = get_cpu_device(cpu); + + sysfs_remove_group(&dev->kobj, &topology_attr_group); +} + +static int topology_cpu_callback(struct notifier_block *nfb, + unsigned long action, void *hcpu) +{ + unsigned int cpu = (unsigned long)hcpu; + int rc = 0; + + switch (action) { + case CPU_UP_PREPARE: + case CPU_UP_PREPARE_FROZEN: + rc = topology_add_dev(cpu); + break; + case CPU_UP_CANCELED: + case CPU_UP_CANCELED_FROZEN: + case CPU_DEAD: + case CPU_DEAD_FROZEN: + topology_remove_dev(cpu); + break; + } + return notifier_from_errno(rc); +} + +static int topology_sysfs_init(void) +{ + int cpu; + int rc = 0; + + cpu_notifier_register_begin(); + + for_each_online_cpu(cpu) { + rc = topology_add_dev(cpu); + if (rc) + goto out; + } + __hotcpu_notifier(topology_cpu_callback, 0); + +out: + cpu_notifier_register_done(); + return rc; +} + +device_initcall(topology_sysfs_init); + static const struct attribute_group *common_cpu_attr_groups[] = { #ifdef CONFIG_KEXEC &crash_note_cpu_attr_group, diff --git a/drivers/base/topology.c b/drivers/base/topology.c deleted file mode 100644 index 8b7d7f8..0000000 --- a/drivers/base/topology.c +++ /dev/null @@ -1,155 +0,0 @@ -/* - * driver/base/topology.c - Populate sysfs with cpu topology information - * - * Written by: Zhang Yanmin, Intel Corporation - * - * Copyright (C) 2006, Intel Corp. - * - * 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. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or - * NON INFRINGEMENT. See the GNU General Public License for more - * details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ -#include <linux/mm.h> -#include <linux/cpu.h> -#include <linux/module.h> -#include <linux/hardirq.h> -#include <linux/topology.h> - -#define define_id_show_func(name) \ -static ssize_t name##_show(struct device *dev, \ - struct device_attribute *attr, char *buf) \ -{ \ - return sprintf(buf, "%d\n", topology_##name(dev->id)); \ -} - -#define define_siblings_show_map(name, mask) \ -static ssize_t name##_show(struct device *dev, \ - struct device_attribute *attr, char *buf) \ -{ \ - return cpumap_print_to_pagebuf(false, buf, topology_##mask(dev->id));\ -} - -#define define_siblings_show_list(name, mask) \ -static ssize_t name##_list_show(struct device *dev, \ - struct device_attribute *attr, \ - char *buf) \ -{ \ - return cpumap_print_to_pagebuf(true, buf, topology_##mask(dev->id));\ -} - -#define define_siblings_show_func(name, mask) \ - define_siblings_show_map(name, mask); \ - define_siblings_show_list(name, mask) - -define_id_show_func(physical_package_id); -static DEVICE_ATTR_RO(physical_package_id); - -define_id_show_func(core_id); -static DEVICE_ATTR_RO(core_id); - -define_siblings_show_func(thread_siblings, sibling_cpumask); -static DEVICE_ATTR_RO(thread_siblings); -static DEVICE_ATTR_RO(thread_siblings_list); - -define_siblings_show_func(core_siblings, core_cpumask); -static DEVICE_ATTR_RO(core_siblings); -static DEVICE_ATTR_RO(core_siblings_list); - -#ifdef CONFIG_SCHED_BOOK -define_id_show_func(book_id); -static DEVICE_ATTR_RO(book_id); -define_siblings_show_func(book_siblings, book_cpumask); -static DEVICE_ATTR_RO(book_siblings); -static DEVICE_ATTR_RO(book_siblings_list); -#endif - -static struct attribute *default_attrs[] = { - &dev_attr_physical_package_id.attr, - &dev_attr_core_id.attr, - &dev_attr_thread_siblings.attr, - &dev_attr_thread_siblings_list.attr, - &dev_attr_core_siblings.attr, - &dev_attr_core_siblings_list.attr, -#ifdef CONFIG_SCHED_BOOK - &dev_attr_book_id.attr, - &dev_attr_book_siblings.attr, - &dev_attr_book_siblings_list.attr, -#endif - NULL -}; - -static struct attribute_group topology_attr_group = { - .attrs = default_attrs, - .name = "topology" -}; - -/* Add/Remove cpu_topology interface for CPU device */ -static int topology_add_dev(unsigned int cpu) -{ - struct device *dev = get_cpu_device(cpu); - - return sysfs_create_group(&dev->kobj, &topology_attr_group); -} - -static void topology_remove_dev(unsigned int cpu) -{ - struct device *dev = get_cpu_device(cpu); - - sysfs_remove_group(&dev->kobj, &topology_attr_group); -} - -static int topology_cpu_callback(struct notifier_block *nfb, - unsigned long action, void *hcpu) -{ - unsigned int cpu = (unsigned long)hcpu; - int rc = 0; - - switch (action) { - case CPU_UP_PREPARE: - case CPU_UP_PREPARE_FROZEN: - rc = topology_add_dev(cpu); - break; - case CPU_UP_CANCELED: - case CPU_UP_CANCELED_FROZEN: - case CPU_DEAD: - case CPU_DEAD_FROZEN: - topology_remove_dev(cpu); - break; - } - return notifier_from_errno(rc); -} - -static int topology_sysfs_init(void) -{ - int cpu; - int rc = 0; - - cpu_notifier_register_begin(); - - for_each_online_cpu(cpu) { - rc = topology_add_dev(cpu); - if (rc) - goto out; - } - __hotcpu_notifier(topology_cpu_callback, 0); - -out: - cpu_notifier_register_done(); - return rc; -} - -device_initcall(topology_sysfs_init); -- 1.7.9.3
| |