Message ID | 20221027162839.410720-1-masahiroy@kernel.org |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:6687:0:0:0:0:0 with SMTP id l7csp341394wru; Thu, 27 Oct 2022 09:50:32 -0700 (PDT) X-Google-Smtp-Source: AMsMyM7Pz9X1EBIKFOM0mZuO1ibkk2F+A18egK2Fjk62Aq/nH3gql3hcp0ULzeGaqM/KfTjYquRC X-Received: by 2002:a17:906:8a4a:b0:78d:5ff6:7507 with SMTP id gx10-20020a1709068a4a00b0078d5ff67507mr42644744ejc.194.1666889431896; Thu, 27 Oct 2022 09:50:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1666889431; cv=none; d=google.com; s=arc-20160816; b=lwwPbCbf9ZGH0BY1icUHEZqwaWrvfJhWhtaIRBtQiImfpR4s267VtozQ45kXog/PXi sIvnmxgGSnJCbnuUFfpIYtWCZSedXVaVXdlQgcuUcC12eyt5SjmalDh6rJ18o2r5gPoS KHmlRdZfwYmhdu2+D4naRsEWJks/TNTbU0NP73EqRobQIX9+AGMOFbsY/311U0wSCeFA /QknYW6D/unn/LyQjA3eojoYeoYnaJJM6TRuVMUCp04qCE6CfijUZ5lOFtzIR/lYPk9Y GXSTiU1j9JOQP4TgqUcIILtu/ECl5meh8UpUkrA29/RnY+n1sIYtMYVfqS9drex1jYMr b3Sg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=vUa9rHDTRc+cYGfkFBzxJGfwPAqz1+3bUL8x86jymNU=; b=YBBm4VV2Ir3QBCqMW8EzC1JZSgYAPIuJIbEtonb3ddAsEjDezEbjXZOTnnjd/C/DpL scyeWVp1yWl2tX56kFOG9HMyth9GYi9x8KfQqyTtFjQacZ8WVGxlfEFEBfknJoqJuu1u chCpwwiw9lrNNzqytmvjY6UQPu/7CWd3YV2HyWIypCOVljkt61CsZ9ZFv5vjIhgW6WyH xmsEU+GiUc8gYQkq8rw7M3lwszVexW1Xpdiyo+Ov+UxvsPXdlzUsgyUxP3UnU03MmhdI Ue4PJg7EY+FD5O4NDiQznr9++Drzru0wGgQm+XeQSVh/s3J/RqnOKFU90LhifUJ3HlYS nBFg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=dFAXjWPh; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id f15-20020a056402160f00b0046277d2cb0csi1756954edv.470.2022.10.27.09.50.06; Thu, 27 Oct 2022 09:50:31 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=dFAXjWPh; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235689AbiJ0Q24 (ORCPT <rfc822;chrisfriedt@gmail.com> + 99 others); Thu, 27 Oct 2022 12:28:56 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56164 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235213AbiJ0Q2y (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Thu, 27 Oct 2022 12:28:54 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C188238442; Thu, 27 Oct 2022 09:28:53 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 4D36F623D0; Thu, 27 Oct 2022 16:28:53 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8B6FCC433C1; Thu, 27 Oct 2022 16:28:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1666888132; bh=LtAbTc4oHjsc7CsB0RZFmCgJaDHyi66KNVvcsO+tF64=; h=From:To:Cc:Subject:Date:From; b=dFAXjWPhTBNepjo+WzLlzFG3D5UjZlHgWEEbarhq/a31lrVSDOT7ryrgHXUbXJAYd ixOMMJsbagIxDOsHrkWrmJXg26V/MJNmYpk+GANFjjh+9Ekf1tm5Oyu/e+K0uvlyqR fs34N4xpVjUTSIj0PuhbRSuHqPQFEOAFy27gVqNSRqCS/Jtkn2nhFGiidFq+Hps1JY wBnUFa8sJax9y68bCUHljiUk38r34azGZ2kPlyRVf8mI59mneAvPQtGnhwbm2J2GCa p/Fd7roSVzCf1w9i2To3dyO9im8SMh7+btZZLXQ8vvIy3UXmHr3ZRrDbNbfU5r21TV ILd4153NyQ/1g== From: Masahiro Yamada <masahiroy@kernel.org> To: linux-kbuild@vger.kernel.org Cc: Masahiro Yamada <masahiroy@kernel.org>, Jiri Slaby <jirislaby@kernel.org>, Nathan Chancellor <nathan@kernel.org>, Nick Desaulniers <ndesaulniers@google.com>, Michal Marek <michal.lkml@markovi.net>, Nicolas Schier <nicolas@fjasle.eu>, Tom Rix <trix@redhat.com>, linux-kernel@vger.kernel.org, llvm@lists.linux.dev Subject: [PATCH v2] kbuild: fix SIGPIPE error message for AR=gcc-ar and AR=llvm-ar Date: Fri, 28 Oct 2022 01:28:39 +0900 Message-Id: <20221027162839.410720-1-masahiroy@kernel.org> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-7.6 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1747860252759881697?= X-GMAIL-MSGID: =?utf-8?q?1747860252759881697?= |
Series |
[v2] kbuild: fix SIGPIPE error message for AR=gcc-ar and AR=llvm-ar
|
|
Commit Message
Masahiro Yamada
Oct. 27, 2022, 4:28 p.m. UTC
Jiri Slaby reported that building the kernel with AR=gcc-ar shows: /usr/bin/ar terminated with signal 13 [Broken pipe] Nathan Chancellor reported the latest AR=llvm-ar shows error: write on a pipe with no reader The latter occurs since LLVM commit 51b557adc131 ("Add an error message to the default SIGPIPE handler"). The resulting vmlinux is correct, but it is better to silence it. 'head -n1' exits after reading the first line, so the pipe is closed. Use 'sed -n 1p' to eat the stream till the end. Fixes: 321648455061 ("kbuild: use obj-y instead extra-y for objects placed at the head") Link: https://github.com/ClangBuiltLinux/linux/issues/1651 Reported-by: Jiri Slaby <jirislaby@kernel.org> Reported-by: Nathan Chancellor <nathan@kernel.org> Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> Tested-by: Nick Desaulniers <ndesaulniers@google.com> --- Changes in v2: - Update commit description to mention llvm-ar Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
Comments
On Thu, Oct 27, 2022 at 9:28 AM Masahiro Yamada <masahiroy@kernel.org> wrote: > > Jiri Slaby reported that building the kernel with AR=gcc-ar shows: > /usr/bin/ar terminated with signal 13 [Broken pipe] > > Nathan Chancellor reported the latest AR=llvm-ar shows > error: write on a pipe with no reader > > The latter occurs since LLVM commit 51b557adc131 ("Add an error message > to the default SIGPIPE handler"). > > The resulting vmlinux is correct, but it is better to silence it. > > 'head -n1' exits after reading the first line, so the pipe is closed. > > Use 'sed -n 1p' to eat the stream till the end. > > Fixes: 321648455061 ("kbuild: use obj-y instead extra-y for objects placed at the head") > Link: https://github.com/ClangBuiltLinux/linux/issues/1651 > Reported-by: Jiri Slaby <jirislaby@kernel.org> > Reported-by: Nathan Chancellor <nathan@kernel.org> > Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> > Tested-by: Nick Desaulniers <ndesaulniers@google.com> Looks great! Thanks all. Reviewed-by: Nick Desaulniers <ndesaulniers@google.com> > --- > > Changes in v2: > - Update commit description to mention llvm-ar > > Makefile | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/Makefile b/Makefile > index e90bb2b38607..e9e7eff906a5 100644 > --- a/Makefile > +++ b/Makefile > @@ -1218,7 +1218,7 @@ quiet_cmd_ar_vmlinux.a = AR $@ > cmd_ar_vmlinux.a = \ > rm -f $@; \ > $(AR) cDPrST $@ $(KBUILD_VMLINUX_OBJS); \ > - $(AR) mPiT $$($(AR) t $@ | head -n1) $@ $$($(AR) t $@ | grep -F -f $(srctree)/scripts/head-object-list.txt) > + $(AR) mPiT $$($(AR) t $@ | sed -n 1p) $@ $$($(AR) t $@ | grep -F -f $(srctree)/scripts/head-object-list.txt) > > targets += vmlinux.a > vmlinux.a: $(KBUILD_VMLINUX_OBJS) scripts/head-object-list.txt autoksyms_recursive FORCE > -- > 2.34.1 >
On Fri, Oct 28, 2022 at 01:28:39AM +0900, Masahiro Yamada wrote: > Jiri Slaby reported that building the kernel with AR=gcc-ar shows: > /usr/bin/ar terminated with signal 13 [Broken pipe] > > Nathan Chancellor reported the latest AR=llvm-ar shows > error: write on a pipe with no reader > > The latter occurs since LLVM commit 51b557adc131 ("Add an error message > to the default SIGPIPE handler"). > > The resulting vmlinux is correct, but it is better to silence it. > > 'head -n1' exits after reading the first line, so the pipe is closed. > > Use 'sed -n 1p' to eat the stream till the end. > > Fixes: 321648455061 ("kbuild: use obj-y instead extra-y for objects placed at the head") > Link: https://github.com/ClangBuiltLinux/linux/issues/1651 > Reported-by: Jiri Slaby <jirislaby@kernel.org> > Reported-by: Nathan Chancellor <nathan@kernel.org> > Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> > Tested-by: Nick Desaulniers <ndesaulniers@google.com> Tested-by: Nathan Chancellor <nathan@kernel.org> > --- > > Changes in v2: > - Update commit description to mention llvm-ar > > Makefile | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/Makefile b/Makefile > index e90bb2b38607..e9e7eff906a5 100644 > --- a/Makefile > +++ b/Makefile > @@ -1218,7 +1218,7 @@ quiet_cmd_ar_vmlinux.a = AR $@ > cmd_ar_vmlinux.a = \ > rm -f $@; \ > $(AR) cDPrST $@ $(KBUILD_VMLINUX_OBJS); \ > - $(AR) mPiT $$($(AR) t $@ | head -n1) $@ $$($(AR) t $@ | grep -F -f $(srctree)/scripts/head-object-list.txt) > + $(AR) mPiT $$($(AR) t $@ | sed -n 1p) $@ $$($(AR) t $@ | grep -F -f $(srctree)/scripts/head-object-list.txt) > > targets += vmlinux.a > vmlinux.a: $(KBUILD_VMLINUX_OBJS) scripts/head-object-list.txt autoksyms_recursive FORCE > -- > 2.34.1 >
On Fri, Oct 28, 2022 at 01:28:39AM +0900, Masahiro Yamada wrote: > Jiri Slaby reported that building the kernel with AR=gcc-ar shows: > /usr/bin/ar terminated with signal 13 [Broken pipe] > > Nathan Chancellor reported the latest AR=llvm-ar shows > error: write on a pipe with no reader > > The latter occurs since LLVM commit 51b557adc131 ("Add an error message > to the default SIGPIPE handler"). > > The resulting vmlinux is correct, but it is better to silence it. > > 'head -n1' exits after reading the first line, so the pipe is closed. > > Use 'sed -n 1p' to eat the stream till the end. I think this is wrong because it needlessly consumes CPU time. SIGPIPE is _needed_ to stop a process after we found what we needed, but it's up to the caller (the shell here) to determine what to do about it. Similarly, that LLVM commit is wrong -- tools should _not_ catch their own SIGPIPEs. They should be caught by their callers. For example, see: $ seq 10000 | head -n1 1 ^^^ no warnings from the shell (caller of "seq") And you can see it _is_ being killed by SIGPIPE: $ strace seq 1000 | head -n1 ... write(1, "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14"..., 8192) = 8192 1 write(1, "\n1861\n1862\n1863\n1864\n1865\n1866\n1"..., 4096) = -1 EPIPE (Broken pipe) --- SIGPIPE {si_signo=SIGPIPE, si_code=SI_USER, si_pid=3503448, si_uid=1000} --- +++ killed by SIGPIPE +++ If we use "sed -n 1p" seq will continue to run, consuming needless time and CPU resources. So, I strongly think this is the wrong solution. SIGPIPE should be ignored for ar, and LLVM should _not_ catch its own SIGPIPE. -Kees > > Fixes: 321648455061 ("kbuild: use obj-y instead extra-y for objects placed at the head") > Link: https://github.com/ClangBuiltLinux/linux/issues/1651 > Reported-by: Jiri Slaby <jirislaby@kernel.org> > Reported-by: Nathan Chancellor <nathan@kernel.org> > Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> > Tested-by: Nick Desaulniers <ndesaulniers@google.com> > --- > > Changes in v2: > - Update commit description to mention llvm-ar > > Makefile | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/Makefile b/Makefile > index e90bb2b38607..e9e7eff906a5 100644 > --- a/Makefile > +++ b/Makefile > @@ -1218,7 +1218,7 @@ quiet_cmd_ar_vmlinux.a = AR $@ > cmd_ar_vmlinux.a = \ > rm -f $@; \ > $(AR) cDPrST $@ $(KBUILD_VMLINUX_OBJS); \ > - $(AR) mPiT $$($(AR) t $@ | head -n1) $@ $$($(AR) t $@ | grep -F -f $(srctree)/scripts/head-object-list.txt) > + $(AR) mPiT $$($(AR) t $@ | sed -n 1p) $@ $$($(AR) t $@ | grep -F -f $(srctree)/scripts/head-object-list.txt) > > targets += vmlinux.a > vmlinux.a: $(KBUILD_VMLINUX_OBJS) scripts/head-object-list.txt autoksyms_recursive FORCE > -- > 2.34.1 >
On Thu, Nov 17, 2022 at 4:01 AM Kees Cook <keescook@chromium.org> wrote: > > On Fri, Oct 28, 2022 at 01:28:39AM +0900, Masahiro Yamada wrote: > > Jiri Slaby reported that building the kernel with AR=gcc-ar shows: > > /usr/bin/ar terminated with signal 13 [Broken pipe] > > > > Nathan Chancellor reported the latest AR=llvm-ar shows > > error: write on a pipe with no reader > > > > The latter occurs since LLVM commit 51b557adc131 ("Add an error message > > to the default SIGPIPE handler"). > > > > The resulting vmlinux is correct, but it is better to silence it. > > > > 'head -n1' exits after reading the first line, so the pipe is closed. > > > > Use 'sed -n 1p' to eat the stream till the end. > > I think this is wrong because it needlessly consumes CPU time. SIGPIPE > is _needed_ to stop a process after we found what we needed, but it's up > to the caller (the shell here) to determine what to do about it. > > Similarly, that LLVM commit is wrong -- tools should _not_ catch their > own SIGPIPEs. They should be caught by their callers. > > For example, see: > > $ seq 10000 | head -n1 > 1 > > ^^^ no warnings from the shell (caller of "seq") > And you can see it _is_ being killed by SIGPIPE: > > $ strace seq 1000 | head -n1 > ... > write(1, "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14"..., 8192) = 8192 > 1 > write(1, "\n1861\n1862\n1863\n1864\n1865\n1866\n1"..., 4096) = -1 EPIPE (Broken pipe) > --- SIGPIPE {si_signo=SIGPIPE, si_code=SI_USER, si_pid=3503448, si_uid=1000} --- > +++ killed by SIGPIPE +++ > > If we use "sed -n 1p" seq will continue to run, consuming needless time > and CPU resources. > > So, I strongly think this is the wrong solution. SIGPIPE should be > ignored for ar, and LLVM should _not_ catch its own SIGPIPE. > > -Kees I thought of this - it is just wasting CPU time, but I did not come up with a better idea on the kbuild side. I do not want to use 2>/dev/null because it may hide non-SIGPIPE (i.e. real) errors. I think you guys will be keen on fixing llvm. I hope gcc as well?
On Thu, Nov 17, 2022 at 05:37:31AM +0900, Masahiro Yamada wrote: > On Thu, Nov 17, 2022 at 4:01 AM Kees Cook <keescook@chromium.org> wrote: > > > > On Fri, Oct 28, 2022 at 01:28:39AM +0900, Masahiro Yamada wrote: > > > Jiri Slaby reported that building the kernel with AR=gcc-ar shows: > > > /usr/bin/ar terminated with signal 13 [Broken pipe] > > > > > > Nathan Chancellor reported the latest AR=llvm-ar shows > > > error: write on a pipe with no reader > > > > > > The latter occurs since LLVM commit 51b557adc131 ("Add an error message > > > to the default SIGPIPE handler"). > > > > > > The resulting vmlinux is correct, but it is better to silence it. > > > > > > 'head -n1' exits after reading the first line, so the pipe is closed. > > > > > > Use 'sed -n 1p' to eat the stream till the end. > > > > I think this is wrong because it needlessly consumes CPU time. SIGPIPE > > is _needed_ to stop a process after we found what we needed, but it's up > > to the caller (the shell here) to determine what to do about it. > > > > Similarly, that LLVM commit is wrong -- tools should _not_ catch their > > own SIGPIPEs. They should be caught by their callers. > > > > For example, see: > > > > $ seq 10000 | head -n1 > > 1 > > > > ^^^ no warnings from the shell (caller of "seq") > > And you can see it _is_ being killed by SIGPIPE: > > > > $ strace seq 1000 | head -n1 > > ... > > write(1, "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14"..., 8192) = 8192 > > 1 > > write(1, "\n1861\n1862\n1863\n1864\n1865\n1866\n1"..., 4096) = -1 EPIPE (Broken pipe) > > --- SIGPIPE {si_signo=SIGPIPE, si_code=SI_USER, si_pid=3503448, si_uid=1000} --- > > +++ killed by SIGPIPE +++ > > > > If we use "sed -n 1p" seq will continue to run, consuming needless time > > and CPU resources. > > > > So, I strongly think this is the wrong solution. SIGPIPE should be > > ignored for ar, and LLVM should _not_ catch its own SIGPIPE. > > > > -Kees > > > I thought of this - it is just wasting CPU time, > but I did not come up with a better idea on the kbuild side. > > I do not want to use 2>/dev/null because it may hide > non-SIGPIPE (i.e. real) errors. Yes, I've opened an upstream LLVM bug for this: https://github.com/llvm/llvm-project/issues/59037
On Thu, Nov 17, 2022 at 7:07 AM Kees Cook <keescook@chromium.org> wrote: > > On Thu, Nov 17, 2022 at 05:37:31AM +0900, Masahiro Yamada wrote: > > On Thu, Nov 17, 2022 at 4:01 AM Kees Cook <keescook@chromium.org> wrote: > > > > > > On Fri, Oct 28, 2022 at 01:28:39AM +0900, Masahiro Yamada wrote: > > > > Jiri Slaby reported that building the kernel with AR=gcc-ar shows: > > > > /usr/bin/ar terminated with signal 13 [Broken pipe] > > > > > > > > Nathan Chancellor reported the latest AR=llvm-ar shows > > > > error: write on a pipe with no reader > > > > > > > > The latter occurs since LLVM commit 51b557adc131 ("Add an error message > > > > to the default SIGPIPE handler"). > > > > > > > > The resulting vmlinux is correct, but it is better to silence it. > > > > > > > > 'head -n1' exits after reading the first line, so the pipe is closed. > > > > > > > > Use 'sed -n 1p' to eat the stream till the end. > > > > > > I think this is wrong because it needlessly consumes CPU time. SIGPIPE > > > is _needed_ to stop a process after we found what we needed, but it's up > > > to the caller (the shell here) to determine what to do about it. > > > > > > Similarly, that LLVM commit is wrong -- tools should _not_ catch their > > > own SIGPIPEs. They should be caught by their callers. > > > > > > For example, see: > > > > > > $ seq 10000 | head -n1 > > > 1 > > > > > > ^^^ no warnings from the shell (caller of "seq") > > > And you can see it _is_ being killed by SIGPIPE: > > > > > > $ strace seq 1000 | head -n1 > > > ... > > > write(1, "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14"..., 8192) = 8192 > > > 1 > > > write(1, "\n1861\n1862\n1863\n1864\n1865\n1866\n1"..., 4096) = -1 EPIPE (Broken pipe) > > > --- SIGPIPE {si_signo=SIGPIPE, si_code=SI_USER, si_pid=3503448, si_uid=1000} --- > > > +++ killed by SIGPIPE +++ > > > > > > If we use "sed -n 1p" seq will continue to run, consuming needless time > > > and CPU resources. > > > > > > So, I strongly think this is the wrong solution. SIGPIPE should be > > > ignored for ar, and LLVM should _not_ catch its own SIGPIPE. > > > > > > -Kees > > > > > > I thought of this - it is just wasting CPU time, > > but I did not come up with a better idea on the kbuild side. > > > > I do not want to use 2>/dev/null because it may hide > > non-SIGPIPE (i.e. real) errors. > > Yes, I've opened an upstream LLVM bug for this: > https://github.com/llvm/llvm-project/issues/59037 > > -- > Kees Cook BTW, Python does something similar by default. (noisy back-trace for SIGPIPE) masahiro@zoe:/tmp$ cat test.py #!/usr/bin/python3 for i in range(4000): print(i) masahiro@zoe:/tmp$ ./test.py | head -n1 0 Traceback (most recent call last): File "/tmp/./test.py", line 3, in <module> print(i) BrokenPipeError: [Errno 32] Broken pipe This page https://www.geeksforgeeks.org/broken-pipe-error-in-python/ suggests some workarounds. Python scripts potentially have this issue. $ ./scripts/diffconfig .config.old .config | head -n1 -104_QUAD_8 m Traceback (most recent call last): File "/home/masahiro/ref/linux/./scripts/diffconfig", line 132, in <module> main() File "/home/masahiro/ref/linux/./scripts/diffconfig", line 111, in main print_config("-", config, a[config], None) File "/home/masahiro/ref/linux/./scripts/diffconfig", line 62, in print_config print("-%s %s" % (config, value)) BrokenPipeError: [Errno 32] Broken pipe What would you suggest for python scripts?
On December 5, 2022 8:24:41 PM PST, Masahiro Yamada <masahiroy@kernel.org> wrote: >On Thu, Nov 17, 2022 at 7:07 AM Kees Cook <keescook@chromium.org> wrote: >> >> On Thu, Nov 17, 2022 at 05:37:31AM +0900, Masahiro Yamada wrote: >> > On Thu, Nov 17, 2022 at 4:01 AM Kees Cook <keescook@chromium.org> wrote: >> > > >> > > On Fri, Oct 28, 2022 at 01:28:39AM +0900, Masahiro Yamada wrote: >> > > > Jiri Slaby reported that building the kernel with AR=gcc-ar shows: >> > > > /usr/bin/ar terminated with signal 13 [Broken pipe] >> > > > >> > > > Nathan Chancellor reported the latest AR=llvm-ar shows >> > > > error: write on a pipe with no reader >> > > > >> > > > The latter occurs since LLVM commit 51b557adc131 ("Add an error message >> > > > to the default SIGPIPE handler"). >> > > > >> > > > The resulting vmlinux is correct, but it is better to silence it. >> > > > >> > > > 'head -n1' exits after reading the first line, so the pipe is closed. >> > > > >> > > > Use 'sed -n 1p' to eat the stream till the end. >> > > >> > > I think this is wrong because it needlessly consumes CPU time. SIGPIPE >> > > is _needed_ to stop a process after we found what we needed, but it's up >> > > to the caller (the shell here) to determine what to do about it. >> > > >> > > Similarly, that LLVM commit is wrong -- tools should _not_ catch their >> > > own SIGPIPEs. They should be caught by their callers. >> > > >> > > For example, see: >> > > >> > > $ seq 10000 | head -n1 >> > > 1 >> > > >> > > ^^^ no warnings from the shell (caller of "seq") >> > > And you can see it _is_ being killed by SIGPIPE: >> > > >> > > $ strace seq 1000 | head -n1 >> > > ... >> > > write(1, "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14"..., 8192) = 8192 >> > > 1 >> > > write(1, "\n1861\n1862\n1863\n1864\n1865\n1866\n1"..., 4096) = -1 EPIPE (Broken pipe) >> > > --- SIGPIPE {si_signo=SIGPIPE, si_code=SI_USER, si_pid=3503448, si_uid=1000} --- >> > > +++ killed by SIGPIPE +++ >> > > >> > > If we use "sed -n 1p" seq will continue to run, consuming needless time >> > > and CPU resources. >> > > >> > > So, I strongly think this is the wrong solution. SIGPIPE should be >> > > ignored for ar, and LLVM should _not_ catch its own SIGPIPE. >> > > >> > > -Kees >> > >> > >> > I thought of this - it is just wasting CPU time, >> > but I did not come up with a better idea on the kbuild side. >> > >> > I do not want to use 2>/dev/null because it may hide >> > non-SIGPIPE (i.e. real) errors. >> >> Yes, I've opened an upstream LLVM bug for this: >> https://github.com/llvm/llvm-project/issues/59037 >> >> -- >> Kees Cook > > > >BTW, Python does something similar by default. >(noisy back-trace for SIGPIPE) > > > > > >masahiro@zoe:/tmp$ cat test.py >#!/usr/bin/python3 >for i in range(4000): > print(i) > >masahiro@zoe:/tmp$ ./test.py | head -n1 >0 >Traceback (most recent call last): > File "/tmp/./test.py", line 3, in <module> > print(i) >BrokenPipeError: [Errno 32] Broken pipe Eww. Well, same problem, IMO. For any Python scripts that are going to have potentially truncated output, they need to do: from signal import signal, SIGPIPE, SIG_DFL signal(SIGPIPE,SIG_DFL) >This page >https://www.geeksforgeeks.org/broken-pipe-error-in-python/ > >suggests some workarounds. (As suggested in this page.) >What would you suggest for python scripts? They need to be fixed. A command line tool internally catching SIGPIPE is wrong. :) -Kees
diff --git a/Makefile b/Makefile index e90bb2b38607..e9e7eff906a5 100644 --- a/Makefile +++ b/Makefile @@ -1218,7 +1218,7 @@ quiet_cmd_ar_vmlinux.a = AR $@ cmd_ar_vmlinux.a = \ rm -f $@; \ $(AR) cDPrST $@ $(KBUILD_VMLINUX_OBJS); \ - $(AR) mPiT $$($(AR) t $@ | head -n1) $@ $$($(AR) t $@ | grep -F -f $(srctree)/scripts/head-object-list.txt) + $(AR) mPiT $$($(AR) t $@ | sed -n 1p) $@ $$($(AR) t $@ | grep -F -f $(srctree)/scripts/head-object-list.txt) targets += vmlinux.a vmlinux.a: $(KBUILD_VMLINUX_OBJS) scripts/head-object-list.txt autoksyms_recursive FORCE