From patchwork Sat Nov 19 08:12:50 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gow X-Patchwork-Id: 23232 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:f944:0:0:0:0:0 with SMTP id q4csp608632wrr; Sat, 19 Nov 2022 00:15:00 -0800 (PST) X-Google-Smtp-Source: AA0mqf5gaTE9XcaQQsfapnPyEwS4AbLJ2DUWvwAjmhImCmg4RmPgsIhp831f0u8A4SRcFkkiQUlJ X-Received: by 2002:a17:906:5050:b0:7b2:8f2c:a877 with SMTP id e16-20020a170906505000b007b28f2ca877mr8365644ejk.90.1668845700168; Sat, 19 Nov 2022 00:15:00 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1668845700; cv=none; d=google.com; s=arc-20160816; b=yriUfgacYWa4vmzVVxenNDMzvNlulGtrUzNlpSoU/N2IEixnuUmraz193JTD0oikzj 5uWfGLMinK5f7I8Xz4aiJEIk8yFfLPJgK+JhGSiuv+ArQ25FxaobmSr5w7/0PwH5ZazL VG1M8IfggGrcgZ92VYDaaFEjpoCn3Dlq0fdDkpnbUP85Y4YIT+S5qymY1ZE7ye+HnaAv DpmVA1LhjUvE9LTnZakOOd+1S30zVXw6K47KYdYJbLKCd5+XTEMNY59pWAQrjVS2j+H5 HRL0KuFew9A9cV2mr3KW2vpPt7ksMkjcqKipYSYtRVoo81GdLSRSSCb238M1NSX5VQeA qLQg== 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=mxlxAlM6/dget+xcMGAu2YOt8fNlUAK4C29Oqcd00C8=; b=l/X/2+CypTMhbLs3gLPVvg8/6Z/kzCzqK2cMirgdWAOGyQTjdACPdAYiWqLy47eN5b 7XrRfMqDrJtKvSLj9aLsfNQ3nzV1Dz53ja22GwFP7phIZAzArJgxEzC6kxApRBKEFwl7 CjpJo0U1XSpaHqQsivo1I4jiBaANscOEV/LwxSUKI0fPUfFeFapyskWT8/IVLOiL5QPx MdyljKrM0fQYtgcx0zFoH60eDKGstB1w/FGKeHirxIc256aDQg31m/f5hQmQp7Zf2+GH YEq6ewQ+1jIoHoDVf/iaHiZgHyqzBHrAQWIXvdKuk8iIuKd1s/c7F0eWMWwBiTEaULDe Yh9Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=IcwXafex; 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 n11-20020a170906118b00b007ae4c686a4esi3812330eja.159.2022.11.19.00.14.36; Sat, 19 Nov 2022 00:15:00 -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=IcwXafex; 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 S230424AbiKSINF (ORCPT + 99 others); Sat, 19 Nov 2022 03:13:05 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33152 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229836AbiKSIND (ORCPT ); Sat, 19 Nov 2022 03:13:03 -0500 Received: from mail-yw1-x1149.google.com (mail-yw1-x1149.google.com [IPv6:2607:f8b0:4864:20::1149]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BED0F7DED2 for ; Sat, 19 Nov 2022 00:13:00 -0800 (PST) Received: by mail-yw1-x1149.google.com with SMTP id 00721157ae682-391842a55d6so61368837b3.0 for ; Sat, 19 Nov 2022 00:13:00 -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=mxlxAlM6/dget+xcMGAu2YOt8fNlUAK4C29Oqcd00C8=; b=IcwXafexRAl664jaBoJyAa5mMQYLIYMkPXwqAvZb6o4ue+mpDnBlE0xs0UzTUu6YrL J/64TUXc9QJcwIpZb9Yj/DCH6Dwppd6ZMkmAPNMO9NLSQpa+UGz749sgxZn2x0YkNUIf LXPeai2EGngQkB7CfGiliNP7pMyGOorEuwIKH7/iimSqlhTNe9/StKThGkjm1J478yQT FjE1xZ26fMXjtNwEj/vs994FgwWwhpqoI2BaovX8NQreDY9YAYWcG+493mAuAS7O7+Dr a5zzfXgoWCsjb0963b6N3+kOMQOwst8wLhiAngZj5t5raxaGfEX5swv2inf1I1yUiP9c uOiA== 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=mxlxAlM6/dget+xcMGAu2YOt8fNlUAK4C29Oqcd00C8=; b=XR1Pdv0rNX6e03bLDDZYxe5tSrGWLUZUeaH5MDiJ7PHDaMqQBgbUCorM3tzU/ataNK 6rfbzqdl/Eek15LtZzpM83kERTFAkHlns6vxVEmYzg+xKfeVcd2MbU8YQzyjGQM8IMSK YRaNiwzmmKxof5HH0QPkS4YQr3RO7bPYyOyFAD1rnS23leH8KHLLXX3VoFTk4sVBMwZ6 5AUAF8cYB3t8zZ0jp2XL07iTEV6Etm3puZaa/eh9JoMozWppEYY7gTXmAf6GqKu7kKbX T+/RlhB1H5qo6rmpXV7zZitnjcz+DndHt51NBMLaLv+dWcN0iLQN0PfRst98arKGZPez cDEg== X-Gm-Message-State: ANoB5pnZhw7yVZIe2aBYzYOd0viQUSGXfH9eIe/tK8911ozHiwn0gVv2 SeKrorNoStkYHvT8kcmZE8t8iZzK9VOuGw== X-Received: from slicestar.c.googlers.com ([fda3:e722:ac3:cc00:4f:4b78:c0a8:20a1]) (user=davidgow job=sendgmr) by 2002:a25:e807:0:b0:6ca:21b3:42ec with SMTP id k7-20020a25e807000000b006ca21b342ecmr9916189ybd.398.1668845579853; Sat, 19 Nov 2022 00:12:59 -0800 (PST) Date: Sat, 19 Nov 2022 16:12:50 +0800 Mime-Version: 1.0 X-Mailer: git-send-email 2.38.1.584.g0f3c55d4c2-goog Message-ID: <20221119081252.3864249-1-davidgow@google.com> Subject: [PATCH v3 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?1749911548875576796?= X-GMAIL-MSGID: =?utf-8?q?1749911548875576796?= 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 --- 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. 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 d7f60e8aab30..b948c32a7b6b 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 Sat Nov 19 08:12:51 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gow X-Patchwork-Id: 23233 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:f944:0:0:0:0:0 with SMTP id q4csp608644wrr; Sat, 19 Nov 2022 00:15:01 -0800 (PST) X-Google-Smtp-Source: AA0mqf7COBp8L2H+TBSQKBPR/UuF4KsHmQl2Anw3xY2mUzXfnuNpM1qmMUg65Evl/tq9j3m1gjpG X-Received: by 2002:a17:906:3096:b0:7ae:eae9:25a5 with SMTP id 22-20020a170906309600b007aeeae925a5mr8817218ejv.394.1668845701580; Sat, 19 Nov 2022 00:15:01 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1668845701; cv=none; d=google.com; s=arc-20160816; b=yUfsK5TQ+5V4sMzEVBXLgVi94WnmF9KXXy0E6lPoNyuLNwRyeF3rstC/IsVht3HRLP BB2fuuOWRM8ce52OwMSJfcDnR5RMIxaCbkXlQTd9/Lqokee8fc0vdnq+XingKdHNPQ11 xGgW8Z9ez9LGap7S8KUNVF5e/cE0TTulppOJRXHPEmxRsszBbpUcLrl5tuhLCNCAPauD BzyWHrreM6RtyfXCWzxicJnDbWNgpnFnVNsq0liPz7ZkzXRAsSnxFJ5hSvMLbrf3kaJp m4u7vNMonYnzv3FMgVO8E+L3DZPUoUYGmpGCKQJqQuAtRHbpJJea+Nb4iPuksiCx3+2R kZag== 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=EQq0YjZ1txdSpkL6jAisYu5mB9Yl+atKGSU09uhepI4=; b=PV4PP8bJyL3CEioxOeNGdO0Klcck721Yxn5tNKnJfd66CJIQzhJ4+hvvW2MXtowBuk yGC0FScgD4PlTGo8JoaDLFVIi1yDsDFPEK/GiLvaYjFKVTQhxyg2jcCQtWIEgN5+7F74 AIy6XDVpfe2tnl6cKwq9fdDzHlym8CQ/YA1PJvcvDVCvcSCuZVUUx4hJHZ3//rY6zWM5 8LyktDg5CycdVYxcIOikJKk3aLFprafyuaL02JqrLH2KnOEK5U+npBL+P0jlZsjC4O9Z k3Y5sqD8OwQ+8+BraZ6nkcL7ztZvptDcQdBYqSPaTTEymNIRlrJZrmiPP++Cy4uggAfD NDaw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=QtwcUhML; 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 h2-20020a056402280200b004672f952b7asi5371440ede.203.2022.11.19.00.14.38; Sat, 19 Nov 2022 00:15:01 -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=QtwcUhML; 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 S232089AbiKSINK (ORCPT + 99 others); Sat, 19 Nov 2022 03:13:10 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33192 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230466AbiKSING (ORCPT ); Sat, 19 Nov 2022 03:13:06 -0500 Received: from mail-pg1-x549.google.com (mail-pg1-x549.google.com [IPv6:2607:f8b0:4864:20::549]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D13947DECD for ; Sat, 19 Nov 2022 00:13:04 -0800 (PST) Received: by mail-pg1-x549.google.com with SMTP id i19-20020a63e913000000b004705d1506a6so4318653pgh.13 for ; Sat, 19 Nov 2022 00:13:04 -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=EQq0YjZ1txdSpkL6jAisYu5mB9Yl+atKGSU09uhepI4=; b=QtwcUhMLxxlhu63SCsIAZikJ2Cdiebecyw7uTINwtFeToqE0Lb06WSDNRW39Qb9VaT sri0U30v930zgfNas2Ehhu8wEUyD4634+IIW4XBvcADtCMEj/kAOWnEe2YRAMRZ/z+j7 rcwduzeq7GDD2QYV/9UEmfvln20obiZruXwKlHwf4R0BKpT/11tHduTVJOXFlxQXL7H7 fEmqpxkTRIn4LKMBn+T0eDeGYInqOKpNF/4Y8ra0U+e2wb5dlg0+bGIlkmAiG8W9UeZQ 7tovm0gHb5llKcwh5cPdiCYL9uRRFEM1ZOJA3pAHIW4yMfTYS0Va+cOLdN8ts8g1RJae KNkA== 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=EQq0YjZ1txdSpkL6jAisYu5mB9Yl+atKGSU09uhepI4=; b=I29I6SGZLyZqaCutyNZ9x1Xexnzy27hgrQwRDT34VJ5hTxoOeoGNSrx2RRNaiyhwPT dwFbRQyFXqQzaNuxHbnKz8r7qD6nL7bWaPbO6j5fLg120+gYPelVyj+N2iBlagNwzDdq dyUXt/qpm/jZVvjMP7vGim1AUcu6PxiYPyUy60U/kdFJo62Xp6r2T9+tQE0iddjOL5lC 3jtg3c3QpqTUQ2+LX4jypiQgrHNViXmBOVA1muBq3GjH3/YLleLaE1R5dLhhP5c1QS0j aBMSfKt00V5WRpmZzvk/G3lFqjdQuy22r0TTwZFvzpAa7k6pVovzH0G/lFcxk7Th3gVz yDXA== X-Gm-Message-State: ANoB5pnPTPl3KWDkN14/vM9zydmjo4aQimiCnzwA442fdabC8XH8yGaL 8aN7kwBI/boghcaeTYBEJtslqyGYPvYWkQ== X-Received: from slicestar.c.googlers.com ([fda3:e722:ac3:cc00:4f:4b78:c0a8:20a1]) (user=davidgow job=sendgmr) by 2002:a17:90b:3941:b0:215:db2e:bb17 with SMTP id oe1-20020a17090b394100b00215db2ebb17mr11493335pjb.166.1668845584292; Sat, 19 Nov 2022 00:13:04 -0800 (PST) Date: Sat, 19 Nov 2022 16:12:51 +0800 In-Reply-To: <20221119081252.3864249-1-davidgow@google.com> Mime-Version: 1.0 References: <20221119081252.3864249-1-davidgow@google.com> X-Mailer: git-send-email 2.38.1.584.g0f3c55d4c2-goog Message-ID: <20221119081252.3864249-2-davidgow@google.com> Subject: [PATCH v3 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?1749911550262325462?= X-GMAIL-MSGID: =?utf-8?q?1749911550262325462?= 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 --- 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 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 | 25 +++++++----- include/kunit/test-bug.h | 53 +++++++++++++++++++++++-- 2 files changed, 66 insertions(+), 12 deletions(-) diff --git a/Documentation/dev-tools/kunit/usage.rst b/Documentation/dev-tools/kunit/usage.rst index 2737863ef365..e70014b82350 100644 --- a/Documentation/dev-tools/kunit/usage.rst +++ b/Documentation/dev-tools/kunit/usage.rst @@ -625,17 +625,21 @@ 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`` 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, in which case 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 +648,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 +679,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 +707,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. diff --git a/include/kunit/test-bug.h b/include/kunit/test-bug.h index 5fc58081d511..87a953dceeaa 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. */ +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; +} + + +/** + * 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 Sat Nov 19 08:12:52 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gow X-Patchwork-Id: 23234 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:f944:0:0:0:0:0 with SMTP id q4csp608780wrr; Sat, 19 Nov 2022 00:15:32 -0800 (PST) X-Google-Smtp-Source: AA0mqf5MMJRLbpaNIf/Ds4XTzn+WvZ4IlhPGf1+a/PFCa7wuUie0vjgNlL1FQVrwmgYARAgYC7w5 X-Received: by 2002:a17:906:b804:b0:7ad:90dd:4af with SMTP id dv4-20020a170906b80400b007ad90dd04afmr8769962ejb.488.1668845732646; Sat, 19 Nov 2022 00:15:32 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1668845732; cv=none; d=google.com; s=arc-20160816; b=xgIHdVCwV61VfyG0b2ryYxzlbNUzxODT43W4iKzdn4dzXGrrWH5Fx+Bzy/4U+dGlDj jjrPdi1TJTzL/PnooliyuEKW9Emp9Q9rDAv66XK3k4MQanLFhZJXTihxAy0DM0OCpRX1 iKdswDmoLOAO8VwMthzaGy1eP8k/508c6PYVdC2XLorYPn8tNT1uTpvuUbWII29YY6sD uRcICgXIrZrURmHNMP29sBZuTRLTQT89p9Ry+Rll7G0FF9zkSVmzI+X+zGnrKjssw/OH kV1Rfhkx6EeMjnoqj3jbWIOPfwa9+EGPG9Fu8EJTIYIvbbxcRcPgyGYap2ODfbJC/dQv 3KRw== 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=HZT09dwWD5fIaFMw5MiqU60lisIB0ejJz2T/HMt9VF4=; b=RMbGKVHjA1BslJYtglEGwe2B8dbCFKCIF65QpE3Ff2vcAOvUWHCfNfZ19VdULL7b8k LAgIktyxwDYkUi4H5wNW3a9Z8rV+Tcp6jo02fWodkaa47f+PjJ434YdMJH35mKXJwhSx kgV7RDgSQvPq8+QqonxpKzCp9Eg046AHr/dpRP92zHvO6XXojDhnfOIB9Dre/I792XqK yrUr+UMvTcfaUS//fgIo+Q93d+/m6lkoIAAzMpZkOjd2OCnXJuQmxMUX+rM31nlbYacP j+36wKfrGB8g6iszcp36w5OEn1dOGZU0AHpObujZS4c+oNtbUrqmzwOxIa65SrrbrnpM DGXQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=SHtU6YYN; 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 f7-20020a170906138700b0078e063fc78csi3916127ejc.576.2022.11.19.00.15.07; Sat, 19 Nov 2022 00:15:32 -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=SHtU6YYN; 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 S232651AbiKSINY (ORCPT + 99 others); Sat, 19 Nov 2022 03:13:24 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33266 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232098AbiKSINK (ORCPT ); Sat, 19 Nov 2022 03:13:10 -0500 Received: from mail-pl1-x649.google.com (mail-pl1-x649.google.com [IPv6:2607:f8b0:4864:20::649]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4BF327EBDC for ; Sat, 19 Nov 2022 00:13:09 -0800 (PST) Received: by mail-pl1-x649.google.com with SMTP id h16-20020a170902f55000b001871b770a83so5419673plf.9 for ; Sat, 19 Nov 2022 00:13:09 -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=HZT09dwWD5fIaFMw5MiqU60lisIB0ejJz2T/HMt9VF4=; b=SHtU6YYNKAEepXdm5HbRFnuAyJFQdgO+1wedLhMpRsszD6ADUFWgk+3Dk2eyg23L4C zABv2VQZoq1xk7m9WvhdFXtEOjqkkRv7G5nWIow9W96ux/+b98E53LvWytC2S4a6h04r zB4vTdApfRXZH7pB+ZryafnleYvVDTkZGvhF74jyYCJAm2CuHpmFMED7k0JsoYO/yiTs ad0L59iP04zGlyxAB7bv/LMHHuEgs7zBVIQDhZWBX89Lj4G42i/ICeB0VmRucNP1g2An 1t2Tfm6nmhgKRrF4oWPqvjeR2y4x9QOOTpjql3bpcBMpiyRGomB6M2x+txB9lOy5kc1+ MRfA== 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=HZT09dwWD5fIaFMw5MiqU60lisIB0ejJz2T/HMt9VF4=; b=hR3FCuvDHaZ/1Nmw2QUsr1MKhlGQTGiYM+gFtKaiIqq0cwLeOQgGj6q1s+uElxsj9J /yekw3gccQNGoyPUhuBdiNKikcIOhZPh2sfXCM5wQNqZSPoWtPFpOhsoFTujIej6xTK7 wtqgNsJxmV50ANLNq/DdDzMJ8wC907rubcVB8KvPNI5RNUergX4nxtAWlQMyDYCluO6I fFdqVp8Ht7++yTc4Ru/LgFge4g3VnJi1dZqIV3Hk8q17mFAmGagz1e+p/YUwMaRmuowB kXOvjsckdWmUr4orbrVt7Tl1Z9yKezsOcClUNWOs3y+2QOQSD9xQxHrZwpfYG5aneW7c Xwlw== X-Gm-Message-State: ANoB5pmAWcJ64MXw5Zp++5n5FU74o0mBCe5ahuW95Jw8Xas1qVSgQX9p cqef0LPf5NQ5QV8CcQFv52tcxIV9eS7+zg== X-Received: from slicestar.c.googlers.com ([fda3:e722:ac3:cc00:4f:4b78:c0a8:20a1]) (user=davidgow job=sendgmr) by 2002:aa7:9f9c:0:b0:53e:81ab:9419 with SMTP id z28-20020aa79f9c000000b0053e81ab9419mr11494527pfr.15.1668845588834; Sat, 19 Nov 2022 00:13:08 -0800 (PST) Date: Sat, 19 Nov 2022 16:12:52 +0800 In-Reply-To: <20221119081252.3864249-1-davidgow@google.com> Mime-Version: 1.0 References: <20221119081252.3864249-1-davidgow@google.com> X-Mailer: git-send-email 2.38.1.584.g0f3c55d4c2-goog Message-ID: <20221119081252.3864249-3-davidgow@google.com> Subject: [PATCH v3 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?1749911583050490203?= X-GMAIL-MSGID: =?utf-8?q?1749911583050490203?= 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> --- 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 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");