|
@@ -303,6 +303,12 @@ struct kmem_list3 {
|
|
|
int free_touched; /* updated without locking */
|
|
|
};
|
|
|
|
|
|
+/*
|
|
|
+ * The slab allocator is initialized with interrupts disabled. Therefore, make
|
|
|
+ * sure early boot allocations don't accidentally enable interrupts.
|
|
|
+ */
|
|
|
+static gfp_t slab_gfp_mask __read_mostly = SLAB_GFP_BOOT_MASK;
|
|
|
+
|
|
|
/*
|
|
|
* Need this for bootstrapping a per node allocator.
|
|
|
*/
|
|
@@ -1654,6 +1660,14 @@ void __init kmem_cache_init(void)
|
|
|
*/
|
|
|
}
|
|
|
|
|
|
+void __init kmem_cache_init_late(void)
|
|
|
+{
|
|
|
+ /*
|
|
|
+ * Interrupts are enabled now so all GFP allocations are safe.
|
|
|
+ */
|
|
|
+ slab_gfp_mask = __GFP_BITS_MASK;
|
|
|
+}
|
|
|
+
|
|
|
static int __init cpucache_init(void)
|
|
|
{
|
|
|
int cpu;
|
|
@@ -3354,6 +3368,8 @@ __cache_alloc_node(struct kmem_cache *cachep, gfp_t flags, int nodeid,
|
|
|
unsigned long save_flags;
|
|
|
void *ptr;
|
|
|
|
|
|
+ flags &= slab_gfp_mask;
|
|
|
+
|
|
|
lockdep_trace_alloc(flags);
|
|
|
|
|
|
if (slab_should_failslab(cachep, flags))
|
|
@@ -3434,6 +3450,8 @@ __cache_alloc(struct kmem_cache *cachep, gfp_t flags, void *caller)
|
|
|
unsigned long save_flags;
|
|
|
void *objp;
|
|
|
|
|
|
+ flags &= slab_gfp_mask;
|
|
|
+
|
|
|
lockdep_trace_alloc(flags);
|
|
|
|
|
|
if (slab_should_failslab(cachep, flags))
|