--- a/mm/slab.c +++ b/mm/slab.c @@ -3275,15 +3275,19 @@ slab_alloc(struct kmem_cache *cachep, struct list_lru *lru, gfp_t flags, bool init = false; flags &= gfp_allowed_mask; + local_irq_save(save_flags); cachep = slab_pre_alloc_hook(cachep, lru, &objcg, 1, flags); - if (unlikely(!cachep)) + if (unlikely(!cachep)) { + local_irq_restore(save_flags); return NULL; + } objp = kfence_alloc(cachep, orig_size, flags); - if (unlikely(objp)) + if (unlikely(objp)) { + local_irq_restore(save_flags); goto out; + } - local_irq_save(save_flags); objp = __do_cache_alloc(cachep, flags); local_irq_restore(save_flags); objp = cache_alloc_debugcheck_after(cachep, flags, objp, caller);