Messages in this thread Patch in this message | | | From | Frederic Weisbecker <> | Subject | [PATCH 5/5] srcu: Early test SRCU polling start | Date | Fri, 9 Apr 2021 00:39:02 +0200 |
| |
Test early calls to start_poll_synchronize_srcu(), mixed within the early test to call_srcu(), and make sure that poll_state_synchronize_srcu() correctly see the expired grace periods after the srcu_barrier() on late initcall. Normally srcu_barrier() doesn't wait for callback-less grace periods but early calls to start_poll_synchronize_srcu() involve empty callbacks.
Signed-off-by: Frederic Weisbecker <frederic@kernel.org> Cc: Boqun Feng <boqun.feng@gmail.com> Cc: Lai Jiangshan <jiangshanlai@gmail.com> Cc: Neeraj Upadhyay <neeraju@codeaurora.org> Cc: Josh Triplett <josh@joshtriplett.org> Cc: Joel Fernandes <joel@joelfernandes.org> Cc: Uladzislau Rezki <urezki@gmail.com> --- kernel/rcu/update.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/kernel/rcu/update.c b/kernel/rcu/update.c index dd94a602a6d2..7ee57d66a327 100644 --- a/kernel/rcu/update.c +++ b/kernel/rcu/update.c @@ -528,6 +528,7 @@ DEFINE_STATIC_SRCU(early_srcu); struct early_boot_kfree_rcu { struct rcu_head rh; }; +static unsigned long early_cookie[3]; static void early_boot_test_call_rcu(void) { @@ -536,8 +537,14 @@ static void early_boot_test_call_rcu(void) struct early_boot_kfree_rcu *rhp; call_rcu(&head, test_callback); - if (IS_ENABLED(CONFIG_SRCU)) + if (IS_ENABLED(CONFIG_SRCU)) { + int i; + early_cookie[0] = start_poll_synchronize_srcu(&early_srcu); call_srcu(&early_srcu, &shead, test_callback); + + for (i = 1; i < ARRAY_SIZE(early_cookie); i++) + early_cookie[i] = start_poll_synchronize_srcu(&early_srcu); + } rhp = kmalloc(sizeof(*rhp), GFP_KERNEL); if (!WARN_ON_ONCE(!rhp)) kfree_rcu(rhp, rh); @@ -561,8 +568,11 @@ static int rcu_verify_early_boot_tests(void) early_boot_test_counter++; rcu_barrier(); if (IS_ENABLED(CONFIG_SRCU)) { + int i; early_boot_test_counter++; srcu_barrier(&early_srcu); + for (i = 0; i < ARRAY_SIZE(early_cookie); i++) + WARN_ON_ONCE(!poll_state_synchronize_srcu(&early_srcu, early_cookie[i])); } } if (rcu_self_test_counter != early_boot_test_counter) { -- 2.25.1
| |