Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/s390/kernel/smp.c
10817 views
1
/*
2
* arch/s390/kernel/smp.c
3
*
4
* Copyright IBM Corp. 1999, 2009
5
* Author(s): Denis Joseph Barrow ([email protected],[email protected]),
6
* Martin Schwidefsky ([email protected])
7
* Heiko Carstens ([email protected])
8
*
9
* based on other smp stuff by
10
* (c) 1995 Alan Cox, CymruNET Ltd <[email protected]>
11
* (c) 1998 Ingo Molnar
12
*
13
* We work with logical cpu numbering everywhere we can. The only
14
* functions using the real cpu address (got from STAP) are the sigp
15
* functions. For all other functions we use the identity mapping.
16
* That means that cpu_number_map[i] == i for every cpu. cpu_number_map is
17
* used e.g. to find the idle task belonging to a logical cpu. Every array
18
* in the kernel is sorted by the logical cpu number and not by the physical
19
* one which is causing all the confusion with __cpu_logical_map and
20
* cpu_number_map in other architectures.
21
*/
22
23
#define KMSG_COMPONENT "cpu"
24
#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
25
26
#include <linux/workqueue.h>
27
#include <linux/module.h>
28
#include <linux/init.h>
29
#include <linux/mm.h>
30
#include <linux/err.h>
31
#include <linux/spinlock.h>
32
#include <linux/kernel_stat.h>
33
#include <linux/delay.h>
34
#include <linux/cache.h>
35
#include <linux/interrupt.h>
36
#include <linux/irqflags.h>
37
#include <linux/cpu.h>
38
#include <linux/timex.h>
39
#include <linux/bootmem.h>
40
#include <linux/slab.h>
41
#include <asm/asm-offsets.h>
42
#include <asm/ipl.h>
43
#include <asm/setup.h>
44
#include <asm/sigp.h>
45
#include <asm/pgalloc.h>
46
#include <asm/irq.h>
47
#include <asm/cpcmd.h>
48
#include <asm/tlbflush.h>
49
#include <asm/timer.h>
50
#include <asm/lowcore.h>
51
#include <asm/sclp.h>
52
#include <asm/cputime.h>
53
#include <asm/vdso.h>
54
#include <asm/cpu.h>
55
#include "entry.h"
56
57
/* logical cpu to cpu address */
58
unsigned short __cpu_logical_map[NR_CPUS];
59
60
static struct task_struct *current_set[NR_CPUS];
61
62
static u8 smp_cpu_type;
63
static int smp_use_sigp_detection;
64
65
enum s390_cpu_state {
66
CPU_STATE_STANDBY,
67
CPU_STATE_CONFIGURED,
68
};
69
70
DEFINE_MUTEX(smp_cpu_state_mutex);
71
int smp_cpu_polarization[NR_CPUS];
72
static int smp_cpu_state[NR_CPUS];
73
static int cpu_management;
74
75
static DEFINE_PER_CPU(struct cpu, cpu_devices);
76
77
static void smp_ext_bitcall(int, int);
78
79
static int raw_cpu_stopped(int cpu)
80
{
81
u32 status;
82
83
switch (raw_sigp_ps(&status, 0, cpu, sigp_sense)) {
84
case sigp_status_stored:
85
/* Check for stopped and check stop state */
86
if (status & 0x50)
87
return 1;
88
break;
89
default:
90
break;
91
}
92
return 0;
93
}
94
95
static inline int cpu_stopped(int cpu)
96
{
97
return raw_cpu_stopped(cpu_logical_map(cpu));
98
}
99
100
void smp_switch_to_ipl_cpu(void (*func)(void *), void *data)
101
{
102
struct _lowcore *lc, *current_lc;
103
struct stack_frame *sf;
104
struct pt_regs *regs;
105
unsigned long sp;
106
107
if (smp_processor_id() == 0)
108
func(data);
109
__load_psw_mask(PSW_BASE_BITS | PSW_DEFAULT_KEY);
110
/* Disable lowcore protection */
111
__ctl_clear_bit(0, 28);
112
current_lc = lowcore_ptr[smp_processor_id()];
113
lc = lowcore_ptr[0];
114
if (!lc)
115
lc = current_lc;
116
lc->restart_psw.mask = PSW_BASE_BITS | PSW_DEFAULT_KEY;
117
lc->restart_psw.addr = PSW_ADDR_AMODE | (unsigned long) smp_restart_cpu;
118
if (!cpu_online(0))
119
smp_switch_to_cpu(func, data, 0, stap(), __cpu_logical_map[0]);
120
while (sigp(0, sigp_stop_and_store_status) == sigp_busy)
121
cpu_relax();
122
sp = lc->panic_stack;
123
sp -= sizeof(struct pt_regs);
124
regs = (struct pt_regs *) sp;
125
memcpy(&regs->gprs, &current_lc->gpregs_save_area, sizeof(regs->gprs));
126
regs->psw = lc->psw_save_area;
127
sp -= STACK_FRAME_OVERHEAD;
128
sf = (struct stack_frame *) sp;
129
sf->back_chain = regs->gprs[15];
130
smp_switch_to_cpu(func, data, sp, stap(), __cpu_logical_map[0]);
131
}
132
133
void smp_send_stop(void)
134
{
135
int cpu, rc;
136
137
/* Disable all interrupts/machine checks */
138
__load_psw_mask(psw_kernel_bits & ~PSW_MASK_MCHECK);
139
trace_hardirqs_off();
140
141
/* stop all processors */
142
for_each_online_cpu(cpu) {
143
if (cpu == smp_processor_id())
144
continue;
145
do {
146
rc = sigp(cpu, sigp_stop);
147
} while (rc == sigp_busy);
148
149
while (!cpu_stopped(cpu))
150
cpu_relax();
151
}
152
}
153
154
/*
155
* This is the main routine where commands issued by other
156
* cpus are handled.
157
*/
158
159
static void do_ext_call_interrupt(unsigned int ext_int_code,
160
unsigned int param32, unsigned long param64)
161
{
162
unsigned long bits;
163
164
kstat_cpu(smp_processor_id()).irqs[EXTINT_IPI]++;
165
/*
166
* handle bit signal external calls
167
*/
168
bits = xchg(&S390_lowcore.ext_call_fast, 0);
169
170
if (test_bit(ec_schedule, &bits))
171
scheduler_ipi();
172
173
if (test_bit(ec_call_function, &bits))
174
generic_smp_call_function_interrupt();
175
176
if (test_bit(ec_call_function_single, &bits))
177
generic_smp_call_function_single_interrupt();
178
}
179
180
/*
181
* Send an external call sigp to another cpu and return without waiting
182
* for its completion.
183
*/
184
static void smp_ext_bitcall(int cpu, int sig)
185
{
186
/*
187
* Set signaling bit in lowcore of target cpu and kick it
188
*/
189
set_bit(sig, (unsigned long *) &lowcore_ptr[cpu]->ext_call_fast);
190
while (sigp(cpu, sigp_emergency_signal) == sigp_busy)
191
udelay(10);
192
}
193
194
void arch_send_call_function_ipi_mask(const struct cpumask *mask)
195
{
196
int cpu;
197
198
for_each_cpu(cpu, mask)
199
smp_ext_bitcall(cpu, ec_call_function);
200
}
201
202
void arch_send_call_function_single_ipi(int cpu)
203
{
204
smp_ext_bitcall(cpu, ec_call_function_single);
205
}
206
207
#ifndef CONFIG_64BIT
208
/*
209
* this function sends a 'purge tlb' signal to another CPU.
210
*/
211
static void smp_ptlb_callback(void *info)
212
{
213
__tlb_flush_local();
214
}
215
216
void smp_ptlb_all(void)
217
{
218
on_each_cpu(smp_ptlb_callback, NULL, 1);
219
}
220
EXPORT_SYMBOL(smp_ptlb_all);
221
#endif /* ! CONFIG_64BIT */
222
223
/*
224
* this function sends a 'reschedule' IPI to another CPU.
225
* it goes straight through and wastes no time serializing
226
* anything. Worst case is that we lose a reschedule ...
227
*/
228
void smp_send_reschedule(int cpu)
229
{
230
smp_ext_bitcall(cpu, ec_schedule);
231
}
232
233
/*
234
* parameter area for the set/clear control bit callbacks
235
*/
236
struct ec_creg_mask_parms {
237
unsigned long orvals[16];
238
unsigned long andvals[16];
239
};
240
241
/*
242
* callback for setting/clearing control bits
243
*/
244
static void smp_ctl_bit_callback(void *info)
245
{
246
struct ec_creg_mask_parms *pp = info;
247
unsigned long cregs[16];
248
int i;
249
250
__ctl_store(cregs, 0, 15);
251
for (i = 0; i <= 15; i++)
252
cregs[i] = (cregs[i] & pp->andvals[i]) | pp->orvals[i];
253
__ctl_load(cregs, 0, 15);
254
}
255
256
/*
257
* Set a bit in a control register of all cpus
258
*/
259
void smp_ctl_set_bit(int cr, int bit)
260
{
261
struct ec_creg_mask_parms parms;
262
263
memset(&parms.orvals, 0, sizeof(parms.orvals));
264
memset(&parms.andvals, 0xff, sizeof(parms.andvals));
265
parms.orvals[cr] = 1UL << bit;
266
on_each_cpu(smp_ctl_bit_callback, &parms, 1);
267
}
268
EXPORT_SYMBOL(smp_ctl_set_bit);
269
270
/*
271
* Clear a bit in a control register of all cpus
272
*/
273
void smp_ctl_clear_bit(int cr, int bit)
274
{
275
struct ec_creg_mask_parms parms;
276
277
memset(&parms.orvals, 0, sizeof(parms.orvals));
278
memset(&parms.andvals, 0xff, sizeof(parms.andvals));
279
parms.andvals[cr] = ~(1UL << bit);
280
on_each_cpu(smp_ctl_bit_callback, &parms, 1);
281
}
282
EXPORT_SYMBOL(smp_ctl_clear_bit);
283
284
#ifdef CONFIG_ZFCPDUMP
285
286
static void __init smp_get_save_area(unsigned int cpu, unsigned int phy_cpu)
287
{
288
if (ipl_info.type != IPL_TYPE_FCP_DUMP)
289
return;
290
if (cpu >= NR_CPUS) {
291
pr_warning("CPU %i exceeds the maximum %i and is excluded from "
292
"the dump\n", cpu, NR_CPUS - 1);
293
return;
294
}
295
zfcpdump_save_areas[cpu] = kmalloc(sizeof(struct save_area), GFP_KERNEL);
296
while (raw_sigp(phy_cpu, sigp_stop_and_store_status) == sigp_busy)
297
cpu_relax();
298
memcpy_real(zfcpdump_save_areas[cpu],
299
(void *)(unsigned long) store_prefix() + SAVE_AREA_BASE,
300
sizeof(struct save_area));
301
}
302
303
struct save_area *zfcpdump_save_areas[NR_CPUS + 1];
304
EXPORT_SYMBOL_GPL(zfcpdump_save_areas);
305
306
#else
307
308
static inline void smp_get_save_area(unsigned int cpu, unsigned int phy_cpu) { }
309
310
#endif /* CONFIG_ZFCPDUMP */
311
312
static int cpu_known(int cpu_id)
313
{
314
int cpu;
315
316
for_each_present_cpu(cpu) {
317
if (__cpu_logical_map[cpu] == cpu_id)
318
return 1;
319
}
320
return 0;
321
}
322
323
static int smp_rescan_cpus_sigp(cpumask_t avail)
324
{
325
int cpu_id, logical_cpu;
326
327
logical_cpu = cpumask_first(&avail);
328
if (logical_cpu >= nr_cpu_ids)
329
return 0;
330
for (cpu_id = 0; cpu_id <= MAX_CPU_ADDRESS; cpu_id++) {
331
if (cpu_known(cpu_id))
332
continue;
333
__cpu_logical_map[logical_cpu] = cpu_id;
334
smp_cpu_polarization[logical_cpu] = POLARIZATION_UNKNWN;
335
if (!cpu_stopped(logical_cpu))
336
continue;
337
set_cpu_present(logical_cpu, true);
338
smp_cpu_state[logical_cpu] = CPU_STATE_CONFIGURED;
339
logical_cpu = cpumask_next(logical_cpu, &avail);
340
if (logical_cpu >= nr_cpu_ids)
341
break;
342
}
343
return 0;
344
}
345
346
static int smp_rescan_cpus_sclp(cpumask_t avail)
347
{
348
struct sclp_cpu_info *info;
349
int cpu_id, logical_cpu, cpu;
350
int rc;
351
352
logical_cpu = cpumask_first(&avail);
353
if (logical_cpu >= nr_cpu_ids)
354
return 0;
355
info = kmalloc(sizeof(*info), GFP_KERNEL);
356
if (!info)
357
return -ENOMEM;
358
rc = sclp_get_cpu_info(info);
359
if (rc)
360
goto out;
361
for (cpu = 0; cpu < info->combined; cpu++) {
362
if (info->has_cpu_type && info->cpu[cpu].type != smp_cpu_type)
363
continue;
364
cpu_id = info->cpu[cpu].address;
365
if (cpu_known(cpu_id))
366
continue;
367
__cpu_logical_map[logical_cpu] = cpu_id;
368
smp_cpu_polarization[logical_cpu] = POLARIZATION_UNKNWN;
369
set_cpu_present(logical_cpu, true);
370
if (cpu >= info->configured)
371
smp_cpu_state[logical_cpu] = CPU_STATE_STANDBY;
372
else
373
smp_cpu_state[logical_cpu] = CPU_STATE_CONFIGURED;
374
logical_cpu = cpumask_next(logical_cpu, &avail);
375
if (logical_cpu >= nr_cpu_ids)
376
break;
377
}
378
out:
379
kfree(info);
380
return rc;
381
}
382
383
static int __smp_rescan_cpus(void)
384
{
385
cpumask_t avail;
386
387
cpumask_xor(&avail, cpu_possible_mask, cpu_present_mask);
388
if (smp_use_sigp_detection)
389
return smp_rescan_cpus_sigp(avail);
390
else
391
return smp_rescan_cpus_sclp(avail);
392
}
393
394
static void __init smp_detect_cpus(void)
395
{
396
unsigned int cpu, c_cpus, s_cpus;
397
struct sclp_cpu_info *info;
398
u16 boot_cpu_addr, cpu_addr;
399
400
c_cpus = 1;
401
s_cpus = 0;
402
boot_cpu_addr = __cpu_logical_map[0];
403
info = kmalloc(sizeof(*info), GFP_KERNEL);
404
if (!info)
405
panic("smp_detect_cpus failed to allocate memory\n");
406
/* Use sigp detection algorithm if sclp doesn't work. */
407
if (sclp_get_cpu_info(info)) {
408
smp_use_sigp_detection = 1;
409
for (cpu = 0; cpu <= MAX_CPU_ADDRESS; cpu++) {
410
if (cpu == boot_cpu_addr)
411
continue;
412
if (!raw_cpu_stopped(cpu))
413
continue;
414
smp_get_save_area(c_cpus, cpu);
415
c_cpus++;
416
}
417
goto out;
418
}
419
420
if (info->has_cpu_type) {
421
for (cpu = 0; cpu < info->combined; cpu++) {
422
if (info->cpu[cpu].address == boot_cpu_addr) {
423
smp_cpu_type = info->cpu[cpu].type;
424
break;
425
}
426
}
427
}
428
429
for (cpu = 0; cpu < info->combined; cpu++) {
430
if (info->has_cpu_type && info->cpu[cpu].type != smp_cpu_type)
431
continue;
432
cpu_addr = info->cpu[cpu].address;
433
if (cpu_addr == boot_cpu_addr)
434
continue;
435
if (!raw_cpu_stopped(cpu_addr)) {
436
s_cpus++;
437
continue;
438
}
439
smp_get_save_area(c_cpus, cpu_addr);
440
c_cpus++;
441
}
442
out:
443
kfree(info);
444
pr_info("%d configured CPUs, %d standby CPUs\n", c_cpus, s_cpus);
445
get_online_cpus();
446
__smp_rescan_cpus();
447
put_online_cpus();
448
}
449
450
/*
451
* Activate a secondary processor.
452
*/
453
int __cpuinit start_secondary(void *cpuvoid)
454
{
455
/* Setup the cpu */
456
cpu_init();
457
preempt_disable();
458
/* Enable TOD clock interrupts on the secondary cpu. */
459
init_cpu_timer();
460
/* Enable cpu timer interrupts on the secondary cpu. */
461
init_cpu_vtimer();
462
/* Enable pfault pseudo page faults on this cpu. */
463
pfault_init();
464
465
/* call cpu notifiers */
466
notify_cpu_starting(smp_processor_id());
467
/* Mark this cpu as online */
468
ipi_call_lock();
469
set_cpu_online(smp_processor_id(), true);
470
ipi_call_unlock();
471
/* Switch on interrupts */
472
local_irq_enable();
473
/* cpu_idle will call schedule for us */
474
cpu_idle();
475
return 0;
476
}
477
478
struct create_idle {
479
struct work_struct work;
480
struct task_struct *idle;
481
struct completion done;
482
int cpu;
483
};
484
485
static void __cpuinit smp_fork_idle(struct work_struct *work)
486
{
487
struct create_idle *c_idle;
488
489
c_idle = container_of(work, struct create_idle, work);
490
c_idle->idle = fork_idle(c_idle->cpu);
491
complete(&c_idle->done);
492
}
493
494
static int __cpuinit smp_alloc_lowcore(int cpu)
495
{
496
unsigned long async_stack, panic_stack;
497
struct _lowcore *lowcore;
498
499
lowcore = (void *) __get_free_pages(GFP_KERNEL | GFP_DMA, LC_ORDER);
500
if (!lowcore)
501
return -ENOMEM;
502
async_stack = __get_free_pages(GFP_KERNEL, ASYNC_ORDER);
503
panic_stack = __get_free_page(GFP_KERNEL);
504
if (!panic_stack || !async_stack)
505
goto out;
506
memcpy(lowcore, &S390_lowcore, 512);
507
memset((char *)lowcore + 512, 0, sizeof(*lowcore) - 512);
508
lowcore->async_stack = async_stack + ASYNC_SIZE;
509
lowcore->panic_stack = panic_stack + PAGE_SIZE;
510
511
#ifndef CONFIG_64BIT
512
if (MACHINE_HAS_IEEE) {
513
unsigned long save_area;
514
515
save_area = get_zeroed_page(GFP_KERNEL);
516
if (!save_area)
517
goto out;
518
lowcore->extended_save_area_addr = (u32) save_area;
519
}
520
#else
521
if (vdso_alloc_per_cpu(cpu, lowcore))
522
goto out;
523
#endif
524
lowcore_ptr[cpu] = lowcore;
525
return 0;
526
527
out:
528
free_page(panic_stack);
529
free_pages(async_stack, ASYNC_ORDER);
530
free_pages((unsigned long) lowcore, LC_ORDER);
531
return -ENOMEM;
532
}
533
534
static void smp_free_lowcore(int cpu)
535
{
536
struct _lowcore *lowcore;
537
538
lowcore = lowcore_ptr[cpu];
539
#ifndef CONFIG_64BIT
540
if (MACHINE_HAS_IEEE)
541
free_page((unsigned long) lowcore->extended_save_area_addr);
542
#else
543
vdso_free_per_cpu(cpu, lowcore);
544
#endif
545
free_page(lowcore->panic_stack - PAGE_SIZE);
546
free_pages(lowcore->async_stack - ASYNC_SIZE, ASYNC_ORDER);
547
free_pages((unsigned long) lowcore, LC_ORDER);
548
lowcore_ptr[cpu] = NULL;
549
}
550
551
/* Upping and downing of CPUs */
552
int __cpuinit __cpu_up(unsigned int cpu)
553
{
554
struct _lowcore *cpu_lowcore;
555
struct create_idle c_idle;
556
struct task_struct *idle;
557
struct stack_frame *sf;
558
u32 lowcore;
559
int ccode;
560
561
if (smp_cpu_state[cpu] != CPU_STATE_CONFIGURED)
562
return -EIO;
563
idle = current_set[cpu];
564
if (!idle) {
565
c_idle.done = COMPLETION_INITIALIZER_ONSTACK(c_idle.done);
566
INIT_WORK_ONSTACK(&c_idle.work, smp_fork_idle);
567
c_idle.cpu = cpu;
568
schedule_work(&c_idle.work);
569
wait_for_completion(&c_idle.done);
570
if (IS_ERR(c_idle.idle))
571
return PTR_ERR(c_idle.idle);
572
idle = c_idle.idle;
573
current_set[cpu] = c_idle.idle;
574
}
575
init_idle(idle, cpu);
576
if (smp_alloc_lowcore(cpu))
577
return -ENOMEM;
578
do {
579
ccode = sigp(cpu, sigp_initial_cpu_reset);
580
if (ccode == sigp_busy)
581
udelay(10);
582
if (ccode == sigp_not_operational)
583
goto err_out;
584
} while (ccode == sigp_busy);
585
586
lowcore = (u32)(unsigned long)lowcore_ptr[cpu];
587
while (sigp_p(lowcore, cpu, sigp_set_prefix) == sigp_busy)
588
udelay(10);
589
590
cpu_lowcore = lowcore_ptr[cpu];
591
cpu_lowcore->kernel_stack = (unsigned long)
592
task_stack_page(idle) + THREAD_SIZE;
593
cpu_lowcore->thread_info = (unsigned long) task_thread_info(idle);
594
sf = (struct stack_frame *) (cpu_lowcore->kernel_stack
595
- sizeof(struct pt_regs)
596
- sizeof(struct stack_frame));
597
memset(sf, 0, sizeof(struct stack_frame));
598
sf->gprs[9] = (unsigned long) sf;
599
cpu_lowcore->save_area[15] = (unsigned long) sf;
600
__ctl_store(cpu_lowcore->cregs_save_area, 0, 15);
601
atomic_inc(&init_mm.context.attach_count);
602
asm volatile(
603
" stam 0,15,0(%0)"
604
: : "a" (&cpu_lowcore->access_regs_save_area) : "memory");
605
cpu_lowcore->percpu_offset = __per_cpu_offset[cpu];
606
cpu_lowcore->current_task = (unsigned long) idle;
607
cpu_lowcore->cpu_nr = cpu;
608
cpu_lowcore->kernel_asce = S390_lowcore.kernel_asce;
609
cpu_lowcore->machine_flags = S390_lowcore.machine_flags;
610
cpu_lowcore->ftrace_func = S390_lowcore.ftrace_func;
611
memcpy(cpu_lowcore->stfle_fac_list, S390_lowcore.stfle_fac_list,
612
MAX_FACILITY_BIT/8);
613
eieio();
614
615
while (sigp(cpu, sigp_restart) == sigp_busy)
616
udelay(10);
617
618
while (!cpu_online(cpu))
619
cpu_relax();
620
return 0;
621
622
err_out:
623
smp_free_lowcore(cpu);
624
return -EIO;
625
}
626
627
static int __init setup_possible_cpus(char *s)
628
{
629
int pcpus, cpu;
630
631
pcpus = simple_strtoul(s, NULL, 0);
632
init_cpu_possible(cpumask_of(0));
633
for (cpu = 1; cpu < pcpus && cpu < nr_cpu_ids; cpu++)
634
set_cpu_possible(cpu, true);
635
return 0;
636
}
637
early_param("possible_cpus", setup_possible_cpus);
638
639
#ifdef CONFIG_HOTPLUG_CPU
640
641
int __cpu_disable(void)
642
{
643
struct ec_creg_mask_parms cr_parms;
644
int cpu = smp_processor_id();
645
646
set_cpu_online(cpu, false);
647
648
/* Disable pfault pseudo page faults on this cpu. */
649
pfault_fini();
650
651
memset(&cr_parms.orvals, 0, sizeof(cr_parms.orvals));
652
memset(&cr_parms.andvals, 0xff, sizeof(cr_parms.andvals));
653
654
/* disable all external interrupts */
655
cr_parms.orvals[0] = 0;
656
cr_parms.andvals[0] = ~(1 << 15 | 1 << 14 | 1 << 13 | 1 << 11 |
657
1 << 10 | 1 << 9 | 1 << 6 | 1 << 4);
658
/* disable all I/O interrupts */
659
cr_parms.orvals[6] = 0;
660
cr_parms.andvals[6] = ~(1 << 31 | 1 << 30 | 1 << 29 | 1 << 28 |
661
1 << 27 | 1 << 26 | 1 << 25 | 1 << 24);
662
/* disable most machine checks */
663
cr_parms.orvals[14] = 0;
664
cr_parms.andvals[14] = ~(1 << 28 | 1 << 27 | 1 << 26 |
665
1 << 25 | 1 << 24);
666
667
smp_ctl_bit_callback(&cr_parms);
668
669
return 0;
670
}
671
672
void __cpu_die(unsigned int cpu)
673
{
674
/* Wait until target cpu is down */
675
while (!cpu_stopped(cpu))
676
cpu_relax();
677
while (sigp_p(0, cpu, sigp_set_prefix) == sigp_busy)
678
udelay(10);
679
smp_free_lowcore(cpu);
680
atomic_dec(&init_mm.context.attach_count);
681
}
682
683
void __noreturn cpu_die(void)
684
{
685
idle_task_exit();
686
while (sigp(smp_processor_id(), sigp_stop) == sigp_busy)
687
cpu_relax();
688
for (;;);
689
}
690
691
#endif /* CONFIG_HOTPLUG_CPU */
692
693
void __init smp_prepare_cpus(unsigned int max_cpus)
694
{
695
#ifndef CONFIG_64BIT
696
unsigned long save_area = 0;
697
#endif
698
unsigned long async_stack, panic_stack;
699
struct _lowcore *lowcore;
700
701
smp_detect_cpus();
702
703
/* request the 0x1201 emergency signal external interrupt */
704
if (register_external_interrupt(0x1201, do_ext_call_interrupt) != 0)
705
panic("Couldn't request external interrupt 0x1201");
706
707
/* Reallocate current lowcore, but keep its contents. */
708
lowcore = (void *) __get_free_pages(GFP_KERNEL | GFP_DMA, LC_ORDER);
709
panic_stack = __get_free_page(GFP_KERNEL);
710
async_stack = __get_free_pages(GFP_KERNEL, ASYNC_ORDER);
711
BUG_ON(!lowcore || !panic_stack || !async_stack);
712
#ifndef CONFIG_64BIT
713
if (MACHINE_HAS_IEEE)
714
save_area = get_zeroed_page(GFP_KERNEL);
715
#endif
716
local_irq_disable();
717
local_mcck_disable();
718
lowcore_ptr[smp_processor_id()] = lowcore;
719
*lowcore = S390_lowcore;
720
lowcore->panic_stack = panic_stack + PAGE_SIZE;
721
lowcore->async_stack = async_stack + ASYNC_SIZE;
722
#ifndef CONFIG_64BIT
723
if (MACHINE_HAS_IEEE)
724
lowcore->extended_save_area_addr = (u32) save_area;
725
#endif
726
set_prefix((u32)(unsigned long) lowcore);
727
local_mcck_enable();
728
local_irq_enable();
729
#ifdef CONFIG_64BIT
730
if (vdso_alloc_per_cpu(smp_processor_id(), &S390_lowcore))
731
BUG();
732
#endif
733
}
734
735
void __init smp_prepare_boot_cpu(void)
736
{
737
BUG_ON(smp_processor_id() != 0);
738
739
current_thread_info()->cpu = 0;
740
set_cpu_present(0, true);
741
set_cpu_online(0, true);
742
S390_lowcore.percpu_offset = __per_cpu_offset[0];
743
current_set[0] = current;
744
smp_cpu_state[0] = CPU_STATE_CONFIGURED;
745
smp_cpu_polarization[0] = POLARIZATION_UNKNWN;
746
}
747
748
void __init smp_cpus_done(unsigned int max_cpus)
749
{
750
}
751
752
void __init smp_setup_processor_id(void)
753
{
754
S390_lowcore.cpu_nr = 0;
755
__cpu_logical_map[0] = stap();
756
}
757
758
/*
759
* the frequency of the profiling timer can be changed
760
* by writing a multiplier value into /proc/profile.
761
*
762
* usually you want to run this on all CPUs ;)
763
*/
764
int setup_profiling_timer(unsigned int multiplier)
765
{
766
return 0;
767
}
768
769
#ifdef CONFIG_HOTPLUG_CPU
770
static ssize_t cpu_configure_show(struct sys_device *dev,
771
struct sysdev_attribute *attr, char *buf)
772
{
773
ssize_t count;
774
775
mutex_lock(&smp_cpu_state_mutex);
776
count = sprintf(buf, "%d\n", smp_cpu_state[dev->id]);
777
mutex_unlock(&smp_cpu_state_mutex);
778
return count;
779
}
780
781
static ssize_t cpu_configure_store(struct sys_device *dev,
782
struct sysdev_attribute *attr,
783
const char *buf, size_t count)
784
{
785
int cpu = dev->id;
786
int val, rc;
787
char delim;
788
789
if (sscanf(buf, "%d %c", &val, &delim) != 1)
790
return -EINVAL;
791
if (val != 0 && val != 1)
792
return -EINVAL;
793
794
get_online_cpus();
795
mutex_lock(&smp_cpu_state_mutex);
796
rc = -EBUSY;
797
/* disallow configuration changes of online cpus and cpu 0 */
798
if (cpu_online(cpu) || cpu == 0)
799
goto out;
800
rc = 0;
801
switch (val) {
802
case 0:
803
if (smp_cpu_state[cpu] == CPU_STATE_CONFIGURED) {
804
rc = sclp_cpu_deconfigure(__cpu_logical_map[cpu]);
805
if (!rc) {
806
smp_cpu_state[cpu] = CPU_STATE_STANDBY;
807
smp_cpu_polarization[cpu] = POLARIZATION_UNKNWN;
808
}
809
}
810
break;
811
case 1:
812
if (smp_cpu_state[cpu] == CPU_STATE_STANDBY) {
813
rc = sclp_cpu_configure(__cpu_logical_map[cpu]);
814
if (!rc) {
815
smp_cpu_state[cpu] = CPU_STATE_CONFIGURED;
816
smp_cpu_polarization[cpu] = POLARIZATION_UNKNWN;
817
}
818
}
819
break;
820
default:
821
break;
822
}
823
out:
824
mutex_unlock(&smp_cpu_state_mutex);
825
put_online_cpus();
826
return rc ? rc : count;
827
}
828
static SYSDEV_ATTR(configure, 0644, cpu_configure_show, cpu_configure_store);
829
#endif /* CONFIG_HOTPLUG_CPU */
830
831
static ssize_t cpu_polarization_show(struct sys_device *dev,
832
struct sysdev_attribute *attr, char *buf)
833
{
834
int cpu = dev->id;
835
ssize_t count;
836
837
mutex_lock(&smp_cpu_state_mutex);
838
switch (smp_cpu_polarization[cpu]) {
839
case POLARIZATION_HRZ:
840
count = sprintf(buf, "horizontal\n");
841
break;
842
case POLARIZATION_VL:
843
count = sprintf(buf, "vertical:low\n");
844
break;
845
case POLARIZATION_VM:
846
count = sprintf(buf, "vertical:medium\n");
847
break;
848
case POLARIZATION_VH:
849
count = sprintf(buf, "vertical:high\n");
850
break;
851
default:
852
count = sprintf(buf, "unknown\n");
853
break;
854
}
855
mutex_unlock(&smp_cpu_state_mutex);
856
return count;
857
}
858
static SYSDEV_ATTR(polarization, 0444, cpu_polarization_show, NULL);
859
860
static ssize_t show_cpu_address(struct sys_device *dev,
861
struct sysdev_attribute *attr, char *buf)
862
{
863
return sprintf(buf, "%d\n", __cpu_logical_map[dev->id]);
864
}
865
static SYSDEV_ATTR(address, 0444, show_cpu_address, NULL);
866
867
868
static struct attribute *cpu_common_attrs[] = {
869
#ifdef CONFIG_HOTPLUG_CPU
870
&attr_configure.attr,
871
#endif
872
&attr_address.attr,
873
&attr_polarization.attr,
874
NULL,
875
};
876
877
static struct attribute_group cpu_common_attr_group = {
878
.attrs = cpu_common_attrs,
879
};
880
881
static ssize_t show_capability(struct sys_device *dev,
882
struct sysdev_attribute *attr, char *buf)
883
{
884
unsigned int capability;
885
int rc;
886
887
rc = get_cpu_capability(&capability);
888
if (rc)
889
return rc;
890
return sprintf(buf, "%u\n", capability);
891
}
892
static SYSDEV_ATTR(capability, 0444, show_capability, NULL);
893
894
static ssize_t show_idle_count(struct sys_device *dev,
895
struct sysdev_attribute *attr, char *buf)
896
{
897
struct s390_idle_data *idle;
898
unsigned long long idle_count;
899
unsigned int sequence;
900
901
idle = &per_cpu(s390_idle, dev->id);
902
repeat:
903
sequence = idle->sequence;
904
smp_rmb();
905
if (sequence & 1)
906
goto repeat;
907
idle_count = idle->idle_count;
908
if (idle->idle_enter)
909
idle_count++;
910
smp_rmb();
911
if (idle->sequence != sequence)
912
goto repeat;
913
return sprintf(buf, "%llu\n", idle_count);
914
}
915
static SYSDEV_ATTR(idle_count, 0444, show_idle_count, NULL);
916
917
static ssize_t show_idle_time(struct sys_device *dev,
918
struct sysdev_attribute *attr, char *buf)
919
{
920
struct s390_idle_data *idle;
921
unsigned long long now, idle_time, idle_enter;
922
unsigned int sequence;
923
924
idle = &per_cpu(s390_idle, dev->id);
925
now = get_clock();
926
repeat:
927
sequence = idle->sequence;
928
smp_rmb();
929
if (sequence & 1)
930
goto repeat;
931
idle_time = idle->idle_time;
932
idle_enter = idle->idle_enter;
933
if (idle_enter != 0ULL && idle_enter < now)
934
idle_time += now - idle_enter;
935
smp_rmb();
936
if (idle->sequence != sequence)
937
goto repeat;
938
return sprintf(buf, "%llu\n", idle_time >> 12);
939
}
940
static SYSDEV_ATTR(idle_time_us, 0444, show_idle_time, NULL);
941
942
static struct attribute *cpu_online_attrs[] = {
943
&attr_capability.attr,
944
&attr_idle_count.attr,
945
&attr_idle_time_us.attr,
946
NULL,
947
};
948
949
static struct attribute_group cpu_online_attr_group = {
950
.attrs = cpu_online_attrs,
951
};
952
953
static int __cpuinit smp_cpu_notify(struct notifier_block *self,
954
unsigned long action, void *hcpu)
955
{
956
unsigned int cpu = (unsigned int)(long)hcpu;
957
struct cpu *c = &per_cpu(cpu_devices, cpu);
958
struct sys_device *s = &c->sysdev;
959
struct s390_idle_data *idle;
960
int err = 0;
961
962
switch (action) {
963
case CPU_ONLINE:
964
case CPU_ONLINE_FROZEN:
965
idle = &per_cpu(s390_idle, cpu);
966
memset(idle, 0, sizeof(struct s390_idle_data));
967
err = sysfs_create_group(&s->kobj, &cpu_online_attr_group);
968
break;
969
case CPU_DEAD:
970
case CPU_DEAD_FROZEN:
971
sysfs_remove_group(&s->kobj, &cpu_online_attr_group);
972
break;
973
}
974
return notifier_from_errno(err);
975
}
976
977
static struct notifier_block __cpuinitdata smp_cpu_nb = {
978
.notifier_call = smp_cpu_notify,
979
};
980
981
static int __devinit smp_add_present_cpu(int cpu)
982
{
983
struct cpu *c = &per_cpu(cpu_devices, cpu);
984
struct sys_device *s = &c->sysdev;
985
int rc;
986
987
c->hotpluggable = 1;
988
rc = register_cpu(c, cpu);
989
if (rc)
990
goto out;
991
rc = sysfs_create_group(&s->kobj, &cpu_common_attr_group);
992
if (rc)
993
goto out_cpu;
994
if (!cpu_online(cpu))
995
goto out;
996
rc = sysfs_create_group(&s->kobj, &cpu_online_attr_group);
997
if (!rc)
998
return 0;
999
sysfs_remove_group(&s->kobj, &cpu_common_attr_group);
1000
out_cpu:
1001
#ifdef CONFIG_HOTPLUG_CPU
1002
unregister_cpu(c);
1003
#endif
1004
out:
1005
return rc;
1006
}
1007
1008
#ifdef CONFIG_HOTPLUG_CPU
1009
1010
int __ref smp_rescan_cpus(void)
1011
{
1012
cpumask_t newcpus;
1013
int cpu;
1014
int rc;
1015
1016
get_online_cpus();
1017
mutex_lock(&smp_cpu_state_mutex);
1018
cpumask_copy(&newcpus, cpu_present_mask);
1019
rc = __smp_rescan_cpus();
1020
if (rc)
1021
goto out;
1022
cpumask_andnot(&newcpus, cpu_present_mask, &newcpus);
1023
for_each_cpu(cpu, &newcpus) {
1024
rc = smp_add_present_cpu(cpu);
1025
if (rc)
1026
set_cpu_present(cpu, false);
1027
}
1028
rc = 0;
1029
out:
1030
mutex_unlock(&smp_cpu_state_mutex);
1031
put_online_cpus();
1032
if (!cpumask_empty(&newcpus))
1033
topology_schedule_update();
1034
return rc;
1035
}
1036
1037
static ssize_t __ref rescan_store(struct sysdev_class *class,
1038
struct sysdev_class_attribute *attr,
1039
const char *buf,
1040
size_t count)
1041
{
1042
int rc;
1043
1044
rc = smp_rescan_cpus();
1045
return rc ? rc : count;
1046
}
1047
static SYSDEV_CLASS_ATTR(rescan, 0200, NULL, rescan_store);
1048
#endif /* CONFIG_HOTPLUG_CPU */
1049
1050
static ssize_t dispatching_show(struct sysdev_class *class,
1051
struct sysdev_class_attribute *attr,
1052
char *buf)
1053
{
1054
ssize_t count;
1055
1056
mutex_lock(&smp_cpu_state_mutex);
1057
count = sprintf(buf, "%d\n", cpu_management);
1058
mutex_unlock(&smp_cpu_state_mutex);
1059
return count;
1060
}
1061
1062
static ssize_t dispatching_store(struct sysdev_class *dev,
1063
struct sysdev_class_attribute *attr,
1064
const char *buf,
1065
size_t count)
1066
{
1067
int val, rc;
1068
char delim;
1069
1070
if (sscanf(buf, "%d %c", &val, &delim) != 1)
1071
return -EINVAL;
1072
if (val != 0 && val != 1)
1073
return -EINVAL;
1074
rc = 0;
1075
get_online_cpus();
1076
mutex_lock(&smp_cpu_state_mutex);
1077
if (cpu_management == val)
1078
goto out;
1079
rc = topology_set_cpu_management(val);
1080
if (!rc)
1081
cpu_management = val;
1082
out:
1083
mutex_unlock(&smp_cpu_state_mutex);
1084
put_online_cpus();
1085
return rc ? rc : count;
1086
}
1087
static SYSDEV_CLASS_ATTR(dispatching, 0644, dispatching_show,
1088
dispatching_store);
1089
1090
static int __init topology_init(void)
1091
{
1092
int cpu;
1093
int rc;
1094
1095
register_cpu_notifier(&smp_cpu_nb);
1096
1097
#ifdef CONFIG_HOTPLUG_CPU
1098
rc = sysdev_class_create_file(&cpu_sysdev_class, &attr_rescan);
1099
if (rc)
1100
return rc;
1101
#endif
1102
rc = sysdev_class_create_file(&cpu_sysdev_class, &attr_dispatching);
1103
if (rc)
1104
return rc;
1105
for_each_present_cpu(cpu) {
1106
rc = smp_add_present_cpu(cpu);
1107
if (rc)
1108
return rc;
1109
}
1110
return 0;
1111
}
1112
subsys_initcall(topology_init);
1113
1114