void kmem_cache_free_bulk(struct kmem_cache *, size_t, void **);
 int kmem_cache_alloc_bulk(struct kmem_cache *, gfp_t, size_t, void **);
 
+/*
+ * Caller must not use kfree_bulk() on memory not originally allocated
+ * by kmalloc(), because the SLOB allocator cannot handle this.
+ */
+static __always_inline void kfree_bulk(size_t size, void **p)
+{
+       kmem_cache_free_bulk(NULL, size, p);
+}
+
 #ifdef CONFIG_NUMA
 void *__kmalloc_node(size_t size, gfp_t flags, int node) __assume_kmalloc_alignment;
 void *kmem_cache_alloc_node(struct kmem_cache *, gfp_t flags, int node) __assume_slab_alignment;
 
        for (i = 0; i < size; i++) {
                void *objp = p[i];
 
-               s = cache_from_obj(orig_s, objp);
+               if (!orig_s) /* called via kfree_bulk */
+                       s = virt_to_cache(objp);
+               else
+                       s = cache_from_obj(orig_s, objp);
 
                debug_check_no_locks_freed(objp, s->object_size);
                if (!(s->flags & SLAB_DEBUG_OBJECTS))
 
 {
        size_t i;
 
-       for (i = 0; i < nr; i++)
-               kmem_cache_free(s, p[i]);
+       for (i = 0; i < nr; i++) {
+               if (s)
+                       kmem_cache_free(s, p[i]);
+               else
+                       kfree(p[i]);
+       }
 }
 
 int __kmem_cache_alloc_bulk(struct kmem_cache *s, gfp_t flags, size_t nr,
 
        size_t first_skipped_index = 0;
        int lookahead = 3;
        void *object;
+       struct page *page;
 
        /* Always re-init detached_freelist */
        df->page = NULL;
 
        do {
                object = p[--size];
+               /* Do we need !ZERO_OR_NULL_PTR(object) here? (for kfree) */
        } while (!object && size);
 
        if (!object)
                return 0;
 
-       /* Support for memcg, compiler can optimize this out */
-       df->s = cache_from_obj(s, object);
+       page = virt_to_head_page(object);
+       if (!s) {
+               /* Handle kalloc'ed objects */
+               if (unlikely(!PageSlab(page))) {
+                       BUG_ON(!PageCompound(page));
+                       kfree_hook(object);
+                       __free_kmem_pages(page, compound_order(page));
+                       p[size] = NULL; /* mark object processed */
+                       return size;
+               }
+               /* Derive kmem_cache from object */
+               df->s = page->slab_cache;
+       } else {
+               df->s = cache_from_obj(s, object); /* Support for memcg */
+       }
 
        /* Start new detached freelist */
+       df->page = page;
        set_freepointer(df->s, object, NULL);
-       df->page = virt_to_head_page(object);
        df->tail = object;
        df->freelist = object;
        p[size] = NULL; /* mark object processed */