diff options
Diffstat (limited to 'arch/arm/kernel/smp.c')
-rw-r--r-- | arch/arm/kernel/smp.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index 72024ea8a3a6..7d80a549cae5 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c | |||
@@ -66,6 +66,7 @@ enum ipi_msg_type { | |||
66 | IPI_CALL_FUNC, | 66 | IPI_CALL_FUNC, |
67 | IPI_CALL_FUNC_SINGLE, | 67 | IPI_CALL_FUNC_SINGLE, |
68 | IPI_CPU_STOP, | 68 | IPI_CPU_STOP, |
69 | IPI_COMPLETION, | ||
69 | }; | 70 | }; |
70 | 71 | ||
71 | static DECLARE_COMPLETION(cpu_running); | 72 | static DECLARE_COMPLETION(cpu_running); |
@@ -456,6 +457,7 @@ static const char *ipi_types[NR_IPI] = { | |||
456 | S(IPI_CALL_FUNC, "Function call interrupts"), | 457 | S(IPI_CALL_FUNC, "Function call interrupts"), |
457 | S(IPI_CALL_FUNC_SINGLE, "Single function call interrupts"), | 458 | S(IPI_CALL_FUNC_SINGLE, "Single function call interrupts"), |
458 | S(IPI_CPU_STOP, "CPU stop interrupts"), | 459 | S(IPI_CPU_STOP, "CPU stop interrupts"), |
460 | S(IPI_COMPLETION, "completion interrupts"), | ||
459 | }; | 461 | }; |
460 | 462 | ||
461 | void show_ipi_list(struct seq_file *p, int prec) | 463 | void show_ipi_list(struct seq_file *p, int prec) |
@@ -515,6 +517,19 @@ static void ipi_cpu_stop(unsigned int cpu) | |||
515 | cpu_relax(); | 517 | cpu_relax(); |
516 | } | 518 | } |
517 | 519 | ||
520 | static DEFINE_PER_CPU(struct completion *, cpu_completion); | ||
521 | |||
522 | int register_ipi_completion(struct completion *completion, int cpu) | ||
523 | { | ||
524 | per_cpu(cpu_completion, cpu) = completion; | ||
525 | return IPI_COMPLETION; | ||
526 | } | ||
527 | |||
528 | static void ipi_complete(unsigned int cpu) | ||
529 | { | ||
530 | complete(per_cpu(cpu_completion, cpu)); | ||
531 | } | ||
532 | |||
518 | /* | 533 | /* |
519 | * Main handler for inter-processor interrupts | 534 | * Main handler for inter-processor interrupts |
520 | */ | 535 | */ |
@@ -565,6 +580,12 @@ void handle_IPI(int ipinr, struct pt_regs *regs) | |||
565 | irq_exit(); | 580 | irq_exit(); |
566 | break; | 581 | break; |
567 | 582 | ||
583 | case IPI_COMPLETION: | ||
584 | irq_enter(); | ||
585 | ipi_complete(cpu); | ||
586 | irq_exit(); | ||
587 | break; | ||
588 | |||
568 | default: | 589 | default: |
569 | printk(KERN_CRIT "CPU%u: Unknown IPI message 0x%x\n", | 590 | printk(KERN_CRIT "CPU%u: Unknown IPI message 0x%x\n", |
570 | cpu, ipinr); | 591 | cpu, ipinr); |