mm: Use static initialization for "srcu"
The MM-notifier code currently dynamically initializes the srcu_struct named "srcu" at subsys_initcall() time, and includes a BUG_ON() to check this initialization in do_mmu_notifier_register(). Unfortunately, there is no foolproof way to verify that an srcu_struct has been initialized, given the possibility of an srcu_struct being allocated on the stack or on the heap. This means that creating an srcu_struct_is_initialized() function is not a reasonable course of action. Nor is peppering do_mmu_notifier_register() with SRCU-specific #ifdefs an attractive alternative. This commit therefore uses DEFINE_STATIC_SRCU() to initialize this srcu_struct at compile time, thus eliminating both the subsys_initcall()-time initialization and the runtime BUG_ON(). Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Cc: <linux-mm@kvack.org> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Ingo Molnar <mingo@kernel.org> Cc: Michal Hocko <mhocko@suse.com> Cc: "Peter Zijlstra (Intel)" <peterz@infradead.org> Cc: Vegard Nossum <vegard.nossum@oracle.com>
This commit is contained in:
parent
f60d231a87
commit
dde8da6cff
|
@ -21,7 +21,7 @@
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
|
|
||||||
/* global SRCU for all MMs */
|
/* global SRCU for all MMs */
|
||||||
static struct srcu_struct srcu;
|
DEFINE_STATIC_SRCU(srcu);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This function allows mmu_notifier::release callback to delay a call to
|
* This function allows mmu_notifier::release callback to delay a call to
|
||||||
|
@ -252,12 +252,6 @@ static int do_mmu_notifier_register(struct mmu_notifier *mn,
|
||||||
|
|
||||||
BUG_ON(atomic_read(&mm->mm_users) <= 0);
|
BUG_ON(atomic_read(&mm->mm_users) <= 0);
|
||||||
|
|
||||||
/*
|
|
||||||
* Verify that mmu_notifier_init() already run and the global srcu is
|
|
||||||
* initialized.
|
|
||||||
*/
|
|
||||||
BUG_ON(!srcu.per_cpu_ref);
|
|
||||||
|
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
mmu_notifier_mm = kmalloc(sizeof(struct mmu_notifier_mm), GFP_KERNEL);
|
mmu_notifier_mm = kmalloc(sizeof(struct mmu_notifier_mm), GFP_KERNEL);
|
||||||
if (unlikely(!mmu_notifier_mm))
|
if (unlikely(!mmu_notifier_mm))
|
||||||
|
@ -406,9 +400,3 @@ void mmu_notifier_unregister_no_release(struct mmu_notifier *mn,
|
||||||
mmdrop(mm);
|
mmdrop(mm);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(mmu_notifier_unregister_no_release);
|
EXPORT_SYMBOL_GPL(mmu_notifier_unregister_no_release);
|
||||||
|
|
||||||
static int __init mmu_notifier_init(void)
|
|
||||||
{
|
|
||||||
return init_srcu_struct(&srcu);
|
|
||||||
}
|
|
||||||
subsys_initcall(mmu_notifier_init);
|
|
||||||
|
|
Loading…
Reference in New Issue