Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1571914 > unrolled thread

[PATCH v3 0/4] sparc64: Jump to boot prom from console on panic

Started byVijay Kumar <vijay.ac.kumar@oracle.com>
First post2017-02-01 20:40 +0100
Last post2017-02-01 22:30 +0100
Articles 6 — 2 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH v3 0/4] sparc64: Jump to boot prom from console on panic Vijay Kumar <vijay.ac.kumar@oracle.com> - 2017-02-01 20:40 +0100
    [PATCH v3 1/4] sparc64: Set cpu state to offline when stopped Vijay Kumar <vijay.ac.kumar@oracle.com> - 2017-02-01 20:40 +0100
    [PATCH v3 2/4] sparc64: Migrate hvcons irq to panicked cpu Vijay Kumar <vijay.ac.kumar@oracle.com> - 2017-02-01 20:40 +0100
    [PATCH v3 3/4] sparc64: Send break twice from console to return to boot prom Vijay Kumar <vijay.ac.kumar@oracle.com> - 2017-02-01 20:40 +0100
    Re: [PATCH v3 0/4] sparc64: Jump to boot prom from console on panic David Miller <davem@davemloft.net> - 2017-02-01 21:00 +0100
      Re: [PATCH v3 0/4] sparc64: Jump to boot prom from console on panic Vijay Kumar <vijay.ac.kumar@oracle.com> - 2017-02-01 22:30 +0100

#1571914 — [PATCH v3 0/4] sparc64: Jump to boot prom from console on panic

FromVijay Kumar <vijay.ac.kumar@oracle.com>
Date2017-02-01 20:40 +0100
Subject[PATCH v3 0/4] sparc64: Jump to boot prom from console on panic
Message-ID<t68V3-1B8-3@gated-at.bofh.it>
V3 changes:
  - patch 02/04: Added SERIAL_SUNHV conditional group for
    sunhv_migrate_hvcons_irq in smp_send_stop().
V2 changes:
 -  Added cover letter patch

Hi,

Currently Stop-A (L1A) does not make the kernel switch to OBP on panic. This
patchset addresses this issue. Also, now we can cause a jump to OBP by sending
'break' twice from sunhv console. On bare metal, one can send a break by
typing Esc + 'B' + Sysrq (or whatever). On LDOM, press Ctrl + ] in telnet,
and then "send break" at the telnet prompt.

Thanks.

      sparc64: Set cpu state to offline when stopped
      sparc64: Migrate hvcons irq to panicked cpu
      sparc64: Send break twice from console to return to boot prom
      Documentation/sparc: Steps for sending break on sunhv console

 Documentation/sparc/console.txt |    9 +++++++++
 arch/sparc/include/asm/setup.h  |    1 +
 arch/sparc/kernel/smp_64.c      |    9 ++++++++-
 drivers/tty/serial/sunhv.c      |   12 +++++++++++-
 kernel/panic.c                  |    3 ++-
 5 files changed, 31 insertions(+), 3 deletions(-)
 create mode 100644 Documentation/sparc/console.txt



--
1.7.1

[toc] | [next] | [standalone]


#1571917 — [PATCH v3 1/4] sparc64: Set cpu state to offline when stopped

FromVijay Kumar <vijay.ac.kumar@oracle.com>
Date2017-02-01 20:40 +0100
Subject[PATCH v3 1/4] sparc64: Set cpu state to offline when stopped
Message-ID<t68V3-1B8-13@gated-at.bofh.it>
In reply to#1571914
CPU needs to be marked offline before stopping it. When not marked
offline, the xcall receives HV_EWOULDBLOCK and so assumes that not all
CPUs received the message, and retries. After 10000 retries, it finally
fails with fatal mondo timeout.

Signed-off-by: Vijay Kumar <vijay.ac.kumar@oracle.com>
---
 arch/sparc/kernel/smp_64.c |    3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)

diff --git a/arch/sparc/kernel/smp_64.c b/arch/sparc/kernel/smp_64.c
index 0ce347f..712bf1b 100644
--- a/arch/sparc/kernel/smp_64.c
+++ b/arch/sparc/kernel/smp_64.c
@@ -1443,6 +1443,7 @@ void __irq_entry smp_receive_signal_client(int irq, struct pt_regs *regs)
 
 static void stop_this_cpu(void *dummy)
 {
+	set_cpu_online(smp_processor_id(), false);
 	prom_stopself();
 }
 
