From nobody Mon Apr 6 23:10:14 2026 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 199DAECAAD2 for ; Thu, 1 Sep 2022 22:19:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232699AbiIAWTJ (ORCPT ); Thu, 1 Sep 2022 18:19:09 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45962 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234705AbiIAWSK (ORCPT ); Thu, 1 Sep 2022 18:18:10 -0400 Received: from mail-qt1-x82f.google.com (mail-qt1-x82f.google.com [IPv6:2607:f8b0:4864:20::82f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6DDB65A174 for ; Thu, 1 Sep 2022 15:18:05 -0700 (PDT) Received: by mail-qt1-x82f.google.com with SMTP id r6so230259qtx.6 for ; Thu, 01 Sep 2022 15:18:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=joelfernandes.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc; bh=iF0VQ620OmNNEeBQv3gOJrSK8RXzJIsiopJiGn2gXgE=; b=SBhFYlQ3f3i6jV7HBq4Orbuwu/hinW5fDS4ifU7J74KEwQlKYPt/auQAncrY9fVdcu 5aTjF9w2HhCnuHyPQCCO0vD25oTat84cFEXTuBIKNKGkVKKSvEreggR7kMkSFMbjjldR i8wuBUjYYWqJSbR7o2Nre3jfWKBbsb2Lamrto= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc; bh=iF0VQ620OmNNEeBQv3gOJrSK8RXzJIsiopJiGn2gXgE=; b=L6Y5CulT6qhnwJ0xTDsEQ7p+F3U+c3kJ5KC0r9Usll8SviSfCZRhboAMonPKIM6mPG Bl84NODmKS+0e4fG70wGK6DwkkRqlrREk2CFRDhau1De9xbAHJ2MxlmapHOWOY6Wwo9b rbxt3vZ3sJW2+BP5F4q2DAr/zvOHgEd8cx95ES/q+WtqANTTyQtzpwmFgk9et//LvVMz Adz1fXdAuOXGkLWFo2taHwi9vmW/HtqakmYy9DymnAhLTA5zXqLfVTX/nTf4CtTN+1s6 lxf1wQaIzSLePRr8orTS4MLeeM8fQJBXU1t1YLT0X9sOLVFO0utNax3Tz5fBdIMcTpI4 W8Zg== X-Gm-Message-State: ACgBeo1TqV758uk+SPs1/GKcNe4Z415VyVvDl9UzGj516osWg2QT/kzn TMXTelftgIvTizpW1ntcDYZC3w== X-Google-Smtp-Source: AA6agR7H18+EdoJRj/8Zp5aQpkjWP9gIyH82b2JWKmLuxIWI5VEu84ZwMh5yQZdQ8rViSDXh8dHaDg== X-Received: by 2002:a05:622a:614:b0:343:487:45d1 with SMTP id z20-20020a05622a061400b00343048745d1mr25242495qta.443.1662070684496; Thu, 01 Sep 2022 15:18:04 -0700 (PDT) Received: from joelboxx.c.googlers.com.com (228.221.150.34.bc.googleusercontent.com. [34.150.221.228]) by smtp.gmail.com with ESMTPSA id s16-20020ac85290000000b0034305a91aaesm11060794qtn.83.2022.09.01.15.18.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 Sep 2022 15:18:04 -0700 (PDT) From: "Joel Fernandes (Google)" To: rcu@vger.kernel.org Cc: linux-kernel@vger.kernel.org, rushikesh.s.kadam@intel.com, urezki@gmail.com, neeraj.iitr10@gmail.com, frederic@kernel.org, paulmck@kernel.org, rostedt@goodmis.org, vineeth@bitbyteword.org, boqun.feng@gmail.com, "Joel Fernandes (Google)" Subject: [PATCH v5 10/18] rcutorture: Add test code for call_rcu_lazy() Date: Thu, 1 Sep 2022 22:17:12 +0000 Message-Id: <20220901221720.1105021-11-joel@joelfernandes.org> X-Mailer: git-send-email 2.37.2.789.g6183377224-goog In-Reply-To: <20220901221720.1105021-1-joel@joelfernandes.org> References: <20220901221720.1105021-1-joel@joelfernandes.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" We add a new RCU type to test call_rcu_lazy(). This allows us to just override the '.call' callback. To compensate for the laziness, we force the laziness to a small number of jiffies. The idea of this test is to stress the new code paths for stability and ensure it at least is providing behavior in parity with, or similar to, call_rcu(). The actual check for amount of laziness is in another test (rcuscale). Signed-off-by: Joel Fernandes (Google) --- kernel/rcu/rcu.h | 1 + kernel/rcu/rcutorture.c | 60 ++++++++++++++++++- kernel/rcu/tree.c | 1 + .../selftests/rcutorture/configs/rcu/CFLIST | 1 + .../selftests/rcutorture/configs/rcu/TREE11 | 18 ++++++ .../rcutorture/configs/rcu/TREE11.boot | 8 +++ 6 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 tools/testing/selftests/rcutorture/configs/rcu/TREE11 create mode 100644 tools/testing/selftests/rcutorture/configs/rcu/TREE11.b= oot diff --git a/kernel/rcu/rcu.h b/kernel/rcu/rcu.h index 94675f14efe8..a6efb831673f 100644 --- a/kernel/rcu/rcu.h +++ b/kernel/rcu/rcu.h @@ -471,6 +471,7 @@ enum rcutorture_type { RCU_TASKS_TRACING_FLAVOR, RCU_TRIVIAL_FLAVOR, SRCU_FLAVOR, + RCU_LAZY_FLAVOR, INVALID_RCU_FLAVOR }; =20 diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c index 9ad5301385a4..b4114f29ab61 100644 --- a/kernel/rcu/rcutorture.c +++ b/kernel/rcu/rcutorture.c @@ -927,6 +927,64 @@ static struct rcu_torture_ops tasks_rude_ops =3D { =20 #endif // #else #ifdef CONFIG_TASKS_RUDE_RCU =20 +#ifdef CONFIG_RCU_LAZY + +/* + * Definitions for lazy RCU torture testing. + */ +static unsigned long orig_jiffies_till_flush; + +static void rcu_sync_torture_init_lazy(void) +{ + rcu_sync_torture_init(); + + orig_jiffies_till_flush =3D rcu_lazy_get_jiffies_till_flush(); + rcu_lazy_set_jiffies_till_flush(50); +} + +static void rcu_lazy_cleanup(void) +{ + rcu_lazy_set_jiffies_till_flush(orig_jiffies_till_flush); +} + +static struct rcu_torture_ops rcu_lazy_ops =3D { + .ttype =3D RCU_LAZY_FLAVOR, + .init =3D rcu_sync_torture_init_lazy, + .cleanup =3D rcu_lazy_cleanup, + .readlock =3D rcu_torture_read_lock, + .read_delay =3D rcu_read_delay, + .readunlock =3D rcu_torture_read_unlock, + .readlock_held =3D torture_readlock_not_held, + .get_gp_seq =3D rcu_get_gp_seq, + .gp_diff =3D rcu_seq_diff, + .deferred_free =3D rcu_torture_deferred_free, + .sync =3D synchronize_rcu, + .exp_sync =3D synchronize_rcu_expedited, + .get_gp_state =3D get_state_synchronize_rcu, + .start_gp_poll =3D start_poll_synchronize_rcu, + .poll_gp_state =3D poll_state_synchronize_rcu, + .cond_sync =3D cond_synchronize_rcu, + .call =3D call_rcu_lazy, + .cb_barrier =3D rcu_barrier, + .fqs =3D rcu_force_quiescent_state, + .stats =3D NULL, + .gp_kthread_dbg =3D show_rcu_gp_kthreads, + .check_boost_failed =3D rcu_check_boost_fail, + .stall_dur =3D rcu_jiffies_till_stall_check, + .irq_capable =3D 1, + .can_boost =3D IS_ENABLED(CONFIG_RCU_BOOST), + .extendables =3D RCUTORTURE_MAX_EXTEND, + .name =3D "rcu_lazy" +}; + +#define LAZY_OPS &rcu_lazy_ops, + +#else // #ifdef CONFIG_RCU_LAZY + +#define LAZY_OPS + +#endif // #else #ifdef CONFIG_RCU_LAZY + =20 #ifdef CONFIG_TASKS_TRACE_RCU =20 @@ -3466,7 +3524,7 @@ rcu_torture_init(void) unsigned long gp_seq =3D 0; static struct rcu_torture_ops *torture_ops[] =3D { &rcu_ops, &rcu_busted_ops, &srcu_ops, &srcud_ops, &busted_srcud_ops, - TASKS_OPS TASKS_RUDE_OPS TASKS_TRACING_OPS + TASKS_OPS TASKS_RUDE_OPS TASKS_TRACING_OPS LAZY_OPS &trivial_ops, }; =20 diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c index 8111d9f37621..08bafe13c3ad 100644 --- a/kernel/rcu/tree.c +++ b/kernel/rcu/tree.c @@ -537,6 +537,7 @@ void rcutorture_get_gp_data(enum rcutorture_type test_t= ype, int *flags, { switch (test_type) { case RCU_FLAVOR: + case RCU_LAZY_FLAVOR: *flags =3D READ_ONCE(rcu_state.gp_flags); *gp_seq =3D rcu_seq_current(&rcu_state.gp_seq); break; diff --git a/tools/testing/selftests/rcutorture/configs/rcu/CFLIST b/tools/= testing/selftests/rcutorture/configs/rcu/CFLIST index 98b6175e5aa0..609c3370616f 100644 --- a/tools/testing/selftests/rcutorture/configs/rcu/CFLIST +++ b/tools/testing/selftests/rcutorture/configs/rcu/CFLIST @@ -5,6 +5,7 @@ TREE04 TREE05 TREE07 TREE09 +TREE11 SRCU-N SRCU-P SRCU-T diff --git a/tools/testing/selftests/rcutorture/configs/rcu/TREE11 b/tools/= testing/selftests/rcutorture/configs/rcu/TREE11 new file mode 100644 index 000000000000..436013f3e015 --- /dev/null +++ b/tools/testing/selftests/rcutorture/configs/rcu/TREE11 @@ -0,0 +1,18 @@ +CONFIG_SMP=3Dy +CONFIG_PREEMPT_NONE=3Dn +CONFIG_PREEMPT_VOLUNTARY=3Dn +CONFIG_PREEMPT=3Dy +#CHECK#CONFIG_PREEMPT_RCU=3Dy +CONFIG_HZ_PERIODIC=3Dn +CONFIG_NO_HZ_IDLE=3Dy +CONFIG_NO_HZ_FULL=3Dn +CONFIG_RCU_TRACE=3Dy +CONFIG_HOTPLUG_CPU=3Dy +CONFIG_MAXSMP=3Dy +CONFIG_CPUMASK_OFFSTACK=3Dy +CONFIG_RCU_NOCB_CPU=3Dy +CONFIG_DEBUG_LOCK_ALLOC=3Dn +CONFIG_RCU_BOOST=3Dn +CONFIG_DEBUG_OBJECTS_RCU_HEAD=3Dn +CONFIG_RCU_EXPERT=3Dy +CONFIG_RCU_LAZY=3Dy diff --git a/tools/testing/selftests/rcutorture/configs/rcu/TREE11.boot b/t= ools/testing/selftests/rcutorture/configs/rcu/TREE11.boot new file mode 100644 index 000000000000..9b6f720d4ccd --- /dev/null +++ b/tools/testing/selftests/rcutorture/configs/rcu/TREE11.boot @@ -0,0 +1,8 @@ +maxcpus=3D8 nr_cpus=3D43 +rcutree.gp_preinit_delay=3D3 +rcutree.gp_init_delay=3D3 +rcutree.gp_cleanup_delay=3D3 +rcu_nocbs=3D0-7 +rcutorture.torture_type=3Drcu_lazy +rcutorture.nocbs_nthreads=3D8 +rcutorture.fwd_progress=3D0 --=20 2.37.2.789.g6183377224-goog