LCOV - code coverage report
Current view: top level - drivers/base - topology.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 32 0.0 %
Date: 2014-02-18 Functions: 0 11 0.0 %
Branches: 0 14 0.0 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * driver/base/topology.c - Populate sysfs with cpu topology information
       3                 :            :  *
       4                 :            :  * Written by: Zhang Yanmin, Intel Corporation
       5                 :            :  *
       6                 :            :  * Copyright (C) 2006, Intel Corp.
       7                 :            :  *
       8                 :            :  * All rights reserved.
       9                 :            :  *
      10                 :            :  * This program is free software; you can redistribute it and/or modify
      11                 :            :  * it under the terms of the GNU General Public License as published by
      12                 :            :  * the Free Software Foundation; either version 2 of the License, or
      13                 :            :  * (at your option) any later version.
      14                 :            :  *
      15                 :            :  * This program is distributed in the hope that it will be useful, but
      16                 :            :  * WITHOUT ANY WARRANTY; without even the implied warranty of
      17                 :            :  * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
      18                 :            :  * NON INFRINGEMENT.  See the GNU General Public License for more
      19                 :            :  * details.
      20                 :            :  *
      21                 :            :  * You should have received a copy of the GNU General Public License
      22                 :            :  * along with this program; if not, write to the Free Software
      23                 :            :  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
      24                 :            :  *
      25                 :            :  */
      26                 :            : #include <linux/init.h>
      27                 :            : #include <linux/mm.h>
      28                 :            : #include <linux/cpu.h>
      29                 :            : #include <linux/module.h>
      30                 :            : #include <linux/hardirq.h>
      31                 :            : #include <linux/topology.h>
      32                 :            : 
      33                 :            : #define define_one_ro_named(_name, _func)                               \
      34                 :            :         static DEVICE_ATTR(_name, 0444, _func, NULL)
      35                 :            : 
      36                 :            : #define define_one_ro(_name)                            \
      37                 :            :         static DEVICE_ATTR(_name, 0444, show_##_name, NULL)
      38                 :            : 
      39                 :            : #define define_id_show_func(name)                               \
      40                 :            : static ssize_t show_##name(struct device *dev,                  \
      41                 :            :                 struct device_attribute *attr, char *buf)       \
      42                 :            : {                                                               \
      43                 :            :         unsigned int cpu = dev->id;                          \
      44                 :            :         return sprintf(buf, "%d\n", topology_##name(cpu));    \
      45                 :            : }
      46                 :            : 
      47                 :            : #if defined(topology_thread_cpumask) || defined(topology_core_cpumask) || \
      48                 :            :     defined(topology_book_cpumask)
      49                 :          0 : static ssize_t show_cpumap(int type, const struct cpumask *mask, char *buf)
      50                 :            : {
      51                 :          0 :         ptrdiff_t len = PTR_ALIGN(buf + PAGE_SIZE - 1, PAGE_SIZE) - buf;
      52                 :            :         int n = 0;
      53                 :            : 
      54         [ #  # ]:          0 :         if (len > 1) {
      55                 :            :                 n = type?
      56         [ #  # ]:          0 :                         cpulist_scnprintf(buf, len-2, mask) :
      57                 :          0 :                         cpumask_scnprintf(buf, len-2, mask);
      58                 :          0 :                 buf[n++] = '\n';
      59                 :          0 :                 buf[n] = '\0';
      60                 :            :         }
      61                 :          0 :         return n;
      62                 :            : }
      63                 :            : #endif
      64                 :            : 
      65                 :            : #define define_siblings_show_map(name)                                  \
      66                 :            : static ssize_t show_##name(struct device *dev,                          \
      67                 :            :                            struct device_attribute *attr, char *buf)    \
      68                 :            : {                                                                       \
      69                 :            :         return show_cpumap(0, topology_##name(dev->id), buf);                \
      70                 :            : }
      71                 :            : 
      72                 :            : #define define_siblings_show_list(name)                                 \
      73                 :            : static ssize_t show_##name##_list(struct device *dev,                   \
      74                 :            :                                   struct device_attribute *attr,        \
      75                 :            :                                   char *buf)                            \
      76                 :            : {                                                                       \
      77                 :            :         return show_cpumap(1, topology_##name(dev->id), buf);                \
      78                 :            : }
      79                 :            : 
      80                 :            : #define define_siblings_show_func(name)         \
      81                 :            :         define_siblings_show_map(name); define_siblings_show_list(name)
      82                 :            : 
      83                 :          0 : define_id_show_func(physical_package_id);
      84                 :            : define_one_ro(physical_package_id);
      85                 :            : 
      86                 :          0 : define_id_show_func(core_id);
      87                 :            : define_one_ro(core_id);
      88                 :            : 
      89                 :          0 : define_siblings_show_func(thread_cpumask);
      90                 :            : define_one_ro_named(thread_siblings, show_thread_cpumask);
      91                 :            : define_one_ro_named(thread_siblings_list, show_thread_cpumask_list);
      92                 :            : 
      93                 :          0 : define_siblings_show_func(core_cpumask);
      94                 :            : define_one_ro_named(core_siblings, show_core_cpumask);
      95                 :            : define_one_ro_named(core_siblings_list, show_core_cpumask_list);
      96                 :            : 
      97                 :            : #ifdef CONFIG_SCHED_BOOK
      98                 :            : define_id_show_func(book_id);
      99                 :            : define_one_ro(book_id);
     100                 :            : define_siblings_show_func(book_cpumask);
     101                 :            : define_one_ro_named(book_siblings, show_book_cpumask);
     102                 :            : define_one_ro_named(book_siblings_list, show_book_cpumask_list);
     103                 :            : #endif
     104                 :            : 
     105                 :            : static struct attribute *default_attrs[] = {
     106                 :            :         &dev_attr_physical_package_id.attr,
     107                 :            :         &dev_attr_core_id.attr,
     108                 :            :         &dev_attr_thread_siblings.attr,
     109                 :            :         &dev_attr_thread_siblings_list.attr,
     110                 :            :         &dev_attr_core_siblings.attr,
     111                 :            :         &dev_attr_core_siblings_list.attr,
     112                 :            : #ifdef CONFIG_SCHED_BOOK
     113                 :            :         &dev_attr_book_id.attr,
     114                 :            :         &dev_attr_book_siblings.attr,
     115                 :            :         &dev_attr_book_siblings_list.attr,
     116                 :            : #endif
     117                 :            :         NULL
     118                 :            : };
     119                 :            : 
     120                 :            : static struct attribute_group topology_attr_group = {
     121                 :            :         .attrs = default_attrs,
     122                 :            :         .name = "topology"
     123                 :            : };
     124                 :            : 
     125                 :            : /* Add/Remove cpu_topology interface for CPU device */
     126                 :          0 : static int topology_add_dev(unsigned int cpu)
     127                 :            : {
     128                 :          0 :         struct device *dev = get_cpu_device(cpu);
     129                 :            : 
     130                 :          0 :         return sysfs_create_group(&dev->kobj, &topology_attr_group);
     131                 :            : }
     132                 :            : 
     133                 :          0 : static void topology_remove_dev(unsigned int cpu)
     134                 :            : {
     135                 :          0 :         struct device *dev = get_cpu_device(cpu);
     136                 :            : 
     137                 :          0 :         sysfs_remove_group(&dev->kobj, &topology_attr_group);
     138                 :          0 : }
     139                 :            : 
     140                 :          0 : static int topology_cpu_callback(struct notifier_block *nfb,
     141                 :            :                                  unsigned long action, void *hcpu)
     142                 :            : {
     143 [ #  # ][ #  # ]:          0 :         unsigned int cpu = (unsigned long)hcpu;
                 [ #  # ]
     144                 :            :         int rc = 0;
     145                 :            : 
     146                 :            :         switch (action) {
     147                 :            :         case CPU_UP_PREPARE:
     148                 :            :         case CPU_UP_PREPARE_FROZEN:
     149                 :          0 :                 rc = topology_add_dev(cpu);
     150                 :          0 :                 break;
     151                 :            :         case CPU_UP_CANCELED:
     152                 :            :         case CPU_UP_CANCELED_FROZEN:
     153                 :            :         case CPU_DEAD:
     154                 :            :         case CPU_DEAD_FROZEN:
     155                 :          0 :                 topology_remove_dev(cpu);
     156                 :          0 :                 break;
     157                 :            :         }
     158                 :          0 :         return notifier_from_errno(rc);
     159                 :            : }
     160                 :            : 
     161                 :          0 : static int topology_sysfs_init(void)
     162                 :            : {
     163                 :            :         int cpu;
     164                 :            :         int rc;
     165                 :            : 
     166         [ #  # ]:          0 :         for_each_online_cpu(cpu) {
     167                 :          0 :                 rc = topology_add_dev(cpu);
     168         [ #  # ]:          0 :                 if (rc)
     169                 :            :                         return rc;
     170                 :            :         }
     171                 :          0 :         hotcpu_notifier(topology_cpu_callback, 0);
     172                 :            : 
     173                 :          0 :         return 0;
     174                 :            : }
     175                 :            : 
     176                 :            : device_initcall(topology_sysfs_init);

Generated by: LCOV version 1.9