|
@@ -2119,11 +2119,19 @@ static inline int node_match(struct page *page, int node)
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_SLUB_DEBUG
|
|
|
static int count_free(struct page *page)
|
|
|
{
|
|
|
return page->objects - page->inuse;
|
|
|
}
|
|
|
|
|
|
+static inline unsigned long node_nr_objs(struct kmem_cache_node *n)
|
|
|
+{
|
|
|
+ return atomic_long_read(&n->total_objects);
|
|
|
+}
|
|
|
+#endif /* CONFIG_SLUB_DEBUG */
|
|
|
+
|
|
|
+#if defined(CONFIG_SLUB_DEBUG) || defined(CONFIG_SYSFS)
|
|
|
static unsigned long count_partial(struct kmem_cache_node *n,
|
|
|
int (*get_count)(struct page *))
|
|
|
{
|
|
@@ -2137,21 +2145,19 @@ static unsigned long count_partial(struct kmem_cache_node *n,
|
|
|
spin_unlock_irqrestore(&n->list_lock, flags);
|
|
|
return x;
|
|
|
}
|
|
|
-
|
|
|
-static inline unsigned long node_nr_objs(struct kmem_cache_node *n)
|
|
|
-{
|
|
|
-#ifdef CONFIG_SLUB_DEBUG
|
|
|
- return atomic_long_read(&n->total_objects);
|
|
|
-#else
|
|
|
- return 0;
|
|
|
-#endif
|
|
|
-}
|
|
|
+#endif /* CONFIG_SLUB_DEBUG || CONFIG_SYSFS */
|
|
|
|
|
|
static noinline void
|
|
|
slab_out_of_memory(struct kmem_cache *s, gfp_t gfpflags, int nid)
|
|
|
{
|
|
|
+#ifdef CONFIG_SLUB_DEBUG
|
|
|
+ static DEFINE_RATELIMIT_STATE(slub_oom_rs, DEFAULT_RATELIMIT_INTERVAL,
|
|
|
+ DEFAULT_RATELIMIT_BURST);
|
|
|
int node;
|
|
|
|
|
|
+ if ((gfpflags & __GFP_NOWARN) || !__ratelimit(&slub_oom_rs))
|
|
|
+ return;
|
|
|
+
|
|
|
pr_warn("SLUB: Unable to allocate memory on node %d (gfp=0x%x)\n",
|
|
|
nid, gfpflags);
|
|
|
pr_warn(" cache: %s, object size: %d, buffer size: %d, default order: %d, min order: %d\n",
|
|
@@ -2178,6 +2184,7 @@ slab_out_of_memory(struct kmem_cache *s, gfp_t gfpflags, int nid)
|
|
|
pr_warn(" node %d: slabs: %ld, objs: %ld, free: %ld\n",
|
|
|
node, nr_slabs, nr_objs, nr_free);
|
|
|
}
|
|
|
+#endif
|
|
|
}
|
|
|
|
|
|
static inline void *new_slab_objects(struct kmem_cache *s, gfp_t flags,
|
|
@@ -2356,9 +2363,7 @@ new_slab:
|
|
|
freelist = new_slab_objects(s, gfpflags, node, &c);
|
|
|
|
|
|
if (unlikely(!freelist)) {
|
|
|
- if (!(gfpflags & __GFP_NOWARN) && printk_ratelimit())
|
|
|
- slab_out_of_memory(s, gfpflags, node);
|
|
|
-
|
|
|
+ slab_out_of_memory(s, gfpflags, node);
|
|
|
local_irq_restore(flags);
|
|
|
return NULL;
|
|
|
}
|