diff options
Diffstat (limited to 'arch/s390/kernel/smp.c')
-rw-r--r-- | arch/s390/kernel/smp.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c index 958704798f4a..a7125b62a9a6 100644 --- a/arch/s390/kernel/smp.c +++ b/arch/s390/kernel/smp.c | |||
@@ -59,7 +59,7 @@ enum { | |||
59 | }; | 59 | }; |
60 | 60 | ||
61 | struct pcpu { | 61 | struct pcpu { |
62 | struct cpu cpu; | 62 | struct cpu *cpu; |
63 | struct _lowcore *lowcore; /* lowcore page(s) for the cpu */ | 63 | struct _lowcore *lowcore; /* lowcore page(s) for the cpu */ |
64 | unsigned long async_stack; /* async stack for the cpu */ | 64 | unsigned long async_stack; /* async stack for the cpu */ |
65 | unsigned long panic_stack; /* panic stack for the cpu */ | 65 | unsigned long panic_stack; /* panic stack for the cpu */ |
@@ -159,9 +159,9 @@ static void pcpu_ec_call(struct pcpu *pcpu, int ec_bit) | |||
159 | { | 159 | { |
160 | int order; | 160 | int order; |
161 | 161 | ||
162 | set_bit(ec_bit, &pcpu->ec_mask); | 162 | if (test_and_set_bit(ec_bit, &pcpu->ec_mask)) |
163 | order = pcpu_running(pcpu) ? | 163 | return; |
164 | SIGP_EXTERNAL_CALL : SIGP_EMERGENCY_SIGNAL; | 164 | order = pcpu_running(pcpu) ? SIGP_EXTERNAL_CALL : SIGP_EMERGENCY_SIGNAL; |
165 | pcpu_sigp_retry(pcpu, order, 0); | 165 | pcpu_sigp_retry(pcpu, order, 0); |
166 | } | 166 | } |
167 | 167 | ||
@@ -965,7 +965,7 @@ static int smp_cpu_notify(struct notifier_block *self, unsigned long action, | |||
965 | void *hcpu) | 965 | void *hcpu) |
966 | { | 966 | { |
967 | unsigned int cpu = (unsigned int)(long)hcpu; | 967 | unsigned int cpu = (unsigned int)(long)hcpu; |
968 | struct cpu *c = &pcpu_devices[cpu].cpu; | 968 | struct cpu *c = pcpu_devices[cpu].cpu; |
969 | struct device *s = &c->dev; | 969 | struct device *s = &c->dev; |
970 | int err = 0; | 970 | int err = 0; |
971 | 971 | ||
@@ -982,10 +982,15 @@ static int smp_cpu_notify(struct notifier_block *self, unsigned long action, | |||
982 | 982 | ||
983 | static int smp_add_present_cpu(int cpu) | 983 | static int smp_add_present_cpu(int cpu) |
984 | { | 984 | { |
985 | struct cpu *c = &pcpu_devices[cpu].cpu; | 985 | struct device *s; |
986 | struct device *s = &c->dev; | 986 | struct cpu *c; |
987 | int rc; | 987 | int rc; |
988 | 988 | ||
989 | c = kzalloc(sizeof(*c), GFP_KERNEL); | ||
990 | if (!c) | ||
991 | return -ENOMEM; | ||
992 | pcpu_devices[cpu].cpu = c; | ||
993 | s = &c->dev; | ||
989 | c->hotpluggable = 1; | 994 | c->hotpluggable = 1; |
990 | rc = register_cpu(c, cpu); | 995 | rc = register_cpu(c, cpu); |
991 | if (rc) | 996 | if (rc) |