Received: by 2002:ac0:a582:0:0:0:0:0 with SMTP id m2-v6csp1762543imm; Sat, 6 Oct 2018 09:51:50 -0700 (PDT) X-Google-Smtp-Source: ACcGV61FkGQGolkwniQZsNI0g9PCsFq9wpb36M56IE83H+hONg5yj9CgY4peM4TqmXdBGq4BTYK7 X-Received: by 2002:a17:902:bd06:: with SMTP id p6-v6mr16353283pls.226.1538844710629; Sat, 06 Oct 2018 09:51:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1538844710; cv=none; d=google.com; s=arc-20160816; b=P4HpDMoyykDpe33u4bhFpHwdc7NeuAWhu+zOxjz3bZ1y/EYLBotD1EmFWt1+8UF7gv KXKbX+Dh2swz85B2B23ScBj2APqlntkbgjD/TQdIj7EzTLaVvUqsZH/VcYG20EMJgrcl g80KlO5or5QhaUNjd7yojjuyiVI72hP4MHUwinUEsstZ7Ygl07dcjdRteCDpPFpJvqwZ 78evJ+Xq+j9AtdRBrhiu4qwXfEJkNlohtX5mD5eP/HbXR1wf//IbJlAOt6WPwJaLLGQu 542ddT4/97KHsyu0EgqKJB2lCpNL/BVDD5K5BeYnlNz0Dj57D9Apnsv7trlyK0o5BeLe 9y4g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:date:cc:to:subject:from:references :in-reply-to:message-id; bh=z/wBSATzesr2K58Vpd4M4QBBHZT8NuKIFGnRDaBBE/E=; b=edp7t08zmDkCnFvPyFcMfGAnOABueDBZEVfmA2h/MZmuOXzzoVhqsberF4Rt655HTM ga5CMNPaCsRgTzR3lNgmL8c016mc/NzvOnTMyv5WhhgUWYUw0/Neq/0NCOSgTxMkD3Na 81s1b3CpezcUEUk7q65mtrxw0+VqdKo+pGyxK3ZebqjEVNwnFcc9Q0p2wkGB6dTHdSoz fOrgmXM6K2fFgca5ck+wz1vkO+NmdIHGm18/RSkPcAU/lyYR3qei8jJs1lEitixbDbno ify0Aw3lQGX9/i8mA1AzXnJuPJBUd0WV3e8BKfGQtdfFKuTBUklhFNHQbTJagipCpXjc lCIw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id y27-v6si11944873pgc.197.2018.10.06.09.51.35; Sat, 06 Oct 2018 09:51:50 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727956AbeJFXzU (ORCPT + 99 others); Sat, 6 Oct 2018 19:55:20 -0400 Received: from pegase1.c-s.fr ([93.17.236.30]:62909 "EHLO pegase1.c-s.fr" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727762AbeJFXzT (ORCPT ); Sat, 6 Oct 2018 19:55:19 -0400 Received: from localhost (mailhub1-int [192.168.12.234]) by localhost (Postfix) with ESMTP id 42SCLh26NXz9ttCD; Sat, 6 Oct 2018 18:51:08 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at c-s.fr Received: from pegase1.c-s.fr ([192.168.12.234]) by localhost (pegase1.c-s.fr [192.168.12.234]) (amavisd-new, port 10024) with ESMTP id hqZtd1JjuDVF; Sat, 6 Oct 2018 18:51:08 +0200 (CEST) Received: from messagerie.si.c-s.fr (messagerie.si.c-s.fr [192.168.25.192]) by pegase1.c-s.fr (Postfix) with ESMTP id 42SCLh1XQzz9ttC7; Sat, 6 Oct 2018 18:51:08 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by messagerie.si.c-s.fr (Postfix) with ESMTP id CCB2E8B793; Sat, 6 Oct 2018 18:51:14 +0200 (CEST) X-Virus-Scanned: amavisd-new at c-s.fr Received: from messagerie.si.c-s.fr ([127.0.0.1]) by localhost (messagerie.si.c-s.fr [127.0.0.1]) (amavisd-new, port 10023) with ESMTP id g2s5KcAkNGx8; Sat, 6 Oct 2018 18:51:14 +0200 (CEST) Received: from pc16082vm.idsi0.si.c-s.fr (unknown [192.168.232.3]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 776C08B74B; Sat, 6 Oct 2018 18:51:14 +0200 (CEST) Received: by pc16082vm.idsi0.si.c-s.fr (Postfix, from userid 0) id 54E226F2BA; Sat, 6 Oct 2018 16:51:14 +0000 (UTC) Message-Id: <03e8adf83ce1ef097fba634899307f58f6bf0e01.1538789120.git.christophe.leroy@c-s.fr> In-Reply-To: <981244f0ffb38c1aa02c9eb831c7ebf479b8f564.1538789120.git.christophe.leroy@c-s.fr> References: <981244f0ffb38c1aa02c9eb831c7ebf479b8f564.1538789120.git.christophe.leroy@c-s.fr> From: Christophe Leroy Subject: [PATCH v4 2/3] powerpc/process: fix interleaved output in show_user_instructions() To: Benjamin Herrenschmidt , Paul Mackerras , Michael Ellerman , muriloo@linux.ibm.com Cc: linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org Date: Sat, 6 Oct 2018 16:51:14 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When two processes crash at the same time, we sometimes encounter interleaving in the middle of a line: [ 4.365317] init[1]: segfault (11) at 0 nip 0 lr 0 code 1 [ 4.370452] init[1]: code: XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX [ 4.372042] init[74]: segfault (11) at 10a74 nip 1000c198 lr 100078c8 code 1 in sh[10000000+14000] [ 4.386829] XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX [ 4.391542] init[1]: code: XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX [ 4.400863] init[74]: code: 90010024 bf61000c 91490a7c 3fa01002 3be00000 7d3e4b78 3bbd0c20 3b600000 [ 4.409867] init[74]: code: 3b9d0040 7c7fe02e 2f830000 419e0028 <89230000> 2f890000 41be001c 4b7f6e79 This patch fixes it by preparing complete lines in a buffer and printing it at once. Fixes: 88b0fe1757359 ("powerpc: Add show_user_instructions()") Reviewed-by: Murilo Opsfelder Araujo Signed-off-by: Christophe Leroy --- v4: rebased v3: no change v2: Using seq_buf and reworked the loop to avoid redundant prints. arch/powerpc/kernel/process.c | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index 3396c419abf2..8dabf656d924 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c @@ -43,6 +43,7 @@ #include #include #include +#include #include #include @@ -1300,7 +1301,9 @@ static void show_instructions(struct pt_regs *regs) void show_user_instructions(struct pt_regs *regs) { unsigned long pc; - int i; + int n = instructions_to_print; + struct seq_buf s; + char buf[96]; /* enough for 8 times 9 + 2 chars */ pc = regs->nip - (instructions_to_print * 3 / 4 * sizeof(int)); @@ -1314,29 +1317,27 @@ void show_user_instructions(struct pt_regs *regs) return; } - pr_info("%s[%d]: code: ", current->comm, current->pid); + seq_buf_init(&s, buf, sizeof(buf)); - for (i = 0; i < instructions_to_print; i++) { - int instr; + while (n) { + int i; - if (!(i % 8) && (i > 0)) { - pr_cont("\n"); - pr_info("%s[%d]: code: ", current->comm, current->pid); - } + seq_buf_clear(&s); - if (probe_kernel_address((const void *)pc, instr)) { - pr_cont("XXXXXXXX "); - } else { - if (regs->nip == pc) - pr_cont("<%08x> ", instr); - else - pr_cont("%08x ", instr); + for (i = 0; i < 8 && n; i++, n--, pc += sizeof(int)) { + int instr; + + if (probe_kernel_address((const void *)pc, instr)) { + seq_buf_puts(&s, "XXXXXXXX "); + continue; + } + seq_buf_printf(&s, regs->nip == pc ? "<%08x> " : "%08x ", instr); } - pc += sizeof(int); + if (!seq_buf_has_overflowed(&s)) + pr_info("%s[%d]: code: %s\n", current->comm, + current->pid, s.buffer); } - - pr_cont("\n"); } struct regbit { -- 2.13.3