Re: [PATCH] earlyprintk: re-enable earlyprintk calling early_param

From: Sahara
Date: Sun Aug 31 2014 - 22:29:30 EST




On Fri, 29 Aug 2014, Stephen Warren wrote:

On 08/28/2014 11:28 PM, Sahara wrote:


On Wed, 27 Aug 2014, Thierry Reding wrote:

On Thu, Aug 14, 2014 at 07:13:36PM +0900, kpark3469@xxxxxxxxx wrote:
From: Sahara <keun-o.park@xxxxxxxxxxxxx>

Although there are many obs_kernel_param and its names are
earlyprintk and also EARLY_PRINTK is also enabled, we could not
see the early_printk output properly until now. This patch
considers earlycon as well as earlyprintk.

Signed-off-by: Sahara <keun-o.park@xxxxxxxxxxxxx>
---
init/main.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/init/main.c b/init/main.c
index bb1aed9..235d248 100644
--- a/init/main.c
+++ b/init/main.c
@@ -426,7 +426,8 @@ static int __init do_early_param(char *param, char
*val, const char *unused)
for (p = __setup_start; p < __setup_end; p++) {
if ((p->early && parameq(param, p->str)) ||
(strcmp(param, "console") == 0 &&
- strcmp(p->str, "earlycon") == 0)
+ ((strcmp(p->str, "earlycon") == 0) ||
+ (strcmp(p->str, "earlyprintk") == 0)))
) {
if (p->setup_func(val) != 0)
pr_warn("Malformed early option '%s'\n",
param);

It seems like this patch causes the following warning for me during
boot:

[ 0.000000] Booting Linux on physical CPU 0x0
[ 0.000000] Initializing cgroup subsys cpu
[ 0.000000] Initializing cgroup subsys cpuacct
[ 0.000000] Linux version 3.17.0-rc2-next-20140827
(thierry.reding@ulmo) (gcc version 4.9.0 (GCC) ) #18 SMP PREEMPT Wed Aug
27 17:08:12 CEST 2014
[ 0.000000] CPU: ARMv7 Processor [413fc0f3] revision 3 (ARMv7),
cr=10c5387d
[ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, PIPT instruction
cache
[ 0.000000] Machine model: NVIDIA Tegra124 Jetson TK1
[ 0.000000] bootconsole [earlycon0] enabled
[ 0.000000] debug: ignoring loglevel setting.
[ 0.000000] ------------[ cut here ]------------
[ 0.000000] WARNING: CPU: 0 PID: 0 at
/home/thierry.reding/src/kernel/linux-work.git/kernel/printk/printk.c:2402
register_console+0x60/0x37c()
[ 0.000000] console 'earlycon0' already registered
[ 0.000000] Modules linked in:
[ 0.000000] CPU: 0 PID: 0 Comm: swapper Not tainted
3.17.0-rc2-next-20140827 #18
[ 0.000000] [<c0015fec>] (unwind_backtrace) from [<c0011aac>]
(show_stack+0x10/0x14)
[ 0.000000] [<c0011aac>] (show_stack) from [<c062b700>]
(dump_stack+0x98/0xd8)
[ 0.000000] [<c062b700>] (dump_stack) from [<c0025ba0>]
(warn_slowpath_common+0x70/0x8c)
[ 0.000000] [<c0025ba0>] (warn_slowpath_common) from [<c0025bec>]
(warn_slowpath_fmt+0x30/0x40)
[ 0.000000] [<c0025bec>] (warn_slowpath_fmt) from [<c00639b8>]
(register_console+0x60/0x37c)
[ 0.000000] [<c00639b8>] (register_console) from [<c0883870>]
(setup_early_printk+0x20/0x28)
[ 0.000000] [<c0883870>] (setup_early_printk) from [<c087f43c>]
(do_early_param+0x6c/0xd0)
[ 0.000000] [<c087f43c>] (do_early_param) from [<c003cba0>]
(parse_args+0x238/0x3d0)
[ 0.000000] [<c003cba0>] (parse_args) from [<c087f814>]
(parse_early_options+0x38/0x40)
[ 0.000000] [<c087f814>] (parse_early_options) from [<c087f84c>]
(parse_early_param+0x30/0x40)
[ 0.000000] [<c087f84c>] (parse_early_param) from [<c088206c>]
(setup_arch+0x4b4/0x974)
[ 0.000000] [<c088206c>] (setup_arch) from [<c087f8f8>]
(start_kernel+0x98/0x3a8)
[ 0.000000] [<c087f8f8>] (start_kernel) from [<80008074>]
(0x80008074)
[ 0.000000] ---[ end trace cb88537fdc8fa200 ]---
[ 0.000000] cma: Reserved 128 MiB at a7800000
[ 0.000000] Memory policy: Data cache writealloc
[ 0.000000] On node 0 totalpages: 524032
[ 0.000000] free_area_init_node: node 0, pgdat c091cc00, node_mem_map
e67b7000
[ 0.000000] Normal zone: 1520 pages used for memmap
[ 0.000000] Normal zone: 0 pages reserved
[ 0.000000] Normal zone: 194560 pages, LIFO batch:31
[ 0.000000] HighMem zone: 2574 pages used for memmap
[ 0.000000] HighMem zone: 329472 pages, LIFO batch:31
[ 0.000000] PERCPU: Embedded 8 pages/cpu @e6767000 s8832 r8192 d15744
u32768
[ 0.000000] pcpu-alloc: s8832 r8192 d15744 u32768 alloc=8*4096
[ 0.000000] pcpu-alloc: [0] 0 [0] 1 [0] 2 [0] 3
[ 0.000000] Built 1 zonelists in Zone order, mobility grouping on.
Total pages: 522512
[ 0.000000] Kernel command line: console=ttyS0,115200n8
ignore_loglevel rootwait ro earlyprintk ip=:::::eth0:dhcp root=/dev/nfs
nfsroot=192.168.69.100:/srv/nfs/tegra124 drm.debug=0xf cma=128M

Reverting the patch eliminates the warning. earlyprintk does work fine
for me without this patch.

Thierry


This warning message is caused by specifying 'earlyprintk' in
your command line args. Same problem may happen if you specify 'earlycon'
in your command line args and enable CONFIG_SERIAL_EARLYCON with
the current code without this patch. I think it's appropriate result
letting a developer know that both ways of using earlyprintk are enabled.
With current code, although a developer enables CONFIG_EARLY_PRINTK and
has "console=" arg in command line args, he/she should specify the
'earlyprintk' in command line args also to see early_printk() outputs.
With this patch, simply enabling CONFIG_EARLY_PRINTK and having 'console='
line make you be able to the early_printk().

Nonetheless I want to retract this patch. It's good for ARM, but not good
for other architectures such as x86. And, because CONFIG_EARLY_PRINTK is
depending on DEBUG_LL in ARM, making a relation with "console=" is absurd.
(see strcmp(param, "console") == 0 && strcmp(p->str, "earlyprintk") == 0)

Even on ARM, this patch feels like the wrong thing. After all, I can build a DEBUG_LL enabled multi-platform kernel, and boot it on a bunch of different SoCs. However, earlyprintk will only work on one (or zero) of those SoCs, and hence shouldn't automatically enable itself; specifically requesting activation using the earlyprintk kernel command-line parameter is the correct approach.


So you are saying, because DEBUG_LL didn't work on several SoCs, using the
earlyprintk in command line args is the correct approach?
You are misunderstanding how it works. On ARM with enabling multi-platform
kernel, you should choose a specific low-level debug port for DEBUG_LL.
For example, if you have OMAP ZOOM3, you should select
CONFIG_DEBUG_ZOOM_UART from menu.
If you chose a right port for your SoCs and if it didn't work properly,
that means its port code should be fixed. (Please report it.)
All the code for low-level debugging is located at arch/arm/include/debug.

- Sahara
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/