parisc: Switch from GENERIC_CPU_DEVICES to GENERIC_ARCH_TOPOLOGY
authorHelge Deller <deller@gmx.de>
Thu, 24 Mar 2022 18:46:50 +0000 (19:46 +0100)
committerHelge Deller <deller@gmx.de>
Tue, 29 Mar 2022 19:37:12 +0000 (21:37 +0200)
Switch away from the own cpu topology code to common code which is used
by ARM64 and RISCV. That will allow us to enable CPU hotplug later on.

Signed-off-by: Helge Deller <deller@gmx.de>
arch/parisc/Kconfig
arch/parisc/include/asm/topology.h
arch/parisc/kernel/Makefile
arch/parisc/kernel/processor.c
arch/parisc/kernel/topology.c

index 90fc95bd55cac7baae329f08dce0bf8a8bfe78c7..590843b8a62ef9a1cc4b261b2f8d55d0a630aac5 100644 (file)
@@ -37,7 +37,7 @@ config PARISC
        select GENERIC_PCI_IOMAP
        select ARCH_HAVE_NMI_SAFE_CMPXCHG
        select GENERIC_SMP_IDLE_THREAD
-       select GENERIC_CPU_DEVICES
+       select GENERIC_ARCH_TOPOLOGY if SMP
        select GENERIC_LIB_DEVMEM_IS_ALLOWED
        select SYSCTL_ARCH_UNALIGN_ALLOW
        select SYSCTL_EXCEPTION_TRACE
@@ -279,16 +279,9 @@ config SMP
 
          If you don't know what to do here, say N.
 
-config PARISC_CPU_TOPOLOGY
-       bool "Support cpu topology definition"
-       depends on SMP
-       default y
-       help
-         Support PARISC cpu topology definition.
-
 config SCHED_MC
        bool "Multi-core scheduler support"
-       depends on PARISC_CPU_TOPOLOGY && PA8X00
+       depends on GENERIC_ARCH_TOPOLOGY && PA8X00
        help
          Multi-core scheduler support improves the CPU scheduler's decision
          making when dealing with multi-core CPU chips at a cost of slightly
index 6f0750c74e47e1b8703df3b748cea6b7946620f5..406afb356f1a3b6f312e20310d886259574bd8eb 100644 (file)
@@ -1,33 +1,16 @@
 #ifndef _ASM_PARISC_TOPOLOGY_H
 #define _ASM_PARISC_TOPOLOGY_H
 
-#ifdef CONFIG_PARISC_CPU_TOPOLOGY
+#ifdef CONFIG_GENERIC_ARCH_TOPOLOGY
 
 #include <linux/cpumask.h>
-
-struct cputopo_parisc {
-       int thread_id;
-       int core_id;
-       int socket_id;
-       cpumask_t thread_sibling;
-       cpumask_t core_sibling;
-};
-
-extern struct cputopo_parisc cpu_topology[NR_CPUS];
-
-#define topology_physical_package_id(cpu)      (cpu_topology[cpu].socket_id)
-#define topology_core_id(cpu)          (cpu_topology[cpu].core_id)
-#define topology_core_cpumask(cpu)     (&cpu_topology[cpu].core_sibling)
-#define topology_sibling_cpumask(cpu)  (&cpu_topology[cpu].thread_sibling)
-
-void init_cpu_topology(void);
-void store_cpu_topology(unsigned int cpuid);
-const struct cpumask *cpu_coregroup_mask(int cpu);
+#include <linux/arch_topology.h>
 
 #else
 
 static inline void init_cpu_topology(void) { }
 static inline void store_cpu_topology(unsigned int cpuid) { }
+static inline void reset_cpu_topology(void) { }
 
 #endif
 
index d579243edc2fb122f44ea2bbb72cad64963fc446..d0bfac89a84272e1e8ae621ee4dc70b41ed6dbf3 100644 (file)
@@ -31,7 +31,7 @@ obj-$(CONFIG_AUDIT)   += audit.o
 obj64-$(CONFIG_AUDIT)  += compat_audit.o
 # only supported for PCX-W/U in 64-bit mode at the moment
 obj-$(CONFIG_64BIT)    += perf.o perf_asm.o $(obj64-y)
-obj-$(CONFIG_PARISC_CPU_TOPOLOGY)      += topology.o
+obj-$(CONFIG_GENERIC_ARCH_TOPOLOGY)    += topology.o
 obj-$(CONFIG_FUNCTION_TRACER)          += ftrace.o
 obj-$(CONFIG_FUNCTION_GRAPH_TRACER)    += ftrace.o
 obj-$(CONFIG_JUMP_LABEL)               += jump_label.o
index 1b6129e7d776b5da798280f8c6616818cfc06bb4..f48823eba75ff177263dbebce568ac1711436e0a 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/random.h>
 #include <linux/slab.h>
 #include <linux/cpu.h>
+#include <asm/topology.h>
 #include <asm/param.h>
 #include <asm/cache.h>
 #include <asm/hardware.h>      /* for register_parisc_driver() stuff */
@@ -390,7 +391,7 @@ show_cpuinfo (struct seq_file *m, void *v)
                                 boot_cpu_data.cpu_hz / 1000000,
                                 boot_cpu_data.cpu_hz % 1000000  );
 
