aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/kernel/smp.c
diff options
context:
space:
mode:
authorHeiko Carstens <heiko.carstens@de.ibm.com>2012-09-04 11:36:16 -0400
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2012-09-26 09:45:09 -0400
commit50ab9a9a60fc83b8e8db36b54f365226e2b139ac (patch)
tree7b31ad679ac165144824550b2b6f213d48f63203 /arch/s390/kernel/smp.c
parentfade4dc49101e3b68fb375fd2b00d0ef1f31a36f (diff)
s390/smp,topology: add polarization member to pcpu struct
The cpu polarization member is the only per cpu state that is not part of the pcpu structure. So add it there and have everything in one place. Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch/s390/kernel/smp.c')
-rw-r--r--arch/s390/kernel/smp.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c
index c88fe8569e62..8676aab6ea6a 100644
--- a/arch/s390/kernel/smp.c
+++ b/arch/s390/kernel/smp.c
@@ -66,6 +66,7 @@ struct pcpu {
66 unsigned long panic_stack; /* panic stack for the cpu */ 66 unsigned long panic_stack; /* panic stack for the cpu */
67 unsigned long ec_mask; /* bit mask for ec_xxx functions */ 67 unsigned long ec_mask; /* bit mask for ec_xxx functions */
68 int state; /* physical cpu state */ 68 int state; /* physical cpu state */
69 int polarization; /* physical polarization */
69 u16 address; /* physical cpu address */ 70 u16 address; /* physical cpu address */
70}; 71};
71 72
@@ -73,6 +74,10 @@ static u8 boot_cpu_type;
73static u16 boot_cpu_address; 74static u16 boot_cpu_address;
74static struct pcpu pcpu_devices[NR_CPUS]; 75static struct pcpu pcpu_devices[NR_CPUS];
75 76
77/*
78 * The smp_cpu_state_mutex must be held when changing the state or polarization
79 * member of a pcpu data structure within the pcpu_devices arreay.
80 */
76DEFINE_MUTEX(smp_cpu_state_mutex); 81DEFINE_MUTEX(smp_cpu_state_mutex);
77 82
78/* 83/*
@@ -587,6 +592,16 @@ static inline void smp_get_save_area(int cpu, u16 address) { }
587 592
588#endif /* CONFIG_ZFCPDUMP || CONFIG_CRASH_DUMP */ 593#endif /* CONFIG_ZFCPDUMP || CONFIG_CRASH_DUMP */
589 594
595void smp_cpu_set_polarization(int cpu, int val)
596{
597 pcpu_devices[cpu].polarization = val;
598}
599
600int smp_cpu_get_polarization(int cpu)
601{
602 return pcpu_devices[cpu].polarization;
603}
604
590static struct sclp_cpu_info *smp_get_cpu_info(void) 605static struct sclp_cpu_info *smp_get_cpu_info(void)
591{ 606{
592 static int use_sigp_detection; 607 static int use_sigp_detection;
@@ -629,7 +644,7 @@ static int __devinit __smp_rescan_cpus(struct sclp_cpu_info *info,
629 pcpu->address = info->cpu[i].address; 644 pcpu->address = info->cpu[i].address;
630 pcpu->state = (cpu >= info->configured) ? 645 pcpu->state = (cpu >= info->configured) ?
631 CPU_STATE_STANDBY : CPU_STATE_CONFIGURED; 646 CPU_STATE_STANDBY : CPU_STATE_CONFIGURED;
632 cpu_set_polarization(cpu, POLARIZATION_UNKNOWN); 647 smp_cpu_set_polarization(cpu, POLARIZATION_UNKNOWN);
633 set_cpu_present(cpu, true); 648 set_cpu_present(cpu, true);
634 if (sysfs_add && smp_add_present_cpu(cpu) != 0) 649 if (sysfs_add && smp_add_present_cpu(cpu) != 0)
635 set_cpu_present(cpu, false); 650 set_cpu_present(cpu, false);
@@ -797,7 +812,7 @@ void __init smp_prepare_boot_cpu(void)
797 pcpu->async_stack = S390_lowcore.async_stack - ASYNC_SIZE; 812 pcpu->async_stack = S390_lowcore.async_stack - ASYNC_SIZE;
798 pcpu->panic_stack = S390_lowcore.panic_stack - PAGE_SIZE; 813 pcpu->panic_stack = S390_lowcore.panic_stack - PAGE_SIZE;
799 S390_lowcore.percpu_offset = __per_cpu_offset[0]; 814 S390_lowcore.percpu_offset = __per_cpu_offset[0];
800 cpu_set_polarization(0, POLARIZATION_UNKNOWN); 815 smp_cpu_set_polarization(0, POLARIZATION_UNKNOWN);
801 set_cpu_present(0, true); 816 set_cpu_present(0, true);
802 set_cpu_online(0, true); 817 set_cpu_online(0, true);
803} 818}
@@ -863,7 +878,7 @@ static ssize_t cpu_configure_store(struct device *dev,
863 if (rc) 878 if (rc)
864 break; 879 break;
865 pcpu->state = CPU_STATE_STANDBY; 880 pcpu->state = CPU_STATE_STANDBY;
866 cpu_set_polarization(cpu, POLARIZATION_UNKNOWN); 881 smp_cpu_set_polarization(cpu, POLARIZATION_UNKNOWN);
867 topology_expect_change(); 882 topology_expect_change();
868 break; 883 break;
869 case 1: 884 case 1:
@@ -873,7 +888,7 @@ static ssize_t cpu_configure_store(struct device *dev,
873 if (rc) 888 if (rc)
874 break; 889 break;
875 pcpu->state = CPU_STATE_CONFIGURED; 890 pcpu->state = CPU_STATE_CONFIGURED;
876 cpu_set_polarization(cpu, POLARIZATION_UNKNOWN); 891 smp_cpu_set_polarization(cpu, POLARIZATION_UNKNOWN);
877 topology_expect_change(); 892 topology_expect_change();
878 break; 893 break;
879 default: 894 default: