From patchwork Fri Nov 25 08:43:04 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gow X-Patchwork-Id: 25879 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:f944:0:0:0:0:0 with SMTP id q4csp3862439wrr; Fri, 25 Nov 2022 00:52:47 -0800 (PST) X-Google-Smtp-Source: AA0mqf57I3eHmrccmsTuAWw59DuScxbwTmXpCBZnS+LlgUQf3omoFra3etGVUf5Oa/6LNgGr05Pd X-Received: by 2002:a17:90a:990d:b0:212:d909:a41e with SMTP id b13-20020a17090a990d00b00212d909a41emr26154815pjp.48.1669366367422; Fri, 25 Nov 2022 00:52:47 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1669366367; cv=none; d=google.com; s=arc-20160816; b=xcYZNQFVjzj2EauyEak55xbhDSOtj0m1BHOZP37NZV5icoSJyQqOODmSxejIfo1OXL 7rcOJOsxRInw49uslEtPXH5cpoeCDYognsgoBTrNx5nWTNRrtC0S19YDCUjXMyCCC+68 d4opUhsPVoKv7wc/jTRA/q/YHhmELcauCS5VvQjZddU0ZYVuLgoxOX8H1aTJR+8dK3Ym yXK55Z59q6Xqxar+wtI58LFjBCSoduWs+AGs7WuhtlaZJtFG4m2+sba80S5TOnt291IL CFYr9o3fA93Rh0GjMH9J0KP2qLu2pBp2awNS7iv731+zXddLAcGtAB2G36gfrjzwIHg0 rLOA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:message-id:mime-version:date :dkim-signature; bh=dehjIhc0oB2x/7qa8tpHLfPv+8ip2PCtDc/VgLdDFS0=; b=PpMp+ESQcu/Lnty5xh64//olkbuukwA1vfgX9zPGW4PsRVVJFxylakFWPPg3UwUZeN qQqCMo3N0CJiHv/fBgbvEKCFedUdhojLb4F5k8cPPxx3q3sFCcF86pv0ZCZ6ZVv/ZcEu L9TFXwwE5VNOLaq4jcBidMuIOsMkuHCIds9CFYv+THEcjbe05I2yWj6hYYuofQvnKI8C C9VBCPSOGjD63OADd3TNa4F2AufNsIDCYcFt1TN6tKYzH19lPHS/qh5qMB/Fmjm0hs40 NfiU2ccK4vXHppj4JjKLa8HXrBn0EFtYwoL8U5NZBqIF/QgGTnjxLaVlou7pecq9/boO 6KlQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=U3tR0OVo; 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=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id y2-20020a63fa02000000b004771a05aea3si2731832pgh.554.2022.11.25.00.52.34; Fri, 25 Nov 2022 00:52:47 -0800 (PST) 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=@google.com header.s=20210112 header.b=U3tR0OVo; 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=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229771AbiKYInb (ORCPT + 99 others); Fri, 25 Nov 2022 03:43:31 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57868 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229468AbiKYInQ (ORCPT ); Fri, 25 Nov 2022 03:43:16 -0500 Received: from mail-yb1-xb49.google.com (mail-yb1-xb49.google.com [IPv6:2607:f8b0:4864:20::b49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 216E620F6F for ; Fri, 25 Nov 2022 00:43:15 -0800 (PST) Received: by mail-yb1-xb49.google.com with SMTP id a5-20020a25af05000000b006e450a5e507so3361982ybh.22 for ; Fri, 25 Nov 2022 00:43:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:mime-version:date:from:to:cc:subject :date:message-id:reply-to; bh=dehjIhc0oB2x/7qa8tpHLfPv+8ip2PCtDc/VgLdDFS0=; b=U3tR0OVoZ0hHgA1k6gQVY26XcT3oNgQIup/uX30yKzUfLfrSKpvRJsmcSBuhiAXpTS rTzQMGzMJNRsRtthJ4BxyoK+TidlhhFCJmjhxBf/o1FEDj74nyLKCXv3UoCsEVkyMOeU 364amPEiG2TPV7cF3TGX+tLLAPX4almhYT7NCNw9CXxbjzI0V/mb8zoOMitrJVRJA7dj so3SRxWDXfqlFI3Uw6FkxsZS8mgE7neClxz6IKN1K/gUkQhbn5yotHy8A0DKQmNZGmod UisNijbujJ0UGmHkgWBKaLdxRuxz2CsxSAWjZikzhuh6GNn9njbaHLDcXdeN0Mt/hTxE 23bg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:mime-version:date:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=dehjIhc0oB2x/7qa8tpHLfPv+8ip2PCtDc/VgLdDFS0=; b=P2ujABfCYX3cPygKVsX21DfjB2wFmdqKL7mz1rLyynua2c9CuOQ2/rSw79Q75r+93l dAs8DFoJCfkY9oNRVO+eGtHW1yeppxrvPxk/ptGCAMLe0Ly54cmZtIM2tECSKKYsD1cM 2FFL6dvnm5kJu0fwYYKdKufuH/pntLllaiVbhrggdwDGgzxR2Kj2qrCUGTXUasszr6R9 Uznf9yuREbWk7GfE6tRJCl0fXHSqDe2f+OFxsnViVW1MauW66YI/lda75t+6mYBB1fXQ rSS6I2+htXBwPAx+31TG0d7AQ0bVnn+Tv1gwiGUCngAoB3Ino3KkwTa68+QvmRU+8Wtp IT5g== X-Gm-Message-State: ANoB5pnswS/DCooB8uHzj6W/5mWDTPErVQ4CU+Gj/8uWcxlRykB9tt+W anat4jx818TmbbAnHRbnVRX2O8J4i551bg== X-Received: from slicestar.c.googlers.com ([fda3:e722:ac3:cc00:4f:4b78:c0a8:20a1]) (user=davidgow job=sendgmr) by 2002:a05:6902:114b:b0:6e1:ce17:6c40 with SMTP id p11-20020a056902114b00b006e1ce176c40mr9ybu.5.1669365793417; Fri, 25 Nov 2022 00:43:13 -0800 (PST) Date: Fri, 25 Nov 2022 16:43:04 +0800 Mime-Version: 1.0 X-Mailer: git-send-email 2.38.1.584.g0f3c55d4c2-goog Message-ID: <20221125084306.1063074-1-davidgow@google.com> Subject: [PATCH v4 1/3] kunit: Provide a static key to check if KUnit is actively running tests From: David Gow To: Brendan Higgins , Daniel Latypov , Shuah Khan Cc: David Gow , kunit-dev@googlegroups.com, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Kees Cook , linux-doc@vger.kernel.org, linux-mm@kvack.org X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=unavailable 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: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1750457508283360671?= X-GMAIL-MSGID: =?utf-8?q?1750457508283360671?= KUnit does a few expensive things when enabled. This hasn't been a problem because KUnit was only enabled on test kernels, but with a few people enabling (but not _using_) KUnit on production systems, we need a runtime way of handling this. Provide a 'kunit_running' static key (defaulting to false), which allows us to hide any KUnit code behind a static branch. This should reduce the performance impact (on other code) of having KUnit enabled to a single NOP when no tests are running. Note that, while it looks unintuitive, tests always run entirely within __kunit_test_suites_init(), so it's safe to decrement the static key at the end of this function, rather than in __kunit_test_suites_exit(), which is only there to clean up results in debugfs. Signed-off-by: David Gow Reviewed-by: Daniel Latypov Reviewed-by: Kees Cook --- This should be a no-op (other than a possible performance improvement) functionality-wise, and lays the groundwork for a more optimised static stub implementation. The remaining patches in the series add a kunit_get_current_test() function which is a more friendly and performant wrapper around current->kunit_test, and use this in the slub test. They also improve the documentation a bit. If there are no objections, we'll take the whole series via the KUnit tree. Changes since v3: https://lore.kernel.org/linux-kselftest/20221119081252.3864249-1-davidgow@google.com/ - Use DECLARE_STATIC_KEY_FALSE() -- thanks Daniel! No changes since v2: https://lore.kernel.org/all/20221025071907.1251820-1-davidgow@google.com/ Changes since v1: https://lore.kernel.org/linux-kselftest/20221021072854.333010-1-davidgow@google.com/ - No changes in this patch. - Patch 2/3 is reworked, patch 3/3 is new. --- include/kunit/test.h | 4 ++++ lib/kunit/test.c | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/include/kunit/test.h b/include/kunit/test.h index 4666a4d199ea..87ea90576b50 100644 --- a/include/kunit/test.h +++ b/include/kunit/test.h @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -27,6 +28,9 @@ #include +/* Static key: true if any KUnit tests are currently running */ +DECLARE_STATIC_KEY_FALSE(kunit_running); + struct kunit; /* Size of log associated with test. */ diff --git a/lib/kunit/test.c b/lib/kunit/test.c index 1c9d8d962d67..87a5d795843b 100644 --- a/lib/kunit/test.c +++ b/lib/kunit/test.c @@ -20,6 +20,8 @@ #include "string-stream.h" #include "try-catch-impl.h" +DEFINE_STATIC_KEY_FALSE(kunit_running); + #if IS_BUILTIN(CONFIG_KUNIT) /* * Fail the current test and print an error message to the log. @@ -615,10 +617,14 @@ int __kunit_test_suites_init(struct kunit_suite * const * const suites, int num_ return 0; } + static_branch_inc(&kunit_running); + for (i = 0; i < num_suites; i++) { kunit_init_suite(suites[i]); kunit_run_tests(suites[i]); } + + static_branch_dec(&kunit_running); return 0; } EXPORT_SYMBOL_GPL(__kunit_test_suites_init); From patchwork Fri Nov 25 08:43:05 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gow X-Patchwork-Id: 25881 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:f944:0:0:0:0:0 with SMTP id q4csp3863088wrr; Fri, 25 Nov 2022 00:54:21 -0800 (PST) X-Google-Smtp-Source: AA0mqf6ZCjQUVDvO3pDBn33JdXiT0gXWpykICvEQT1H7N9zLVTdVxEoCDdowioQN3A87RzRm/Rwf X-Received: by 2002:a63:f408:0:b0:477:bb62:d3d7 with SMTP id g8-20020a63f408000000b00477bb62d3d7mr10050473pgi.375.1669366461412; Fri, 25 Nov 2022 00:54:21 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1669366461; cv=none; d=google.com; s=arc-20160816; b=MU36ReFjGiHSWCTu/2h5Mr10hkDDkJ/+t+gX4fKvbY9BOiPWwcWaIEPt0adTLglL5V 9SISYM6hKiVn5BXxHeQUI8RettRctZBijG9G1aC+iu+E2FE5HXeVs2lOO+ESM4NCPjRY BX6uX7PH6Ul6TcACw8vsqglN6BjrMf2oboZNIvWkMR/2fUMED5hXg5zlX/VVIl9FFvoz tejY7ScXMnD5X25JjZ2hTyG/CdSKWAYH3NintUwvMgW4246Ef4CZpCWQpeNf7vYWDPSu oGVvbCW4d/LktBBcexM1d/MpsQhH/60cNqRx000TWuca76VGZHzAV78nLHxCuWD3lErc HtmQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:dkim-signature; bh=XZjU2MsmtOWFt45ca4T4N4qO/2tLBYtkgkbkS/1130g=; b=WBaWRN6sLJnYoInXLrRGtLRUGRdogDWxPmA5Dk9N8vQaCWVrdtY4G/y285DU3SmAlI qucpxgaRP/ZtIffKY/8q0hGZqYFdKSuXBkvJIWRDY66ZHDQEllyRB3cwiqZHFWAVrJs+ lYlNJcIaAoxnayaUVa1IPZhqc15ack5vR9zG/g5OlgIUjF4vJ5yuPZzieVuM1DEUSLUy hZlgLeN4X3rVEqFQ8vyG8u6p9Gu4/Y9L5WUOGuTqssahJE/2rj5hbEatN84fTK98uzum osPk7D4GTqB8BLMWFIru/8UQRo8djYN3Js4APaabFsZHmdt39bFMgIYXRRFtZcmcl9Hq mwGQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=Jz9X3Gqy; 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=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id t1-20020a635341000000b0046feca13e25si2379037pgl.68.2022.11.25.00.54.08; Fri, 25 Nov 2022 00:54:21 -0800 (PST) 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=@google.com header.s=20210112 header.b=Jz9X3Gqy; 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=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229805AbiKYInf (ORCPT + 99 others); Fri, 25 Nov 2022 03:43:35 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57984 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229791AbiKYInW (ORCPT ); Fri, 25 Nov 2022 03:43:22 -0500 Received: from mail-pl1-x64a.google.com (mail-pl1-x64a.google.com [IPv6:2607:f8b0:4864:20::64a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B7A97220C9 for ; Fri, 25 Nov 2022 00:43:19 -0800 (PST) Received: by mail-pl1-x64a.google.com with SMTP id c1-20020a170902d48100b0018723580343so3136648plg.15 for ; Fri, 25 Nov 2022 00:43:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=XZjU2MsmtOWFt45ca4T4N4qO/2tLBYtkgkbkS/1130g=; b=Jz9X3GqyXfdaQFPAvZus+JfiaUfvrK+PTWtIQ46DEZwX2V1lpUaaEg1rwdRudkxdm/ 2C8Iv/8oOAZdgWfc2j/LWvrirBFeaJ3gusFKX9mamV9+JD+P3jQesXSiTn9AET4ROn+T kRojtpdpAp4L9DjnrtlUeiHFjlGiboo33uvFvuSFEe8Kbf0LhOi/JhBMR303thfHs8Vj S1nwCJ/j0ItiVr6A1msR9FtXwxUiKSxARW16/qW0bSuJc0CtBCV0U+/BkAieYhNxv2vk 7qgcvCrZyWjMwRH806FaXWsKERJ63Fv568yLGX/QFo+6Qir5KUmUtX148QYXEtqJ3ELE jnfA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=XZjU2MsmtOWFt45ca4T4N4qO/2tLBYtkgkbkS/1130g=; b=msYWbiKGQAFM802diACflk+H2B2P8PHY55XoKQLzSTV5aEkUzUPj/bEJc3iDKBapIb /VnhJNWUZ9q2mv1GRx61gCG1RFk8uGwjl5T1vba2Y6RLGayTn8sLWK4Oqy8aFdiMJnGS 1T7pwrvDBCPf5o753aOr/GaAik9v4iYJDpkvpFqn0/9yqvKXGR60LN7I2O8bvn6lAxwf /GPQXHgGVZnGUPqlW/QFeTXqw45kHbWzd9sG1C2t32GENl9yBC1sTNpTpPtSANWLGDO2 tbneeg6Z/3D3bxG6q+olwQlVy4/7j/16wW2NCiiT2gmyJJ28bERaqIb0st/InE0P5/vl ct7g== X-Gm-Message-State: ANoB5pnBnf2tAUO4ivx5KDcEYESjX8jO3J/yZVWHl0pNH/HEGdffKqRx vE/QijN6b7Y4Ew056RuMjznoLifuJt58+A== X-Received: from slicestar.c.googlers.com ([fda3:e722:ac3:cc00:4f:4b78:c0a8:20a1]) (user=davidgow job=sendgmr) by 2002:a62:1582:0:b0:563:f32:2c9d with SMTP id 124-20020a621582000000b005630f322c9dmr17174320pfv.32.1669365799235; Fri, 25 Nov 2022 00:43:19 -0800 (PST) Date: Fri, 25 Nov 2022 16:43:05 +0800 In-Reply-To: <20221125084306.1063074-1-davidgow@google.com> Mime-Version: 1.0 References: <20221125084306.1063074-1-davidgow@google.com> X-Mailer: git-send-email 2.38.1.584.g0f3c55d4c2-goog Message-ID: <20221125084306.1063074-2-davidgow@google.com> Subject: [PATCH v4 2/3] kunit: Use the static key when retrieving the current test From: David Gow To: Brendan Higgins , Daniel Latypov , Shuah Khan Cc: David Gow , kunit-dev@googlegroups.com, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Kees Cook , linux-doc@vger.kernel.org, linux-mm@kvack.org, Jonathan Corbet , Sadiya Kazi X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL 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: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1750457606589667197?= X-GMAIL-MSGID: =?utf-8?q?1750457606589667197?= In order to detect if a KUnit test is running, and to access its context, the 'kunit_test' member of the current task_struct is used. Usually, this is accessed directly or via the kunit_fail_current_task() function. In order to speed up the case where no test is running, add a wrapper, kunit_get_current_test(), which uses the static key to fail early. Equally, Speed up kunit_fail_current_test() by using the static key. This should make it convenient for code to call this unconditionally in fakes or error paths, without worrying that this will slow the code down significantly. If CONFIG_KUNIT=n (or m), this compiles away to nothing. If CONFIG_KUNIT=y, it will compile down to a NOP (on most architectures) if no KUnit test is currently running. Note that kunit_get_current_test() does not work if KUnit is built as a module. This mirrors the existing restriction on kunit_fail_current_test(). Note that the definition of kunit_fail_current_test() still wraps an empty, inline function if KUnit is not built-in. This is to ensure that the printf format string __attribute__ will still work. Also update the documentation to suggest users use the new kunit_get_current_test() function, update the example, and to describe the behaviour when KUnit is disabled better. Cc: Jonathan Corbet Cc: Sadiya Kazi Signed-off-by: David Gow Reviewed-by: Daniel Latypov Reviewed-by: Kees Cook Reviewed-by: Sadiya Kazi --- As-is, the only code which will be directly affected by this (via the kunit_fail_current_test() change) will be UBSAN's KUnit integration. Patches to port other tests to use kunit_get_current_test() will be sent separately (other than the SLUB one in patch 3/3). KASAN in particular are reworking their KUnit tests and integration, so we'll use this in a follow up to avoid introducing a conflict. Changes since v3: https://lore.kernel.org/linux-kselftest/20221119081252.3864249-2-davidgow@google.com/ - Use DECLARE_STATIC_KEY_FALSE() -- Thanks Daniel. - Some documentation rewording to make the behaviour a bit clearer. - Thanks Daniel and Sadiya Changes since v2: https://lore.kernel.org/all/20221025071907.1251820-2-davidgow@google.com/ - Only add kunit_get_current_test() when KUnit is built-in, as the static key isn't available otherwise. - I'm going to try to put together some patches to make things like this available when CONFIG_KUNIT=m in the future. - Also update the documentation to note this. Changes since v1: https://lore.kernel.org/linux-kselftest/20221021072854.333010-2-davidgow@google.com/ - Fix a missing '}' which broke everything. Thanks Kees, kernel test robot. - Add the new kunit_get_current_test() function, as most of the cases where we retrieve the current test (even to fail it) were accessing current->kunit_test directly, not using kunit_fail_current_test(). - Add some documentation comments. - Update the documentation in usage.rst. - The version in tips.rst was not updated, and will be removed: https://lore.kernel.org/linux-kselftest/20221025055844.1231592-1-davidgow@google.com/ --- Documentation/dev-tools/kunit/usage.rst | 30 +++++++++----- include/kunit/test-bug.h | 53 +++++++++++++++++++++++-- 2 files changed, 71 insertions(+), 12 deletions(-) diff --git a/Documentation/dev-tools/kunit/usage.rst b/Documentation/dev-tools/kunit/usage.rst index 22416ebb94ab..48f8196d5aad 100644 --- a/Documentation/dev-tools/kunit/usage.rst +++ b/Documentation/dev-tools/kunit/usage.rst @@ -641,17 +641,23 @@ as shown in next section: *Accessing The Current Test*. Accessing The Current Test -------------------------- -In some cases, we need to call test-only code from outside the test file. -For example, see example in section *Injecting Test-Only Code* or if -we are providing a fake implementation of an ops struct. Using -``kunit_test`` field in ``task_struct``, we can access it via -``current->kunit_test``. +In some cases, we need to call test-only code from outside the test file. This +is helpful, for example, when providing a fake implementation of a function, or +to fail any current test from within an error handler. +We can do this via the ``kunit_test`` field in ``task_struct``, which we can +access using the ``kunit_get_current_test()`` function in ``kunit/test-bug.h``. -The example below includes how to implement "mocking": +``kunit_get_current_test()`` is safe to call even if KUnit is not enabled. If +KUnit is not enabled, was built as a module (``CONFIG_KUNIT=m``), or no test is +running in the current task, it will return ``NULL``. This compiles down to +either a no-op or a static key check, so will have a negligible performance +impact when no test is running. + +The example below uses this to implement a "mock" implementation of a function, ``foo``: .. code-block:: c - #include /* for current */ + #include /* for kunit_get_current_test */ struct test_data { int foo_result; @@ -660,7 +666,7 @@ The example below includes how to implement "mocking": static int fake_foo(int arg) { - struct kunit *test = current->kunit_test; + struct kunit *test = kunit_get_current_test(); struct test_data *test_data = test->priv; KUNIT_EXPECT_EQ(test, test_data->want_foo_called_with, arg); @@ -691,7 +697,7 @@ Each test can have multiple resources which have string names providing the same flexibility as a ``priv`` member, but also, for example, allowing helper functions to create resources without conflicting with each other. It is also possible to define a clean up function for each resource, making it easy to -avoid resource leaks. For more information, see Documentation/dev-tools/kunit/api/test.rst. +avoid resource leaks. For more information, see Documentation/dev-tools/kunit/api/resource.rst. Failing The Current Test ------------------------ @@ -719,3 +725,9 @@ structures as shown below: static void my_debug_function(void) { } #endif +``kunit_fail_current_test()`` is safe to call even if KUnit is not enabled. If +KUnit is not enabled, was built as a module (``CONFIG_KUNIT=m``), or no test is +running in the current task, it will do nothing. This compiles down to either a +no-op or a static key check, so will have a negligible performance impact when +no test is running. + diff --git a/include/kunit/test-bug.h b/include/kunit/test-bug.h index 5fc58081d511..c1b2e14eab64 100644 --- a/include/kunit/test-bug.h +++ b/include/kunit/test-bug.h @@ -9,16 +9,63 @@ #ifndef _KUNIT_TEST_BUG_H #define _KUNIT_TEST_BUG_H -#define kunit_fail_current_test(fmt, ...) \ - __kunit_fail_current_test(__FILE__, __LINE__, fmt, ##__VA_ARGS__) - #if IS_BUILTIN(CONFIG_KUNIT) +#include /* For static branch */ +#include + +/* Static key if KUnit is running any tests. */ +DECLARE_STATIC_KEY_FALSE(kunit_running); + +/** + * kunit_get_current_test() - Return a pointer to the currently running + * KUnit test. + * + * If a KUnit test is running in the current task, returns a pointer to its + * associated struct kunit. This pointer can then be passed to any KUnit + * function or assertion. If no test is running (or a test is running in a + * different task), returns NULL. + * + * This function is safe to call even when KUnit is disabled. If CONFIG_KUNIT + * is not enabled, it will compile down to nothing and will return quickly no + * test is running. + */ +static inline struct kunit *kunit_get_current_test(void) +{ + if (!static_branch_unlikely(&kunit_running)) + return NULL; + + return current->kunit_test; +} + + +/** + * kunit_fail_current_test() - If a KUnit test is running, fail it. + * + * If a KUnit test is running in the current task, mark that test as failed. + * + * This macro will only work if KUnit is built-in (though the tests + * themselves can be modules). Otherwise, it compiles down to nothing. + */ +#define kunit_fail_current_test(fmt, ...) do { \ + if (static_branch_unlikely(&kunit_running)) { \ + __kunit_fail_current_test(__FILE__, __LINE__, \ + fmt, ##__VA_ARGS__); \ + } \ + } while (0) + + extern __printf(3, 4) void __kunit_fail_current_test(const char *file, int line, const char *fmt, ...); #else +static inline struct kunit *kunit_get_current_test(void) { return NULL; } + +/* We define this with an empty helper function so format string warnings work */ +#define kunit_fail_current_test(fmt, ...) \ + __kunit_fail_current_test(__FILE__, __LINE__, fmt, ##__VA_ARGS__) + static inline __printf(3, 4) void __kunit_fail_current_test(const char *file, int line, const char *fmt, ...) { From patchwork Fri Nov 25 08:43:06 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gow X-Patchwork-Id: 25880 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:f944:0:0:0:0:0 with SMTP id q4csp3862492wrr; Fri, 25 Nov 2022 00:52:57 -0800 (PST) X-Google-Smtp-Source: AA0mqf5BRCebUlgqWd8hldyrddkH0L4J9HKq1vsIdGdq19SRrw9D6iaJIKx4cIFz+hPLBr65qW5Q X-Received: by 2002:a63:484a:0:b0:46f:f432:a3fa with SMTP id x10-20020a63484a000000b0046ff432a3famr14689678pgk.125.1669366377295; Fri, 25 Nov 2022 00:52:57 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1669366377; cv=none; d=google.com; s=arc-20160816; b=CZeJntn/j10T8VQzuLn1tDyRdGIMR7zxYkSUtJNvaEhXWj1eLzkGzE/08mq66ArGYP xRtppsjueDMD+ff8u16I8jYM9PRMnPpPhD06tucRRlMTCyW1UtpvC56i1avpOFXK1kZi OeZ1BeNaUKUClufI7ACv3yogGRlIz5iSVd3iyJKZ9HXHKMYeRL+7hsxxdP4Y9QsWyn/h 8D56rj1Ra+QaFgJ+XK0RSp+4kvpBXsxp5ie5khLE6FwBsjLT0W5+mtSKHSFl0fcMT0sY h6BtFjX5ff0mvbfGHQ03f9/tqHvEQ5v9cj6/wxLwY57FoLKy0meW9ZGxz7ovSaIpBiRr SK8w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:dkim-signature; bh=dkxFkrOpjQGLbrLmIP0+FclGqPGzevJvZOLievBv8dk=; b=tz5/QY29sSCVf2ZsdXDcLic3jINCA48eE2/095RiKFtvTYSfD4a+qoku8lBY15YrLj IeEGGTlEfZGeotpvaunBZ5XDA09o/RdyTA7CLwZN1mhB++7MiMCdsQc2XO411/ckVeha J3KtAnvtU0tuOKOqq5IvcXLbGuAj2mH53V2AZqEXA42ACfcYW8eVHFuegiYZgYHSVRCP uMlZfeqF5p16nxQC9i4YgVipLaPeG2aGcNSETbmNEOLTW00VoiVbfXhTPLwfc1VGBc66 QwSFFBtLHr82BonWC34WTNSgRPbfrukZTqLIR9hJr+LHohShHcp2af9jZv1c8zlegZ8V V2Lw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=kqgbzNKE; 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=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id 74-20020a63044d000000b00476a48051edsi3311347pge.476.2022.11.25.00.52.45; Fri, 25 Nov 2022 00:52:57 -0800 (PST) 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=@google.com header.s=20210112 header.b=kqgbzNKE; 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=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229844AbiKYInh (ORCPT + 99 others); Fri, 25 Nov 2022 03:43:37 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58136 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229883AbiKYIn1 (ORCPT ); Fri, 25 Nov 2022 03:43:27 -0500 Received: from mail-pl1-x64a.google.com (mail-pl1-x64a.google.com [IPv6:2607:f8b0:4864:20::64a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 851DA2316B for ; Fri, 25 Nov 2022 00:43:24 -0800 (PST) Received: by mail-pl1-x64a.google.com with SMTP id k17-20020a170902c41100b00189574de829so3153389plk.21 for ; Fri, 25 Nov 2022 00:43:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=dkxFkrOpjQGLbrLmIP0+FclGqPGzevJvZOLievBv8dk=; b=kqgbzNKEz/EBdl30RURuDttaaXxDeC30LnNegyGkFZc9kDj5JRKrZbbcEP9pwVxxZN G9XRyB4jJukMFOoeTGeBeQ3CnM0EbzUy0iVy1MuX2Azm+2w3BQ9adRyL9kvkdnoRUBgI X6bKvh5wnfqjPenjD+9aZ4sKilQcc3HfOGFYHURPQ69pGtxzEdI0XKeB9kAYdbFzp7Bg iV3xmvTGIdnYEq9akRm0/9IGUCEtjMcs+FCtU+t6i2Mn7bMXvKRnkKAJSxnin4lI09Y7 1pZbQEDt8j+6a4aF/rIVEb1uQE3DhbYONBvJrOsxEcU1VcYGwGBsoyKH/GlpFeZvG8ID eajQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=dkxFkrOpjQGLbrLmIP0+FclGqPGzevJvZOLievBv8dk=; b=Gk4FihZdQp3Xt+NZq3akwJgE5S1nVFTeqxO9mVYnKBMz1cSDevsywqAVbUeps4CZFh g3avahh3v8aFeR2CZmt7k+E75Y+0ID7ZrnPDcLLdG1kCNJ8qw6i07HJOyNTXr1VNtIO/ 0pbTlaMu+0fm12CGg5NpZgul1eSyj36BkDBy6/izSB+xtTUOjp2Mkuabkz8rbi2y11kc Pah3Yv26NTgLZrbgvdjOHC9krDum1FpDU75xvHuTQlwFkixVrJfrDviCo6HwxRqEOyH6 Iwrry/iU8UIpFJFK1LOIxYUl96GVQaYIpvBm3McLZClI9p1gJqr9J9WRVslpMITgkdrj 6reQ== X-Gm-Message-State: ANoB5pn+FnwwMupeOuxa554J6LR1WwqfBtWg/uYQ9Fj4L22HtQivXvln 0TlcJoO97OclVZbAmiU3jlxv42GwJlNOjQ== X-Received: from slicestar.c.googlers.com ([fda3:e722:ac3:cc00:4f:4b78:c0a8:20a1]) (user=davidgow job=sendgmr) by 2002:a17:90b:3809:b0:20a:c64c:ae80 with SMTP id mq9-20020a17090b380900b0020ac64cae80mr28596107pjb.12.1669365803760; Fri, 25 Nov 2022 00:43:23 -0800 (PST) Date: Fri, 25 Nov 2022 16:43:06 +0800 In-Reply-To: <20221125084306.1063074-1-davidgow@google.com> Mime-Version: 1.0 References: <20221125084306.1063074-1-davidgow@google.com> X-Mailer: git-send-email 2.38.1.584.g0f3c55d4c2-goog Message-ID: <20221125084306.1063074-3-davidgow@google.com> Subject: [PATCH v4 3/3] mm: slub: test: Use the kunit_get_current_test() function From: David Gow To: Brendan Higgins , Daniel Latypov , Shuah Khan Cc: David Gow , kunit-dev@googlegroups.com, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Kees Cook , linux-doc@vger.kernel.org, linux-mm@kvack.org, Oliver Glitta , Hyeonggon Yoo <42.hyeyoo@gmail.com>, Christoph Lameter , Vlastimil Babka , David Rientjes , Andrew Morton X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=unavailable 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: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1750457518321654492?= X-GMAIL-MSGID: =?utf-8?q?1750457518321654492?= Use the newly-added function kunit_get_current_test() instead of accessing current->kunit_test directly. This function uses a static key to return more quickly when KUnit is enabled, but no tests are actively running. There should therefore be a negligible performance impact to enabling the slub KUnit tests. Other than the performance improvement, this should be a no-op. Cc: Oliver Glitta Cc: Hyeonggon Yoo <42.hyeyoo@gmail.com> Cc: Christoph Lameter Cc: Vlastimil Babka Cc: David Rientjes Cc: Andrew Morton Signed-off-by: David Gow Acked-by: Vlastimil Babka Acked-by: Hyeonggon Yoo <42.hyeyoo@gmail.com> Reviewed-by: Kees Cook --- This is intended as an example use of the new function. Other users (such as KASAN) will be updated separately, as there would otherwise be conflicts. We'll take this whole series via the kselftest/kunit tree. Changes since v3: https://lore.kernel.org/linux-kselftest/20221119081252.3864249-3-davidgow@google.com/ - Add Hyeonggon's Acked-by. Changes since v2: https://lore.kernel.org/all/20221025071907.1251820-3-davidgow@google.com/ - Get rid of a redundant 'likely' (Thanks Vlastimil Babka) - Use current->kunit_test directly when we already know a test is running. (Thanks Vlastimil Babka) - Add Vlastimil's Acked-by. There was no v1 of this patch. v1 of the series can be found here: https://lore.kernel.org/linux-kselftest/20221021072854.333010-1-davidgow@google.com/T/#u Cheers, -- David --- lib/slub_kunit.c | 1 + mm/slub.c | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/slub_kunit.c b/lib/slub_kunit.c index 7a0564d7cb7a..8fd19c8301ad 100644 --- a/lib/slub_kunit.c +++ b/lib/slub_kunit.c @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-2.0 #include +#include #include #include #include diff --git a/mm/slub.c b/mm/slub.c index 157527d7101b..1887996cb703 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -39,6 +39,7 @@ #include #include #include +#include #include #include @@ -603,7 +604,7 @@ static bool slab_add_kunit_errors(void) { struct kunit_resource *resource; - if (likely(!current->kunit_test)) + if (!kunit_get_current_test()) return false; resource = kunit_find_named_resource(current->kunit_test, "slab_errors");