-#ifdef CONFIG_PARISC_CPU_TOPOLOGY
+#ifdef CONFIG_GENERIC_ARCH_TOPOLOGY
                seq_printf(m, "physical id\t: %d\n",
                                topology_physical_package_id(cpu));
                seq_printf(m, "siblings\t: %d\n",
@@ -460,5 +461,6 @@ static struct parisc_driver cpu_driver __refdata = {
  */
 void __init processor_init(void)
 {
+       reset_cpu_topology();
        register_parisc_driver(&cpu_driver);
 }
index e88a6ce7c96d5bdaf2918d852389b7f8f9519a7c..8fce9a5350efc22c5cebb60627f72099a9911517 100644 (file)
 #include <linux/percpu.h>
 #include <linux/sched.h>
 #include <linux/sched/topology.h>
+#include <linux/cpu.h>
 
 #include <asm/topology.h>
 
- /*
-  * cpu topology table
-  */
-struct cputopo_parisc cpu_topology[NR_CPUS] __read_mostly;
-EXPORT_SYMBOL_GPL(cpu_topology);
-
-const struct cpumask *cpu_coregroup_mask(int cpu)
-{
-       return &cpu_topology[cpu].core_sibling;
-}
-
-static void update_siblings_masks(unsigned int cpuid)
-{
-       struct cputopo_parisc *cpu_topo, *cpuid_topo = &cpu_topology[cpuid];
-       int cpu;
-
-       /* update core and thread sibling masks */
-       for_each_possible_cpu(cpu) {
-               cpu_topo = &cpu_topology[cpu];
-
-               if (cpuid_topo->socket_id != cpu_topo->socket_id)
-                       continue;
-
-               cpumask_set_cpu(cpuid, &cpu_topo->core_sibling);
-               if (cpu != cpuid)
-                       cpumask_set_cpu(cpu, &cpuid_topo->core_sibling);
-
-               if (cpuid_topo->core_id != cpu_topo->core_id)
-                       continue;
-
-               cpumask_set_cpu(cpuid, &cpu_topo->thread_sibling);
-               if (cpu != cpuid)
-                       cpumask_set_cpu(cpu, &cpuid_topo->thread_sibling);
-       }
-       smp_wmb();
-}
+static DEFINE_PER_CPU(struct cpu, cpu_devices);
 
 static int dualcores_found __initdata;
 
@@ -62,7 +28,7 @@ static int dualcores_found __initdata;
  */
 void __init store_cpu_topology(unsigned int cpuid)
 {
-       struct cputopo_parisc *cpuid_topo = &cpu_topology[cpuid];
+       struct cpu_topology *cpuid_topo = &cpu_topology[cpuid];
        struct cpuinfo_parisc *p;
        int max_socket = -1;
        unsigned long cpu;
@@ -71,6 +37,12 @@ void __init store_cpu_topology(unsigned int cpuid)
        if (cpuid_topo->core_id != -1)
                return;
 
+#ifdef CONFIG_HOTPLUG_CPU
+       per_cpu(cpu_devices, cpuid).hotpluggable = 1;
+#endif
+       if (register_cpu(&per_cpu(cpu_devices, cpuid), cpuid))
+               pr_warn("Failed to register CPU%d device", cpuid);
+
        /* create cpu topology mapping */
        cpuid_topo->thread_id = -1;
        cpuid_topo->core_id = 0;
@@ -86,25 +58,25 @@ void __init store_cpu_topology(unsigned int cpuid)
                        cpuid_topo->core_id = cpu_topology[cpu].core_id;
                        if (p->cpu_loc) {
                                cpuid_topo->core_id++;
-                               cpuid_topo->socket_id = cpu_topology[cpu].socket_id;
+                               cpuid_topo->package_id = cpu_topology[cpu].package_id;
                                dualcores_found = 1;
                                continue;
                        }
                }
 
-               if (cpuid_topo->socket_id == -1)
-                       max_socket = max(max_socket, cpu_topology[cpu].socket_id);
+               if (cpuid_topo->package_id == -1)
+                       max_socket = max(max_socket, cpu_topology[cpu].package_id);
        }
 
-       if (cpuid_topo->socket_id == -1)
-               cpuid_topo->socket_id = max_socket + 1;
+       if (cpuid_topo->package_id == -1)
+               cpuid_topo->package_id = max_socket + 1;
 
        update_siblings_masks(cpuid);
 
        pr_info("CPU%u: cpu core %d of socket %d\n",
                cpuid,
                cpu_topology[cpuid].core_id,
-               cpu_topology[cpuid].socket_id);
+               cpu_topology[cpuid].package_id);
 }
 
 static struct sched_domain_topology_level parisc_mc_topology[] = {
@@ -122,20 +94,6 @@ static struct sched_domain_topology_level parisc_mc_topology[] = {
  */
 void __init init_cpu_topology(void)
 {
-       unsigned int cpu;
-
-       /* init core mask and capacity */
-       for_each_possible_cpu(cpu) {
-               struct cputopo_parisc *cpu_topo = &(cpu_topology[cpu]);
-
-               cpu_topo->thread_id = -1;
-               cpu_topo->core_id =  -1;
-               cpu_topo->socket_id = -1;
-               cpumask_clear(&cpu_topo->core_sibling);
-               cpumask_clear(&cpu_topo->thread_sibling);
-       }
-       smp_wmb();
-
        /* Set scheduler topology descriptor */
        if (dualcores_found)
                set_sched_topology(parisc_mc_topology);