From 6ecacd2411ea0e8fd101a16a9c943f6883c2c191 Mon Sep 17 00:00:00 2001 From: Vegard Nossum Date: Wed, 25 Feb 2009 18:58:41 +0100 Subject: [PATCH] rcu boot self-test --- init/main.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 files changed, 40 insertions(+), 0 deletions(-) diff --git a/init/main.c b/init/main.c index 7459fad..f2e2657 100644 --- a/init/main.c +++ b/init/main.c @@ -440,6 +440,45 @@ static void __init setup_command_line(char *command_line) strcpy (static_command_line, command_line); } +static atomic_t rcu_idletest_counter; + +struct rcu_idletest_context { + struct rcu_head rcu_head; +}; + +static void rcu_idletest_callback(struct rcu_head *head) +{ + struct rcu_idletest_context *ctx = + container_of(head, struct rcu_idletest_context, rcu_head); + + if (atomic_dec_and_test(&rcu_idletest_counter)) + printk("last rcu_idletest_callback called!\n"); + kfree(ctx); +} + +static void rcu_idletest(void) +{ + static const int n = 4000; + + spinlock_t lock; + int i; + + atomic_set(&rcu_idletest_counter, n); + + spin_lock_init(&lock); + spin_lock(&lock); + for (i = 0; i < n; ++i) { + struct rcu_idletest_context *ctx; + + ctx = kmalloc(sizeof(*ctx), GFP_KERNEL); + call_rcu(&ctx->rcu_head, &rcu_idletest_callback); + } + + printk(KERN_DEBUG "rcu callbacks called: %d (should be %d)\n", + atomic_read(&rcu_idletest_counter), n); + spin_unlock(&lock); +} + /* * We need to finalize in a non-__init function or else race conditions * between the root thread and the init thread may cause start_kernel to @@ -684,6 +723,7 @@ asmlinkage void __init start_kernel(void) taskstats_init_early(); delayacct_init(); + rcu_idletest(); check_bugs(); acpi_early_init(); /* before LAPIC and SMP init */ -- 1.6.0.6