[PATCH v2] riscv: Using printk directly in __show_regs

Kefeng Wang wangkefeng.wang at huawei.com
Mon Dec 14 06:49:08 EST 2020


On 2020/12/11 16:48, John Ogness wrote:
> On 2020-12-10, Palmer Dabbelt <palmerdabbelt at google.com> wrote:
>> On Thu, 26 Nov 2020 05:33:38 PST (-0800), wangkefeng.wang at huawei.com wrote:
>>> Covert bulk of pr_cont("...\n") to separate printk calls.
>>>
>>> Note that a pr_cont() message with a trailing newline will
>>> "terminate" the continous line so that it can no longer be
>>> continued, also it is possible to sort out simultaneous dumps
>>> from multiple CPUs with CONFIG_PRINTK_CALLER enabled.
>>>
>>> And align the printing formats.
>>>
>>> Suggested-by: John Ogness <john.ogness at linutronix.de>
>>> Signed-off-by: Kefeng Wang <wangkefeng.wang at huawei.com>
>>> ---
>>>   arch/riscv/kernel/process.c | 24 ++++++++++++------------
>>>   1 file changed, 12 insertions(+), 12 deletions(-)
>>>
>>> diff --git a/arch/riscv/kernel/process.c b/arch/riscv/kernel/process.c
>>> index e41b733abeaa..2119d49feea5 100644
>>> --- a/arch/riscv/kernel/process.c
>>> +++ b/arch/riscv/kernel/process.c
>>> @@ -44,30 +44,30 @@ void __show_regs(struct pt_regs *regs)
>>>   {
>>>   	show_regs_print_info(KERN_DEFAULT);
>>>
>>> -	pr_cont("epc: " REG_FMT " ra : " REG_FMT " sp : " REG_FMT "\n",
>>> +	printk("epc: " REG_FMT " ra : " REG_FMT " sp : " REG_FMT "\n",
>>>   		regs->epc, regs->ra, regs->sp);
>>> -	pr_cont(" gp : " REG_FMT " tp : " REG_FMT " t0 : " REG_FMT "\n",
>>> +	printk("gp : " REG_FMT " tp : " REG_FMT " t0 : " REG_FMT "\n",
>>>   		regs->gp, regs->tp, regs->t0);
>>> -	pr_cont(" t1 : " REG_FMT " t2 : " REG_FMT " s0 : " REG_FMT "\n",
>>> +	printk("t1 : " REG_FMT " t2 : " REG_FMT " s0 : " REG_FMT "\n",
>>>   		regs->t1, regs->t2, regs->s0);
>>> -	pr_cont(" s1 : " REG_FMT " a0 : " REG_FMT " a1 : " REG_FMT "\n",
>>> +	printk("s1 : " REG_FMT " a0 : " REG_FMT " a1 : " REG_FMT "\n",
>>>   		regs->s1, regs->a0, regs->a1);
>>> -	pr_cont(" a2 : " REG_FMT " a3 : " REG_FMT " a4 : " REG_FMT "\n",
>>> +	printk("a2 : " REG_FMT " a3 : " REG_FMT " a4 : " REG_FMT "\n",
>>>   		regs->a2, regs->a3, regs->a4);
>>> -	pr_cont(" a5 : " REG_FMT " a6 : " REG_FMT " a7 : " REG_FMT "\n",
>>> +	printk("a5 : " REG_FMT " a6 : " REG_FMT " a7 : " REG_FMT "\n",
>>>   		regs->a5, regs->a6, regs->a7);
>>> -	pr_cont(" s2 : " REG_FMT " s3 : " REG_FMT " s4 : " REG_FMT "\n",
>>> +	printk("s2 : " REG_FMT " s3 : " REG_FMT " s4 : " REG_FMT "\n",
>>>   		regs->s2, regs->s3, regs->s4);
>>> -	pr_cont(" s5 : " REG_FMT " s6 : " REG_FMT " s7 : " REG_FMT "\n",
>>> +	printk("s5 : " REG_FMT " s6 : " REG_FMT " s7 : " REG_FMT "\n",
>>>   		regs->s5, regs->s6, regs->s7);
>>> -	pr_cont(" s8 : " REG_FMT " s9 : " REG_FMT " s10: " REG_FMT "\n",
>>> +	printk("s8 : " REG_FMT " s9 : " REG_FMT " s10: " REG_FMT "\n",
>>>   		regs->s8, regs->s9, regs->s10);
>>> -	pr_cont(" s11: " REG_FMT " t3 : " REG_FMT " t4 : " REG_FMT "\n",
>>> +	printk("s11: " REG_FMT " t3 : " REG_FMT " t4 : " REG_FMT "\n",
>>>   		regs->s11, regs->t3, regs->t4);
>>> -	pr_cont(" t5 : " REG_FMT " t6 : " REG_FMT "\n",
>>> +	printk("t5 : " REG_FMT " t6 : " REG_FMT "\n",
>>>   		regs->t5, regs->t6);
>>>
>>> -	pr_cont("status: " REG_FMT " badaddr: " REG_FMT " cause: " REG_FMT "\n",
>>> +	printk("status: " REG_FMT " badaddr: " REG_FMT " cause: " REG_FMT "\n",
>>>   		regs->status, regs->badaddr, regs->cause);
>>>   }
>>>   void show_regs(struct pt_regs *regs)
>> For some reason I remember having these as printk()s originally, but I
>> don't see that in the git history so maybe it was from before we
>> merged the port?  I don't really understand the difference here, and I
>> thought using printk() directly wasn't recommended?

The original reason which I changed to printk is the strange out-print, 
see v1 patch [1],

but it's found that there is a regression in v5.10 printk rework, and 
being fixed by commit

4ad9921af4f1 ("printk: finalize records with trailing newlines").

The v2 patch major change is align the printing (not a big change) and 
in case of rearrangement of

print when CONFIG_PRINTK_CALLER enabled

[1] 
https://patchwork.kernel.org/project/linux-riscv/patch/20201124112054.106960-2-wangkefeng.wang@huawei.com/


> There no difference between:
>
>     pr_cont("...\n");
>        and
>     printk("...\n");
>
> except for the very first call, which will try to continue from whatever
> was printed before. (But even that only makes a difference if the
> previous call did not have a newline at the end.)
>
> Note that the printk() being used does not specify the loglevel. Perhaps
> it is intentional that the default loglevel (which can be specified by
> the user) is used? Otherwise, if a particular loglevel _is_ desired,
> then the appropriate pr_info/pr_warn/... should be used.
>
> Also, this patch is also sneaking in some formatting changes. Previously
> the columns were not aligned correctly. That spacing is also fixed
> here. The spacing change _is_ a real improvement.
>
> John Ogness
> .
>



More information about the linux-riscv mailing list