@@ -2706,11 +2706,6 @@ static void *___slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node,
2706
2706
if (unlikely (node != NUMA_NO_NODE &&
2707
2707
!node_isset (node , slab_nodes )))
2708
2708
node = NUMA_NO_NODE ;
2709
- local_irq_save (flags );
2710
- if (unlikely (c -> page )) {
2711
- local_irq_restore (flags );
2712
- goto reread_page ;
2713
- }
2714
2709
goto new_slab ;
2715
2710
}
2716
2711
redo :
@@ -2751,6 +2746,7 @@ static void *___slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node,
2751
2746
2752
2747
if (!freelist ) {
2753
2748
c -> page = NULL ;
2749
+ local_irq_restore (flags );
2754
2750
stat (s , DEACTIVATE_BYPASS );
2755
2751
goto new_slab ;
2756
2752
}
@@ -2780,19 +2776,36 @@ static void *___slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node,
2780
2776
goto reread_page ;
2781
2777
}
2782
2778
deactivate_slab (s , page , c -> freelist , c );
2779
+ local_irq_restore (flags );
2783
2780
2784
2781
new_slab :
2785
2782
2786
- lockdep_assert_irqs_disabled ();
2787
-
2788
2783
if (slub_percpu_partial (c )) {
2784
+ local_irq_save (flags );
2785
+ if (unlikely (c -> page )) {
2786
+ local_irq_restore (flags );
2787
+ goto reread_page ;
2788
+ }
2789
+ if (unlikely (!slub_percpu_partial (c )))
2790
+ goto new_objects ; /* stolen by an IRQ handler */
2791
+
2789
2792
page = c -> page = slub_percpu_partial (c );
2790
2793
slub_set_percpu_partial (c , page );
2791
2794
local_irq_restore (flags );
2792
2795
stat (s , CPU_PARTIAL_ALLOC );
2793
2796
goto redo ;
2794
2797
}
2795
2798
2799
+ local_irq_save (flags );
2800
+ if (unlikely (c -> page )) {
2801
+ local_irq_restore (flags );
2802
+ goto reread_page ;
2803
+ }
2804
+
2805
+ new_objects :
2806
+
2807
+ lockdep_assert_irqs_disabled ();
2808
+
2796
2809
freelist = get_partial (s , gfpflags , node , & page );
2797
2810
if (freelist ) {
2798
2811
c -> page = page ;
@@ -2825,15 +2838,18 @@ static void *___slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node,
2825
2838
check_new_page :
2826
2839
2827
2840
if (kmem_cache_debug (s )) {
2828
- if (!alloc_debug_processing (s , page , freelist , addr ))
2841
+ if (!alloc_debug_processing (s , page , freelist , addr )) {
2829
2842
/* Slab failed checks. Next slab needed */
2843
+ c -> page = NULL ;
2844
+ local_irq_restore (flags );
2830
2845
goto new_slab ;
2831
- else
2846
+ } else {
2832
2847
/*
2833
2848
* For debug case, we don't load freelist so that all
2834
2849
* allocations go through alloc_debug_processing()
2835
2850
*/
2836
2851
goto return_single ;
2852
+ }
2837
2853
}
2838
2854
2839
2855
if (unlikely (!pfmemalloc_match (page , gfpflags )))
0 commit comments