@@ -1454,6 +1455,8 @@ void smp_send_stop(void)
 		for_each_online_cpu(cpu) {
 			if (cpu == smp_processor_id())
 				continue;
+
+			set_cpu_online(cpu, false);
 #ifdef CONFIG_SUN_LDOMS
 			if (ldom_domaining_enabled) {
 				unsigned long hv_err;
-- 
1.7.1

[toc] | [prev] | [next] | [standalone]


#1571918 — [PATCH v3 2/4] sparc64: Migrate hvcons irq to panicked cpu

FromVijay Kumar <vijay.ac.kumar@oracle.com>
Date2017-02-01 20:40 +0100
Subject[PATCH v3 2/4] sparc64: Migrate hvcons irq to panicked cpu
Message-ID<t68V3-1B8-15@gated-at.bofh.it>
In reply to#1571914
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>
---
v2->v3: Added SERIAL_SUNHV conditional group for
        sunhv_migrate_hvcons_irq().
---
 arch/sparc/include/asm/setup.h |    5 ++++-
 arch/sparc/kernel/smp_64.c     |    6 +++++-
 drivers/tty/serial/sunhv.c     |    6 ++++++
 3 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/arch/sparc/include/asm/setup.h b/arch/sparc/include/asm/setup.h
index 29d64b1..478bf6b 100644
--- a/arch/sparc/include/asm/setup.h
+++ b/arch/sparc/include/asm/setup.h
@@ -59,8 +59,11 @@ static inline int con_is_present(void)
 extern atomic_t dcpage_flushes_xcall;
 
 extern int sysctl_tsb_ratio;
-#endif
 
+#ifdef CONFIG_SERIAL_SUNHV
+void sunhv_migrate_hvcons_irq(int cpu);
+#endif
+#endif
 void sun_do_break(void);
 extern int stop_a_enabled;
 extern int scons_pwroff;
diff --git a/arch/sparc/kernel/smp_64.c b/arch/sparc/kernel/smp_64.c
index 712bf1b..90a02cb 100644
--- a/arch/sparc/kernel/smp_64.c
+++ b/arch/sparc/kernel/smp_64.c
@@ -1452,8 +1452,12 @@ void smp_send_stop(void)
 	int cpu;
 
 	if (tlb_type == hypervisor) {
+		int this_cpu = smp_processor_id();
+#ifdef CONFIG_SERIAL_SUNHV
+		sunhv_migrate_hvcons_irq(this_cpu);
+#endif
 		for_each_online_cpu(cpu) {
-			if (cpu == smp_processor_id())
+			if (cpu == this_cpu)
 				continue;
 
 			set_cpu_online(cpu, false);
diff --git a/drivers/tty/serial/sunhv.c b/drivers/tty/serial/sunhv.c
index 99ef5c6..039ae05 100644
--- a/drivers/tty/serial/sunhv.c
+++ b/drivers/tty/serial/sunhv.c
@@ -398,6 +398,12 @@ static int sunhv_verify_port(struct uart_port *port, struct serial_struct *ser)
 
 static struct uart_port *sunhv_port;
 
+void sunhv_migrate_hvcons_irq(int cpu)
+{
+	/* Migrate hvcons irq to param cpu */
+	irq_force_affinity(sunhv_port->irq, cpumask_of(cpu));
+}
+
 /* Copy 's' into the con_write_page, decoding "\n" into
  * "\r\n" along the way.  We have to return two lengths
  * because the caller needs to know how much to advance
-- 
1.7.1

[toc] | [prev] | [next] | [standalone]


#1571919 — [PATCH v3 3/4] sparc64: Send break twice from console to return to boot prom

FromVijay Kumar <vijay.ac.kumar@oracle.com>
Date2017-02-01 20:40 +0100
Subject[PATCH v3 3/4] sparc64: Send break twice from console to return to boot prom
Message-ID<t68V3-1B8-19@gated-at.bofh.it>
In reply to#1571914
Now we can also jump to boot prom from sunhv console by sending
break twice on console for both running and panicked kernel
cases.

Signed-off-by: Vijay Kumar <vijay.ac.kumar@oracle.com>
---
 drivers/tty/serial/sunhv.c |    6 +++++-
 kernel/panic.c             |    3 ++-
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/drivers/tty/serial/sunhv.c b/drivers/tty/serial/sunhv.c
index 039ae05..8975d9c 100644
--- a/drivers/tty/serial/sunhv.c
+++ b/drivers/tty/serial/sunhv.c
@@ -116,7 +116,7 @@ static int receive_chars_getchar(struct uart_port *port)
 
 static int receive_chars_read(struct uart_port *port)
 {
-	int saw_console_brk = 0;
+	static int saw_console_brk;
 	int limit = 10000;
 
 	while (limit-- > 0) {
@@ -128,6 +128,9 @@ static int receive_chars_read(struct uart_port *port)
 			bytes_read = 0;
 
 			if (stat == CON_BREAK) {
+				if (saw_console_brk)
+					sun_do_break();
+
 				if (uart_handle_break(port))
 					continue;
 				saw_console_brk = 1;
@@ -151,6 +154,7 @@ static int receive_chars_read(struct uart_port *port)
 		if (port->sysrq != 0 &&  *con_read_page) {
 			for (i = 0; i < bytes_read; i++)
 				uart_handle_sysrq_char(port, con_read_page[i]);
+			saw_console_brk = 0;
 		}
 
 		if (port->state == NULL)
diff --git a/kernel/panic.c b/kernel/panic.c
index 08aa88d..70f799d 100644
--- a/kernel/panic.c
+++ b/kernel/panic.c
@@ -273,7 +273,8 @@ void panic(const char *fmt, ...)
 		extern int stop_a_enabled;
 		/* Make sure the user can actually press Stop-A (L1-A) */
 		stop_a_enabled = 1;
-		pr_emerg("Press Stop-A (L1-A) to return to the boot prom\n");
+		pr_emerg("Press Stop-A (L1-A) from sun keyboard or send break\n"
+			 "twice on console to return to the boot prom\n");
 	}
 #endif
 #if defined(CONFIG_S390)
-- 
1.7.1

[toc] | [prev] | [next] | [standalone]


#1571934

FromDavid Miller <davem@davemloft.net>
Date2017-02-01 21:00 +0100
Message-ID<t69eq-1O3-27@gated-at.bofh.it>
In reply to#1571914
From: Vijay Kumar <vijay.ac.kumar@oracle.com>
Date: Wed,  1 Feb 2017 11:34:36 -0800

> Currently Stop-A (L1A) does not make the kernel switch to OBP on panic.

This is intentional, the kernel prints a message telling the user to
press break (L1-A) if they want to drop out of the kernel and we force
the break to be allowed by setting stop_a_enabled.

I'm wondering why there is so much effort being directed into BRK
behavior.

If you want to break into the OK prompt, have the reboot-cmd
environment variable set appropriately, and simply hit BRK and it will
work in both ldom and non-ldom environments.

[toc] | [prev] | [next] | [standalone]


#1571991

FromVijay Kumar <vijay.ac.kumar@oracle.com>
Date2017-02-01 22:30 +0100
Message-ID<t6aDw-30T-31@gated-at.bofh.it>
In reply to#1571934
On 2/1/2017 1:50 PM, David Miller wrote:
> From: Vijay Kumar <vijay.ac.kumar@oracle.com>
> Date: Wed,  1 Feb 2017 11:34:36 -0800
>
>> Currently Stop-A (L1A) does not make the kernel switch to OBP on panic.
> This is intentional, the kernel prints a message telling the user to
> press break (L1-A) if they want to drop out of the kernel and we force
> the break to be allowed by setting stop_a_enabled.
The problem is that pressing BRK after panic does not drop to OK prompt 
(when
stop_a_enabled is set).  So the kernel message to press Stop-A to return 
to boot
prom is  misleading in this case.
> I'm wondering why there is so much effort being directed into BRK
> behavior.
User can drop into ok prompt from the running kernel and as well as from the
panicked kernel. Pressing single break to jump to ok prompt conflicts with
sysrq key combination (from console, BRK + sysrq_key). To be consistent
across both the cases,  user will have to send BRK twice in order to drop to
ok prompt.  Does this sound reasonable?
>
> If you want to break into the OK prompt, have the reboot-cmd
> environment variable set appropriately, and simply hit BRK and it will
> work in both ldom and non-ldom environments.
Kernel does not print message "Press Stop-A (L1-A) to ..." for the case 
when it is
expected to reboot on panic. Rather, it goes through different path in 
panic() when
kernel.panic is _not_ set to 0. Here, patch is addressing the case when
kernel.panic=0 (i.e not to reboot on panic).

Thanks,
Vijay

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web