From patchwork Mon Jul 24 08:25:15 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ryan Roberts X-Patchwork-Id: 13323543 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 66C47C001B0 for ; Mon, 24 Jul 2023 08:25:38 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id C88D46B0074; Mon, 24 Jul 2023 04:25:37 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id C38EE6B0075; Mon, 24 Jul 2023 04:25:37 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id AD9348E0001; Mon, 24 Jul 2023 04:25:37 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id A0A0D6B0074 for ; Mon, 24 Jul 2023 04:25:37 -0400 (EDT) Received: from smtpin30.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 4F8851A09CC for ; Mon, 24 Jul 2023 08:25:37 +0000 (UTC) X-FDA: 81045821514.30.A86B9F3 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by imf18.hostedemail.com (Postfix) with ESMTP id 970121C0014 for ; Mon, 24 Jul 2023 08:25:35 +0000 (UTC) Authentication-Results: imf18.hostedemail.com; dkim=none; dmarc=pass (policy=none) header.from=arm.com; spf=pass (imf18.hostedemail.com: domain of ryan.roberts@arm.com designates 217.140.110.172 as permitted sender) smtp.mailfrom=ryan.roberts@arm.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1690187135; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=XlRIL9y77l4hUsgR6WNGVesaqf711bWwIXAfz4ZM0r8=; b=ScA67Qp4khusok9r+vYrvMp2wDfY840tbayYYK2zv/wJ1JbYvKDUyXRjeOjaxUL9UNl+qa i42XdRCTktnln41imRWRR3Q4mmebPSUxghQoK25dDAOD57s0qYFytRIIziwHUzMThsH2nf Th8+70xYwCm82mKk+W+xjNyZtB2dMGE= ARC-Authentication-Results: i=1; imf18.hostedemail.com; dkim=none; dmarc=pass (policy=none) header.from=arm.com; spf=pass (imf18.hostedemail.com: domain of ryan.roberts@arm.com designates 217.140.110.172 as permitted sender) smtp.mailfrom=ryan.roberts@arm.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1690187135; a=rsa-sha256; cv=none; b=htDE5F0TNEwnQa4lq4NDbw8uG7NxmT2IDP58BD83xIjJuarsbzsMOydbUpek2LxXngBDfn BqUOuwOqRr1r1x2nvCGbb+TQh3KVkKwgLMd58BQazdbHmLaT0jd1w0tLnM32v9SrzWRWAm xAxKmX408eHV1NTl4mydMOdpPXXNDZM= Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id DB53EFEC; Mon, 24 Jul 2023 01:26:17 -0700 (PDT) Received: from e125769.cambridge.arm.com (e125769.cambridge.arm.com [10.1.196.26]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 081BE3F67D; Mon, 24 Jul 2023 01:25:32 -0700 (PDT) From: Ryan Roberts To: "Andrew Morton" , "Shuah Khan" , =?utf-8?b?SsOpcsO0bWUgR2xpc3Nl?= , "David Hildenbrand" , "Mark Brown" , "John Hubbard" , "Florent Revest" , "Peter Xu" Cc: Ryan Roberts , linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-kselftest@vger.kernel.org Subject: [PATCH v3 1/8] selftests: Line buffer test program's stdout Date: Mon, 24 Jul 2023 09:25:15 +0100 Message-Id: <20230724082522.1202616-2-ryan.roberts@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230724082522.1202616-1-ryan.roberts@arm.com> References: <20230724082522.1202616-1-ryan.roberts@arm.com> MIME-Version: 1.0 X-Rspamd-Queue-Id: 970121C0014 X-Rspam-User: X-Rspamd-Server: rspam05 X-Stat-Signature: 71bptggfbm7p3ttizttqabri3ryp6xoa X-HE-Tag: 1690187135-428098 X-HE-Meta: U2FsdGVkX1+ltsTB5l1Y5qskJQ2o0ph2bnJvSxMv0fNE/S3FLaLi2fesQ+oEKBt7enwKlW3QIpuFt+wlRXgRDbtYynQpW+9x+cdGsqN9gCxDEz26b8s/lvW6WuSz9Jrgz3bKIbRZ7enfNtpcBF3eOlM/dIJsUaWYDMTpjaPvsHAWe77fet/1thfLNGkFcAPBLyQgQLVjGra7Cb+q0mhrJCcD0BGyCEo4K0zTk09BPt9VFfhzGamb1RxCDIqCO+IvsL97biJ6dWQu9EoZYtUo2gI6LBzHe9bj4Rray9k9I0bnhxlML1qzT+lDVEY5yRyeCh05eW5AlvW0WuMb3ZD4DrvjvifIxP3+ytqfjoxRlxLy1S4PnpK/h/5U+gSRU8ZZhlEmLLo1Y4vWXig5Uk3VJFik6WpUA/HS9tSp7R9FNZvNm3P0C7yNYoxcBIGgqFAT2sQ65WuOmphlFZ2Nxd5WsKk/Wxbek0EIVjiQbAjela+geQf3bFZ5IYihUYT+ib1XnIA2FmBaYF/jZirG+aJsAfS8tBNV32VUbi5UAKClGhbZFMu15wrMrKII1HG2R+sJzlzMSs00FEV3MLIj6u/QcA3DoTAogFwGRqEm7F8dTdawLMQeB78BOHQE+74LxIQ+uJQ72Hb9KXy0Zb4YKgg+kzVMxJaeBOMLYNHjqxpwjI4aTXeBrmnRd7wkZNQRodkihJhpwfMxIEqRpc2PMGUwXKGq+M2o+DXOZrQ8DPKny8osGEp0mw3TuPs5rt3ScHeZUGzwxIpW9PKYN2ZZmSF0tellswPWnwEfLuBIkKeN7gkoiKPOMJ45dNKCGMwTbe4KiupPzJHk+xBPkSrLd1moZCrb46hhiMipKdNioFPm/BAa3JpU+/SfWJ5jjSmNHvTZIKpeCyAMP0EZLvVnOo8+3LmXj6FIFOgrdk8KvtKMkURWmV6bwYbtlS6tyJjgmorU6bNcBKgn2NaFKaNSeEA jVksd6tg tWnNuDkqsRUfKGFg/KMD50YiEF1a6yoSb75FPWqn1JahZ16QdZeDkjtumakPwCut60JUGRjMCmEZavsP1QxHGwtAyQS4pRLzfQRAIgoN2y/hqIlUDpkM9ShKAsqWI9LTh+Zorp2cFQsYd0Eb7L0UMB8D/6DdGTCRpDhJODE9jcJ+yTiRg25xLhnTDwzaUyk74TASBmHG1KxhLTmQR7aLIvw3ffvuvf1eEbTk/ X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: The selftests runner pipes the test program's stdout to tap_prefix. The presence of the pipe means that the test program sets its stdout to be fully buffered (as aposed to line buffered when directly connected to the terminal). The block buffering means that there is often content in the buffer at fork() time, which causes the output to end up duplicated. This was causing problems for mm:cow where test results were duplicated 20-30x. Solve this by using `stdbuf`, when available to force the test program to use line buffered mode. This means previously printf'ed results are flushed out of the program before any fork(). Additionally, explicitly set line buffer mode in ksft_print_header(), which means that all test programs that use the ksft framework will benefit even if stdbuf is not present on the system. Reviewed-by: Mark Brown Signed-off-by: Ryan Roberts --- tools/testing/selftests/kselftest.h | 9 +++++++++ tools/testing/selftests/kselftest/runner.sh | 7 +++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/kselftest.h b/tools/testing/selftests/kselftest.h index 829be379545a..529d29a35900 100644 --- a/tools/testing/selftests/kselftest.h +++ b/tools/testing/selftests/kselftest.h @@ -113,6 +113,15 @@ static inline int ksft_get_error_cnt(void) { return ksft_cnt.ksft_error; } static inline void ksft_print_header(void) { + /* + * Force line buffering; If stdout is not connected to a terminal, it + * will otherwise default to fully buffered, which can cause output + * duplication if there is content in the buffer when fork()ing. If + * there is a crash, line buffering also means the most recent output + * line will be visible. + */ + setvbuf(stdout, NULL, _IOLBF, 0); + if (!(getenv("KSFT_TAP_LEVEL"))) printf("TAP version 13\n"); } diff --git a/tools/testing/selftests/kselftest/runner.sh b/tools/testing/selftests/kselftest/runner.sh index 1c952d1401d4..261c73cab41b 100644 --- a/tools/testing/selftests/kselftest/runner.sh +++ b/tools/testing/selftests/kselftest/runner.sh @@ -105,15 +105,18 @@ run_one() echo "# Warning: file $TEST is missing!" echo "not ok $test_num $TEST_HDR_MSG" else + if [ -x /usr/bin/stdbuf ]; then + stdbuf="/usr/bin/stdbuf --output=L " + fi eval kselftest_cmd_args="\$${kselftest_cmd_args_ref:-}" - cmd="./$BASENAME_TEST $kselftest_cmd_args" + cmd="$stdbuf ./$BASENAME_TEST $kselftest_cmd_args" if [ ! -x "$TEST" ]; then echo "# Warning: file $TEST is not executable" if [ $(head -n 1 "$TEST" | cut -c -2) = "#!" ] then interpreter=$(head -n 1 "$TEST" | cut -c 3-) - cmd="$interpreter ./$BASENAME_TEST" + cmd="$stdbuf $interpreter ./$BASENAME_TEST" else echo "not ok $test_num $TEST_HDR_MSG" return