aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVijay Kumar <vijay.ac.kumar@oracle.com>2017-02-01 14:34:38 -0500
committerDavid S. Miller <davem@davemloft.net>2017-02-23 11:27:24 -0500
commit7dd4fcf5b70694dc961eb6b954673e4fc9730dbd (patch)
tree4209465c2da178199e233f2f4600a36458b57047
parentcffb3e76818fee4763a2ce5f2b1eca2d7885e2cf (diff)
sparc64: Migrate hvcons irq to panicked cpu
On panic, all other CPUs are stopped except the one which had hit panic. To keep console alive, we need to migrate hvcons irq to panicked CPU. Signed-off-by: Vijay Kumar <vijay.ac.kumar@oracle.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--arch/sparc/include/asm/setup.h5
-rw-r--r--arch/sparc/kernel/smp_64.c6
-rw-r--r--drivers/tty/serial/sunhv.c6
3 files changed, 15 insertions, 2 deletions
diff --git a/arch/sparc/include/asm/setup.h b/arch/sparc/include/asm/setup.h
index 29d64b1758ed..478bf6bb4598 100644
--- a/arch/sparc/include/asm/setup.h
+++ b/arch/sparc/include/asm/setup.h
@@ -59,8 +59,11 @@ extern atomic_t dcpage_flushes;
59extern atomic_t dcpage_flushes_xcall; 59extern atomic_t dcpage_flushes_xcall;
60 60
61extern int sysctl_tsb_ratio; 61extern int sysctl_tsb_ratio;
62#endif
63 62
63#ifdef CONFIG_SERIAL_SUNHV
64void sunhv_migrate_hvcons_irq(int cpu);
65#endif
66#endif
64void sun_do_break(void); 67void sun_do_break(void);
65extern int stop_a_enabled; 68extern int stop_a_enabled;
66extern int scons_pwroff; 69extern int scons_pwroff;
diff --git a/arch/sparc/kernel/smp_64.c b/arch/sparc/kernel/smp_64.c
index 712bf1b7f630..90a02cb64e20 100644
--- a/arch/sparc/kernel/smp_64.c
+++ b/arch/sparc/kernel/smp_64.c
@@ -1452,8 +1452,12 @@ void smp_send_stop(void)
1452 int cpu; 1452 int cpu;
1453 1453
1454 if (tlb_type == hypervisor) { 1454 if (tlb_type == hypervisor) {
1455 int this_cpu = smp_processor_id();
1456#ifdef CONFIG_SERIAL_SUNHV
1457 sunhv_migrate_hvcons_irq(this_cpu);
1458#endif
1455 for_each_online_cpu(cpu) { 1459 for_each_online_cpu(cpu) {
1456 if (cpu == smp_processor_id()) 1460 if (cpu == this_cpu)
1457 continue; 1461 continue;
1458 1462
1459 set_cpu_online(cpu, false); 1463 set_cpu_online(cpu, false);
diff --git a/drivers/tty/serial/sunhv.c b/drivers/tty/serial/sunhv.c
index 73abd89c0108..c5ebdc8bed6a 100644
--- a/drivers/tty/serial/sunhv.c
+++ b/drivers/tty/serial/sunhv.c
@@ -398,6 +398,12 @@ static struct uart_driver sunhv_reg = {
398 398
399static struct uart_port *sunhv_port; 399static struct uart_port *sunhv_port;
400 400
401void sunhv_migrate_hvcons_irq(int cpu)
402{
403 /* Migrate hvcons irq to param cpu */
404 irq_force_affinity(sunhv_port->irq, cpumask_of(cpu));
405}
406
401/* Copy 's' into the con_write_page, decoding "\n" into 407/* Copy 's' into the con_write_page, decoding "\n" into
402 * "\r\n" along the way. We have to return two lengths 408 * "\r\n" along the way. We have to return two lengths
403 * because the caller needs to know how much to advance 409 * because the caller needs to know how much to advance