LCOV - code coverage report
Current view: top level - arch/x86/kernel - topology.c (source / functions) Hit Total Coverage
Test: landlock.info Lines: 15 27 55.6 %
Date: 2021-04-22 12:43:58 Functions: 2 4 50.0 %

          Line data    Source code
       1             : /*
       2             :  * Populate sysfs with topology information
       3             :  *
       4             :  * Written by: Matthew Dobson, IBM Corporation
       5             :  * Original Code: Paul Dorwin, IBM Corporation, Patrick Mochel, OSDL
       6             :  *
       7             :  * Copyright (C) 2002, IBM Corp.
       8             :  *
       9             :  * All rights reserved.
      10             :  *
      11             :  * This program is free software; you can redistribute it and/or modify
      12             :  * it under the terms of the GNU General Public License as published by
      13             :  * the Free Software Foundation; either version 2 of the License, or
      14             :  * (at your option) any later version.
      15             :  *
      16             :  * This program is distributed in the hope that it will be useful, but
      17             :  * WITHOUT ANY WARRANTY; without even the implied warranty of
      18             :  * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
      19             :  * NON INFRINGEMENT.  See the GNU General Public License for more
      20             :  * details.
      21             :  *
      22             :  * You should have received a copy of the GNU General Public License
      23             :  * along with this program; if not, write to the Free Software
      24             :  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
      25             :  *
      26             :  * Send feedback to <colpatch@us.ibm.com>
      27             :  */
      28             : #include <linux/interrupt.h>
      29             : #include <linux/nodemask.h>
      30             : #include <linux/export.h>
      31             : #include <linux/mmzone.h>
      32             : #include <linux/init.h>
      33             : #include <linux/smp.h>
      34             : #include <linux/irq.h>
      35             : #include <asm/io_apic.h>
      36             : #include <asm/cpu.h>
      37             : 
      38             : static DEFINE_PER_CPU(struct x86_cpu, cpu_devices);
      39             : 
      40             : #ifdef CONFIG_HOTPLUG_CPU
      41             : 
      42             : #ifdef CONFIG_BOOTPARAM_HOTPLUG_CPU0
      43             : static int cpu0_hotpluggable = 1;
      44             : #else
      45             : static int cpu0_hotpluggable;
      46           0 : static int __init enable_cpu0_hotplug(char *str)
      47             : {
      48           0 :         cpu0_hotpluggable = 1;
      49           0 :         return 1;
      50             : }
      51             : 
      52             : __setup("cpu0_hotplug", enable_cpu0_hotplug);
      53             : #endif
      54             : 
      55             : #ifdef CONFIG_DEBUG_HOTPLUG_CPU0
      56             : /*
      57             :  * This function offlines a CPU as early as possible and allows userspace to
      58             :  * boot up without the CPU. The CPU can be onlined back by user after boot.
      59             :  *
      60             :  * This is only called for debugging CPU offline/online feature.
      61             :  */
      62             : int _debug_hotplug_cpu(int cpu, int action)
      63             : {
      64             :         int ret;
      65             : 
      66             :         if (!cpu_is_hotpluggable(cpu))
      67             :                 return -EINVAL;
      68             : 
      69             :         switch (action) {
      70             :         case 0:
      71             :                 ret = remove_cpu(cpu);
      72             :                 if (!ret)
      73             :                         pr_info("DEBUG_HOTPLUG_CPU0: CPU %u is now offline\n", cpu);
      74             :                 else
      75             :                         pr_debug("Can't offline CPU%d.\n", cpu);
      76             :                 break;
      77             :         case 1:
      78             :                 ret = add_cpu(cpu);
      79             :                 if (ret)
      80             :                         pr_debug("Can't online CPU%d.\n", cpu);
      81             : 
      82             :                 break;
      83             :         default:
      84             :                 ret = -EINVAL;
      85             :         }
      86             : 
      87             :         return ret;
      88             : }
      89             : 
      90             : static int __init debug_hotplug_cpu(void)
      91             : {
      92             :         _debug_hotplug_cpu(0, 0);
      93             :         return 0;
      94             : }
      95             : 
      96             : late_initcall_sync(debug_hotplug_cpu);
      97             : #endif /* CONFIG_DEBUG_HOTPLUG_CPU0 */
      98             : 
      99           4 : int arch_register_cpu(int num)
     100             : {
     101           4 :         struct cpuinfo_x86 *c = &cpu_data(num);
     102             : 
     103             :         /*
     104             :          * Currently CPU0 is only hotpluggable on Intel platforms. Other
     105             :          * vendors can add hotplug support later.
     106             :          * Xen PV guests don't support CPU0 hotplug at all.
     107             :          */
     108           4 :         if (c->x86_vendor != X86_VENDOR_INTEL ||
     109           4 :             boot_cpu_has(X86_FEATURE_XENPV))
     110           0 :                 cpu0_hotpluggable = 0;
     111             : 
     112             :         /*
     113             :          * Two known BSP/CPU0 dependencies: Resume from suspend/hibernate
     114             :          * depends on BSP. PIC interrupts depend on BSP.
     115             :          *
     116             :          * If the BSP depencies are under control, one can tell kernel to
     117             :          * enable BSP hotplug. This basically adds a control file and
     118             :          * one can attempt to offline BSP.
     119             :          */
     120           4 :         if (num == 0 && cpu0_hotpluggable) {
     121           0 :                 unsigned int irq;
     122             :                 /*
     123             :                  * We won't take down the boot processor on i386 if some
     124             :                  * interrupts only are able to be serviced by the BSP in PIC.
     125             :                  */
     126           0 :                 for_each_active_irq(irq) {
     127           0 :                         if (!IO_APIC_IRQ(irq) && irq_has_action(irq)) {
     128           0 :                                 cpu0_hotpluggable = 0;
     129           0 :                                 break;
     130             :                         }
     131             :                 }
     132             :         }
     133           4 :         if (num || cpu0_hotpluggable)
     134           3 :                 per_cpu(cpu_devices, num).cpu.hotpluggable = 1;
     135             : 
     136           4 :         return register_cpu(&per_cpu(cpu_devices, num).cpu, num);
     137             : }
     138             : EXPORT_SYMBOL(arch_register_cpu);
     139             : 
     140           0 : void arch_unregister_cpu(int num)
     141             : {
     142           0 :         unregister_cpu(&per_cpu(cpu_devices, num).cpu);
     143           0 : }
     144             : EXPORT_SYMBOL(arch_unregister_cpu);
     145             : #else /* CONFIG_HOTPLUG_CPU */
     146             : 
     147             : static int __init arch_register_cpu(int num)
     148             : {
     149             :         return register_cpu(&per_cpu(cpu_devices, num).cpu, num);
     150             : }
     151             : #endif /* CONFIG_HOTPLUG_CPU */
     152             : 
     153           1 : static int __init topology_init(void)
     154             : {
     155           1 :         int i;
     156             : 
     157             : #ifdef CONFIG_NUMA
     158           2 :         for_each_online_node(i)
     159           1 :                 register_one_node(i);
     160             : #endif
     161             : 
     162           5 :         for_each_present_cpu(i)
     163           4 :                 arch_register_cpu(i);
     164             : 
     165           1 :         return 0;
     166             : }
     167             : subsys_initcall(topology_init);

Generated by: LCOV version 1.14