LCOV - code coverage report
Current view: top level - drivers/base - topology.c (source / functions) Hit Total Coverage
Test: landlock.info Lines: 5 17 29.4 %
Date: 2021-04-22 12:43:58 Functions: 2 16 12.5 %

          Line data    Source code
       1             : // SPDX-License-Identifier: GPL-2.0+
       2             : /*
       3             :  * driver/base/topology.c - Populate sysfs with cpu topology information
       4             :  *
       5             :  * Written by: Zhang Yanmin, Intel Corporation
       6             :  *
       7             :  * Copyright (C) 2006, Intel Corp.
       8             :  *
       9             :  * All rights reserved.
      10             :  */
      11             : #include <linux/mm.h>
      12             : #include <linux/cpu.h>
      13             : #include <linux/module.h>
      14             : #include <linux/hardirq.h>
      15             : #include <linux/topology.h>
      16             : 
      17             : #define define_id_show_func(name)                                       \
      18             : static ssize_t name##_show(struct device *dev,                          \
      19             :                            struct device_attribute *attr, char *buf)    \
      20             : {                                                                       \
      21             :         return sysfs_emit(buf, "%d\n", topology_##name(dev->id));  \
      22             : }
      23             : 
      24             : #define define_siblings_show_map(name, mask)                            \
      25             : static ssize_t name##_show(struct device *dev,                          \
      26             :                            struct device_attribute *attr, char *buf)    \
      27             : {                                                                       \
      28             :         return cpumap_print_to_pagebuf(false, buf, topology_##mask(dev->id));\
      29             : }
      30             : 
      31             : #define define_siblings_show_list(name, mask)                           \
      32             : static ssize_t name##_list_show(struct device *dev,                     \
      33             :                                 struct device_attribute *attr,          \
      34             :                                 char *buf)                              \
      35             : {                                                                       \
      36             :         return cpumap_print_to_pagebuf(true, buf, topology_##mask(dev->id));\
      37             : }
      38             : 
      39             : #define define_siblings_show_func(name, mask)   \
      40             :         define_siblings_show_map(name, mask);   \
      41             :         define_siblings_show_list(name, mask)
      42             : 
      43           0 : define_id_show_func(physical_package_id);
      44             : static DEVICE_ATTR_RO(physical_package_id);
      45             : 
      46           0 : define_id_show_func(die_id);
      47             : static DEVICE_ATTR_RO(die_id);
      48             : 
      49           0 : define_id_show_func(core_id);
      50             : static DEVICE_ATTR_RO(core_id);
      51             : 
      52           0 : define_siblings_show_func(thread_siblings, sibling_cpumask);
      53             : static DEVICE_ATTR_RO(thread_siblings);
      54             : static DEVICE_ATTR_RO(thread_siblings_list);
      55             : 
      56           0 : define_siblings_show_func(core_cpus, sibling_cpumask);
      57             : static DEVICE_ATTR_RO(core_cpus);
      58             : static DEVICE_ATTR_RO(core_cpus_list);
      59             : 
      60           0 : define_siblings_show_func(core_siblings, core_cpumask);
      61             : static DEVICE_ATTR_RO(core_siblings);
      62             : static DEVICE_ATTR_RO(core_siblings_list);
      63             : 
      64           0 : define_siblings_show_func(die_cpus, die_cpumask);
      65             : static DEVICE_ATTR_RO(die_cpus);
      66             : static DEVICE_ATTR_RO(die_cpus_list);
      67             : 
      68           0 : define_siblings_show_func(package_cpus, core_cpumask);
      69             : static DEVICE_ATTR_RO(package_cpus);
      70             : static DEVICE_ATTR_RO(package_cpus_list);
      71             : 
      72             : #ifdef CONFIG_SCHED_BOOK
      73             : define_id_show_func(book_id);
      74             : static DEVICE_ATTR_RO(book_id);
      75             : define_siblings_show_func(book_siblings, book_cpumask);
      76             : static DEVICE_ATTR_RO(book_siblings);
      77             : static DEVICE_ATTR_RO(book_siblings_list);
      78             : #endif
      79             : 
      80             : #ifdef CONFIG_SCHED_DRAWER
      81             : define_id_show_func(drawer_id);
      82             : static DEVICE_ATTR_RO(drawer_id);
      83             : define_siblings_show_func(drawer_siblings, drawer_cpumask);
      84             : static DEVICE_ATTR_RO(drawer_siblings);
      85             : static DEVICE_ATTR_RO(drawer_siblings_list);
      86             : #endif
      87             : 
      88             : static struct attribute *default_attrs[] = {
      89             :         &dev_attr_physical_package_id.attr,
      90             :         &dev_attr_die_id.attr,
      91             :         &dev_attr_core_id.attr,
      92             :         &dev_attr_thread_siblings.attr,
      93             :         &dev_attr_thread_siblings_list.attr,
      94             :         &dev_attr_core_cpus.attr,
      95             :         &dev_attr_core_cpus_list.attr,
      96             :         &dev_attr_core_siblings.attr,
      97             :         &dev_attr_core_siblings_list.attr,
      98             :         &dev_attr_die_cpus.attr,
      99             :         &dev_attr_die_cpus_list.attr,
     100             :         &dev_attr_package_cpus.attr,
     101             :         &dev_attr_package_cpus_list.attr,
     102             : #ifdef CONFIG_SCHED_BOOK
     103             :         &dev_attr_book_id.attr,
     104             :         &dev_attr_book_siblings.attr,
     105             :         &dev_attr_book_siblings_list.attr,
     106             : #endif
     107             : #ifdef CONFIG_SCHED_DRAWER
     108             :         &dev_attr_drawer_id.attr,
     109             :         &dev_attr_drawer_siblings.attr,
     110             :         &dev_attr_drawer_siblings_list.attr,
     111             : #endif
     112             :         NULL
     113             : };
     114             : 
     115             : static const struct attribute_group topology_attr_group = {
     116             :         .attrs = default_attrs,
     117             :         .name = "topology"
     118             : };
     119             : 
     120             : /* Add/Remove cpu_topology interface for CPU device */
     121           4 : static int topology_add_dev(unsigned int cpu)
     122             : {
     123           4 :         struct device *dev = get_cpu_device(cpu);
     124             : 
     125           4 :         return sysfs_create_group(&dev->kobj, &topology_attr_group);
     126             : }
     127             : 
     128           0 : static int topology_remove_dev(unsigned int cpu)
     129             : {
     130           0 :         struct device *dev = get_cpu_device(cpu);
     131             : 
     132           0 :         sysfs_remove_group(&dev->kobj, &topology_attr_group);
     133           0 :         return 0;
     134             : }
     135             : 
     136           1 : static int __init topology_sysfs_init(void)
     137             : {
     138           1 :         return cpuhp_setup_state(CPUHP_TOPOLOGY_PREPARE,
     139             :                                  "base/topology:prepare", topology_add_dev,
     140             :                                  topology_remove_dev);
     141             : }
     142             : 
     143             : device_initcall(topology_sysfs_init);

Generated by: LCOV version 1.14