From patchwork Tue Oct 25 07:19: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: 13018611 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 54FA9C38A2D for ; Tue, 25 Oct 2022 07:19:22 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id C089580008; Tue, 25 Oct 2022 03:19:21 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id BB79780007; Tue, 25 Oct 2022 03:19:21 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id A7F6F80008; Tue, 25 Oct 2022 03:19:21 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id 8E49780007 for ; Tue, 25 Oct 2022 03:19:21 -0400 (EDT) Received: from smtpin06.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id 385F4AB334 for ; Tue, 25 Oct 2022 07:19:21 +0000 (UTC) X-FDA: 80058620922.06.2A4CB2F Received: from mail-yb1-f202.google.com (mail-yb1-f202.google.com [209.85.219.202]) by imf03.hostedemail.com (Postfix) with ESMTP id D07642002C for ; Tue, 25 Oct 2022 07:19:20 +0000 (UTC) Received: by mail-yb1-f202.google.com with SMTP id d8-20020a25bc48000000b00680651cf051so11253823ybk.23 for ; Tue, 25 Oct 2022 00:19:20 -0700 (PDT) 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=Tg+2eIYV8Ht6XVdDxVGWgiFGyJrz8FeDTVg6oxA83to=; b=N20hIBljO9B2x5fTp2LgIWIJ6EaOGsk8PztwvAmRhr/ICL8s2SDtYc8Xej+kchGmum RO8n9j1w+WKDCz7oFgqPc2IdvBYxzjByNjkm4hxwVX+FcssRWGWyfKDGaBXlpNHd/ESd w53SmUZL8Apz9MpYSTDJwmcgtyACqeyETGmVKhgDL1+oWIiKfB8MKRr+LXaBk3NwQMSq S59QO27GUgYRSNVlxuBn8eg+5y6oeZVK8xiN8MecuKy51E1BGP8PDElLUtQgOdAZ3oz6 M198xDTBoLYhZB6crv2JTgJMdFBDEkWmU+VOD3su3teMa0VAyK1zEM0iSqeyadiML47h /9QA== 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=Tg+2eIYV8Ht6XVdDxVGWgiFGyJrz8FeDTVg6oxA83to=; b=lBen+AGQRmz40iYH+9KJeaBqgoM/FIVMAWZNW/Qp1kllYW8D7/oozilEMesh0zno+8 ohP+86ecYv25tHq5zh65+6qMpAbbD4MeNiuWWtWNUmsG11dHSzj+xAU42PxiUqligHGA bM9Xm/B8GJhsWTyQS/UuQ8ZsEu5O2+MQYh2lW9eq5VRy4zdtT9VAL3ohIUOqevUIRYXB wcFhl5zC4xCV2Z7VMlkYZXgT9I9gEg7gn/27+Wk3nKVyc8yeKygS7Cg+UC2e6+NSvN3z OFny4oCR4tVJRt5z13xbS6keiMJI0RKkEbG9T5WaSdy/4w4WLkRyBA/DcNToT9Eo3swD BJOA== X-Gm-Message-State: ACrzQf1SmgV73icnMzjBcl16X8RdhGuRrTWPu8JPXj8ax44PqpIwKsMU AR3dBEMb22Kjz8g+Wi6p0BLwGlfjvvcMFg== X-Google-Smtp-Source: AMsMyM4EBhOMZUTQa08gGVH5ZMe4v1UYMJ1yyiUBna1Fp9X+01+i+YQcjjUKRz2D67kIhfv/nu3VhoLywHoY0A== X-Received: from slicestar.c.googlers.com ([fda3:e722:ac3:cc00:4f:4b78:c0a8:20a1]) (user=davidgow job=sendgmr) by 2002:a25:b749:0:b0:68f:171f:96bd with SMTP id e9-20020a25b749000000b0068f171f96bdmr34115629ybm.137.1666682360070; Tue, 25 Oct 2022 00:19:20 -0700 (PDT) Date: Tue, 25 Oct 2022 15:19:05 +0800 Mime-Version: 1.0 X-Mailer: git-send-email 2.38.0.135.g90850a2211-goog Message-ID: <20221025071907.1251820-1-davidgow@google.com> Subject: [PATCH v2 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 ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1666682360; a=rsa-sha256; cv=none; b=Q7UaeQPjxzVVO1Zlo0t+VYuF/RtiQunYgrzfvCV9tVejJvYvvQEbrHj9J90oR0FDEkV2ik wKhgQHIVzqSHRkZndCKjy2BXtejjtBZ6V4AKwQwu5MlSohMiYgdB6+xzYu56K/5vYhJDlp KZcsoVkc0Ozrt4yQdcqSLk6+M8/QXQc= ARC-Authentication-Results: i=1; imf03.hostedemail.com; dkim=pass header.d=google.com header.s=20210112 header.b=N20hIBlj; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf03.hostedemail.com: domain of 3-I1XYwgKCJM0xI503BJ3BB381.zB985AHK-997Ixz7.BE3@flex--davidgow.bounces.google.com designates 209.85.219.202 as permitted sender) smtp.mailfrom=3-I1XYwgKCJM0xI503BJ3BB381.zB985AHK-997Ixz7.BE3@flex--davidgow.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1666682360; 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-type:content-transfer-encoding:in-reply-to: references:dkim-signature; bh=Tg+2eIYV8Ht6XVdDxVGWgiFGyJrz8FeDTVg6oxA83to=; b=NGZfyKOp44VrWJTfCbob2KJBq8bsVvVOniysf/X/gRhykCGbtT/K/LAy/jdFFIb1AOg41E V8tEVKe3N58j7JgYYLyTsXMynH926I3JwWNCWObUEl4RLZTbfUbU9qoKpusJADVbyw8L83 8C0saW2TWe87HkyKYRmDkNf2XY/uYXQ= X-Rspamd-Server: rspam09 X-Rspamd-Queue-Id: D07642002C X-Rspam-User: Authentication-Results: imf03.hostedemail.com; dkim=pass header.d=google.com header.s=20210112 header.b=N20hIBlj; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf03.hostedemail.com: domain of 3-I1XYwgKCJM0xI503BJ3BB381.zB985AHK-997Ixz7.BE3@flex--davidgow.bounces.google.com designates 209.85.219.202 as permitted sender) smtp.mailfrom=3-I1XYwgKCJM0xI503BJ3BB381.zB985AHK-997Ixz7.BE3@flex--davidgow.bounces.google.com X-Stat-Signature: 83bu37dwtojs65ffj1guug5rd9bq6xpg X-HE-Tag: 1666682360-739158 X-Bogosity: Ham, tests=bogofilter, spamicity=0.003758, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: 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 --- 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 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 b1ab6b32216d..450a778a039e 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 */ +extern struct 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 90640a43cf62..314717b63080 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. @@ -612,10 +614,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 Tue Oct 25 07:19: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: 13018612 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 C0E8CC04A95 for ; Tue, 25 Oct 2022 07:19:26 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 466B480009; Tue, 25 Oct 2022 03:19:26 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 4164180007; Tue, 25 Oct 2022 03:19:26 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 2B75180009; Tue, 25 Oct 2022 03:19:26 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id 17AA380007 for ; Tue, 25 Oct 2022 03:19:26 -0400 (EDT) Received: from smtpin28.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id DD450AB2FB for ; Tue, 25 Oct 2022 07:19:25 +0000 (UTC) X-FDA: 80058621090.28.FA6BC58 Received: from mail-yw1-f201.google.com (mail-yw1-f201.google.com [209.85.128.201]) by imf08.hostedemail.com (Postfix) with ESMTP id 9518E160004 for ; Tue, 25 Oct 2022 07:19:25 +0000 (UTC) Received: by mail-yw1-f201.google.com with SMTP id 00721157ae682-349423f04dbso111785257b3.13 for ; Tue, 25 Oct 2022 00:19:25 -0700 (PDT) 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=TSSlU0WBF0cN+y9B6p4hl7aqwNlQFVfaKcc/sTiVTfk=; b=E3PupdkStZtJB4puC3t+1GP+0h5T91gRco+SuJL2Nn9UlYfQn3vEADEUzpLKj99yAV wsQJJv5DrRAjuD5O6Lv3b4s7WfP2Rd6UPWgtZHWiv9LZSrLOUVrlJTvkePyLP0EUZTcp iBsyGqpKBPHFcwsj2H5GsWT0t6fZRoFC7qIBuB4nnKD+/Rj49giGUB/dcIihCs0taa14 noAYF9r2FlZEMPEiYV5oeCAI0TS9HTqz/LQBm+yvMY6QUMkJaeDr+2P/RJnGOOJlwWG5 cXHXdJIv0fwgaBR0jTEEf4PqBPouf1hGx39el2Bk9A3NyD7j+LtCP/0WF5qbst2k/jDi SVYQ== 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=TSSlU0WBF0cN+y9B6p4hl7aqwNlQFVfaKcc/sTiVTfk=; b=3CIPU1B3H3WeFIXEs8UhWIE7XIY34QA9Px37/ZG6bnQgwa6JewXUalHXFrxzmwDuN1 ROfAE3i9v5lmfkNCrmFOxKiMQL6WOnthUf8Z6V1og1B2xYH5S1uYA/nKAdTsezByEQf0 dM2s+xGegoyWrOhxlTCI+Ni8lyJyN48oUq0BW6dxVVKuyspwgFiOsiEynJYLQIyH+Jyi CZWTEOp4KFazC9Zru83R943ehmaceSX0xpG0gBe4WpKfd0R+/dKp0+sMgQ7sdFoCN+8V KiCfXYLaALKJnnuJ7XklCazEvp7QTuose6pmdidm4RnitJ9rhnDPWaSGTxa5ePLxuoRd 59wA== X-Gm-Message-State: ACrzQf0CGUx/0CODEW1tGnRCqJ/rI2qDpYlkFo9kxO/YakkJf/VP2fHU v40p3HTbXtDBWLBdnyuJFTBC6C9Pk8s4oA== X-Google-Smtp-Source: AMsMyM6hNNuzHALoBFLZ84Pekxx+FlgGWyUSoVqgmLCbI0lJ8nexXeM1yBZx8g9SsnU1cHrZ4PFi0Xd1CdmYFg== X-Received: from slicestar.c.googlers.com ([fda3:e722:ac3:cc00:4f:4b78:c0a8:20a1]) (user=davidgow job=sendgmr) by 2002:a25:f205:0:b0:6af:ffab:9cfd with SMTP id i5-20020a25f205000000b006afffab9cfdmr33741860ybe.256.1666682364912; Tue, 25 Oct 2022 00:19:24 -0700 (PDT) Date: Tue, 25 Oct 2022 15:19:06 +0800 In-Reply-To: <20221025071907.1251820-1-davidgow@google.com> Mime-Version: 1.0 References: <20221025071907.1251820-1-davidgow@google.com> X-Mailer: git-send-email 2.38.0.135.g90850a2211-goog Message-ID: <20221025071907.1251820-2-davidgow@google.com> Subject: [PATCH v2 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 ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1666682365; a=rsa-sha256; cv=none; b=w2q9ITIl+AKTdAHMHQ9szUv14uU7taN6OLFWwqMvSoOw1NJ8+jgs05ELcFFR1WzuC6qVdY TLSpDscJiPVTOKW6FibVwI8p34shWdmlaLIFwYKEooaEq3Ojb8NhEgFr0MPVnlnKdBMeN9 0/KvRKOcHsDFwFnQQRaTT3SG2fE4yBk= ARC-Authentication-Results: i=1; imf08.hostedemail.com; dkim=pass header.d=google.com header.s=20210112 header.b=E3PupdkS; spf=pass (imf08.hostedemail.com: domain of 3_I1XYwgKCJc41M947FN7FF7C5.3FDC9ELO-DDBM13B.FI7@flex--davidgow.bounces.google.com designates 209.85.128.201 as permitted sender) smtp.mailfrom=3_I1XYwgKCJc41M947FN7FF7C5.3FDC9ELO-DDBM13B.FI7@flex--davidgow.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1666682365; 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-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=TSSlU0WBF0cN+y9B6p4hl7aqwNlQFVfaKcc/sTiVTfk=; b=T9FK7VFVa94DG7JO7DzL8zOragG6U8kMxya9t69OpjJ2Dw4x44gv6kcqB1sWy20O6llpxC zEM1LNPBWZI4cM+YreoFSwk1SIoYduylATHGx4tktQHR/Lfm4o5B491tUO1fpp3myZgZNO ZfDUmDKoxuTn+eQ1ajCV7SwlFmDyzW8= X-Stat-Signature: wehi8ja66xcwdpp34p8b1rnfugfsxo7o X-Rspamd-Queue-Id: 9518E160004 Authentication-Results: imf08.hostedemail.com; dkim=pass header.d=google.com header.s=20210112 header.b=E3PupdkS; spf=pass (imf08.hostedemail.com: domain of 3_I1XYwgKCJc41M947FN7FF7C5.3FDC9ELO-DDBM13B.FI7@flex--davidgow.bounces.google.com designates 209.85.128.201 as permitted sender) smtp.mailfrom=3_I1XYwgKCJc41M947FN7FF7C5.3FDC9ELO-DDBM13B.FI7@flex--davidgow.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com X-Rspam-User: X-Rspamd-Server: rspam05 X-HE-Tag: 1666682365-200178 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: 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, 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. kunit_fail_current_test() does not work if KUnit itself is built as a module, though this is a pre-existing limitation. 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 --- 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 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 | 24 +++++++---- include/kunit/test-bug.h | 56 ++++++++++++++++++++++++- 2 files changed, 69 insertions(+), 11 deletions(-) diff --git a/Documentation/dev-tools/kunit/usage.rst b/Documentation/dev-tools/kunit/usage.rst index 2737863ef365..05786564b968 100644 --- a/Documentation/dev-tools/kunit/usage.rst +++ b/Documentation/dev-tools/kunit/usage.rst @@ -625,17 +625,20 @@ 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, +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 disabled, or no test is running in the current task, it will quickly return ``NULL``. + +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; @@ -644,7 +647,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); @@ -675,7 +678,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 ------------------------ @@ -703,3 +706,6 @@ structures as shown below: static void my_debug_function(void) { } #endif +Note that ``kunit_fail_current_test`` requires KUnit be built-in to the kernel, i.e. +``CONFIG_KUNIT=y``. It is safe to call even if KUnit is not enabled, is built as a module, +or no test is currently running, but will do nothing. \ No newline at end of file diff --git a/include/kunit/test-bug.h b/include/kunit/test-bug.h index 5fc58081d511..85b085030a7a 100644 --- a/include/kunit/test-bug.h +++ b/include/kunit/test-bug.h @@ -9,16 +9,68 @@ #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_ENABLED(CONFIG_KUNIT) + +#include /* For static branch */ +#include + +/* Static key if KUnit is running any tests. */ +extern struct 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, which 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: it will compile + * down to nothing if CONFIG_KUNIT is not enabled, and will be very fast if + * 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; +} + +#else + +static inline struct kunit *kunit_get_current_test(void) { return NULL; } + +#endif #if IS_BUILTIN(CONFIG_KUNIT) +/** + * 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 +/* 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 Tue Oct 25 07:19:07 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gow X-Patchwork-Id: 13018613 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 D8DBDC04A95 for ; Tue, 25 Oct 2022 07:19:32 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 6FE428000A; Tue, 25 Oct 2022 03:19:32 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 6AE9680007; Tue, 25 Oct 2022 03:19:32 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 576758000A; Tue, 25 Oct 2022 03:19:32 -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 4157980007 for ; Tue, 25 Oct 2022 03:19:32 -0400 (EDT) Received: from smtpin03.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 01530160D21 for ; Tue, 25 Oct 2022 07:19:31 +0000 (UTC) X-FDA: 80058621384.03.F794D9A Received: from mail-yw1-f201.google.com (mail-yw1-f201.google.com [209.85.128.201]) by imf14.hostedemail.com (Postfix) with ESMTP id B2F41100031 for ; Tue, 25 Oct 2022 07:19:30 +0000 (UTC) Received: by mail-yw1-f201.google.com with SMTP id 00721157ae682-36ab1ae386bso80357787b3.16 for ; Tue, 25 Oct 2022 00:19:30 -0700 (PDT) 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=KA5AmQjfCAbtpdHkGDjwVts9T7CuDkkry+0zPgKF0lM=; b=ho9NvHEqLfDplAjRx3uXKJiU3DoSROQtKqQ8jRhFd0Ck3bp2UOpw8N9lYdxjatKuYv co/P5Nk6CLcK/+U9EK4lL66rumOXMbWTwndY1+zqeBCGNIjWtMZexvP1r8fzZLGhIbkU URsp7CuLP4czyMYdx7nshdoj5wFvyKDgBctnpRho0U/7PipKMJWU+msjlZHwvoClSw6O EvgkK+rfUfDrf/fynysJgKuFNt/SnjNJ/7x0wc8t7u3GvmcbGHIzDOGamTDQO4RMxpdU hh8nQ1fXv3LVNN0nD4AItp5Or8XNWSODER0ITRmk2Az9YLODBHDSLXNZo3mhj/LYKCQs eyxw== 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=KA5AmQjfCAbtpdHkGDjwVts9T7CuDkkry+0zPgKF0lM=; b=wnKD4O4HZ3etI37iVB6KyTnH7VUK+K2ZIQjGJNxXo9SblnxKCsyS69iZgrkpWm4/A7 5I44ROpO3RIzWV753+sshnm/DJINbZHE19TZQm88H4wLSeuEG+dXx5+OeWR3uMGjzkKT enubRoSa3p/HF3fzRUxfZXnbWF82eEaPLOm/bFMR/dCx0Z56E2mGsUQp8j18SyowqIsz /f3w8NtgjLGRv3NxSb+ToUAtSjJ0gMcipRq960bPP0JjCNKVUwGpr3YWZTOhrHa/NNsl Ngyc0Z29BGFEJye7Q5v34MfOYkcOdIWSrrVExcURDz0BCRk7Iudrh3ZnNRJrlqDbognr BqoA== X-Gm-Message-State: ACrzQf2I1DRprFfApoYYkG1vZNfljul7KKDpk/xC6RpcekF7m7Re8gzb t27SR+0i3O00HrP4J1kVtZwXfNd0dHAi1g== X-Google-Smtp-Source: AMsMyM6F8n0cf6ZN6EOjJAyPYC15rg0ifDjy+Yi3k90H65/ao6P/DBifaGO+L8XRdtun64inb2rPoXzES3FOCQ== X-Received: from slicestar.c.googlers.com ([fda3:e722:ac3:cc00:4f:4b78:c0a8:20a1]) (user=davidgow job=sendgmr) by 2002:a81:6907:0:b0:34a:51ce:3b38 with SMTP id e7-20020a816907000000b0034a51ce3b38mr32787158ywc.151.1666682369948; Tue, 25 Oct 2022 00:19:29 -0700 (PDT) Date: Tue, 25 Oct 2022 15:19:07 +0800 In-Reply-To: <20221025071907.1251820-1-davidgow@google.com> Mime-Version: 1.0 References: <20221025071907.1251820-1-davidgow@google.com> X-Mailer: git-send-email 2.38.0.135.g90850a2211-goog Message-ID: <20221025071907.1251820-3-davidgow@google.com> Subject: [PATCH v2 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 ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1666682370; 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-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=KA5AmQjfCAbtpdHkGDjwVts9T7CuDkkry+0zPgKF0lM=; b=Wi3Q+82ujBfix/pHlvHqLxQGGZcv5YksZGDRVLRZY8zopiKbwFbVQ5uj0TpPsC4MaAyTJN gcjkRXvWCadkuS1xZriMrjWmcb5k29PbIeEvtbTHQfuXnBE4feDKebYODGQUgoPc+xAVhV 80xjpCtVaoHctPZtHDA3MiJknjVa+z0= ARC-Authentication-Results: i=1; imf14.hostedemail.com; dkim=pass header.d=google.com header.s=20210112 header.b=ho9NvHEq; spf=pass (imf14.hostedemail.com: domain of 3AY5XYwgKCJw96RE9CKSCKKCHA.8KIHEJQT-IIGR68G.KNC@flex--davidgow.bounces.google.com designates 209.85.128.201 as permitted sender) smtp.mailfrom=3AY5XYwgKCJw96RE9CKSCKKCHA.8KIHEJQT-IIGR68G.KNC@flex--davidgow.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1666682370; a=rsa-sha256; cv=none; b=C4CKqiQ5AXAQOlSFyGcSJlIsK54vRkC9KYf1YJBDTuPKFtwAJJJuDhtbrqQ2byQLYwzS1+ cktwqWsQVI9uslm5KuSDLy96Ack40SPH7/JRFD1N8yCpx35IrfyI2NUQrmlv6FMjrMnIPo 14xoKrKv1TtU4PYVHIiON48a7LfClaE= X-Rspamd-Queue-Id: B2F41100031 Authentication-Results: imf14.hostedemail.com; dkim=pass header.d=google.com header.s=20210112 header.b=ho9NvHEq; spf=pass (imf14.hostedemail.com: domain of 3AY5XYwgKCJw96RE9CKSCKKCHA.8KIHEJQT-IIGR68G.KNC@flex--davidgow.bounces.google.com designates 209.85.128.201 as permitted sender) smtp.mailfrom=3AY5XYwgKCJw96RE9CKSCKKCHA.8KIHEJQT-IIGR68G.KNC@flex--davidgow.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com X-Rspam-User: X-Rspamd-Server: rspam10 X-Stat-Signature: f4m3waxsxhxmo54y5u3wdxjp78pax3o8 X-HE-Tag: 1666682370-14448 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: 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 --- 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. Assuming there are no objections, we'll take this whole series via the kselftest/kunit tree. 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 --- lib/slub_kunit.c | 1 + mm/slub.c | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) 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..15d10d250ef2 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -39,6 +39,7 @@ #include #include #include +#include #include #include @@ -603,10 +604,10 @@ static bool slab_add_kunit_errors(void) { struct kunit_resource *resource; - if (likely(!current->kunit_test)) + if (likely(!kunit_get_current_test())) return false; - resource = kunit_find_named_resource(current->kunit_test, "slab_errors"); + resource = kunit_find_named_resource(kunit_get_current_test(), "slab_errors"); if (!resource) return false;