|
@@ -3385,12 +3385,6 @@ void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(kmem_cache_alloc);
|
|
EXPORT_SYMBOL(kmem_cache_alloc);
|
|
|
|
|
|
-void kmem_cache_free_bulk(struct kmem_cache *s, size_t size, void **p)
|
|
|
|
-{
|
|
|
|
- __kmem_cache_free_bulk(s, size, p);
|
|
|
|
-}
|
|
|
|
-EXPORT_SYMBOL(kmem_cache_free_bulk);
|
|
|
|
-
|
|
|
|
static __always_inline void
|
|
static __always_inline void
|
|
cache_alloc_debugcheck_after_bulk(struct kmem_cache *s, gfp_t flags,
|
|
cache_alloc_debugcheck_after_bulk(struct kmem_cache *s, gfp_t flags,
|
|
size_t size, void **p, unsigned long caller)
|
|
size_t size, void **p, unsigned long caller)
|
|
@@ -3584,6 +3578,29 @@ void kmem_cache_free(struct kmem_cache *cachep, void *objp)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(kmem_cache_free);
|
|
EXPORT_SYMBOL(kmem_cache_free);
|
|
|
|
|
|
|
|
+void kmem_cache_free_bulk(struct kmem_cache *orig_s, size_t size, void **p)
|
|
|
|
+{
|
|
|
|
+ struct kmem_cache *s;
|
|
|
|
+ size_t i;
|
|
|
|
+
|
|
|
|
+ local_irq_disable();
|
|
|
|
+ for (i = 0; i < size; i++) {
|
|
|
|
+ void *objp = p[i];
|
|
|
|
+
|
|
|
|
+ s = cache_from_obj(orig_s, objp);
|
|
|
|
+
|
|
|
|
+ debug_check_no_locks_freed(objp, s->object_size);
|
|
|
|
+ if (!(s->flags & SLAB_DEBUG_OBJECTS))
|
|
|
|
+ debug_check_no_obj_freed(objp, s->object_size);
|
|
|
|
+
|
|
|
|
+ __cache_free(s, objp, _RET_IP_);
|
|
|
|
+ }
|
|
|
|
+ local_irq_enable();
|
|
|
|
+
|
|
|
|
+ /* FIXME: add tracing */
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL(kmem_cache_free_bulk);
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* kfree - free previously allocated memory
|
|
* kfree - free previously allocated memory
|
|
* @objp: pointer returned by kmalloc.
|
|
* @objp: pointer returned by kmalloc.
|