@@ -3585,11 +3585,19 @@ __do_kmalloc_node(size_t size, gfp_t flags, int node, unsigned long caller)
35853585 struct kmem_cache * cachep ;
35863586 void * ret ;
35873587
3588- if (unlikely (size > KMALLOC_MAX_CACHE_SIZE ))
3589- return NULL ;
3588+ if (unlikely (size > KMALLOC_MAX_CACHE_SIZE )) {
3589+ ret = kmalloc_large_node_notrace (size , flags , node );
3590+
3591+ trace_kmalloc_node (caller , ret , NULL , size ,
3592+ PAGE_SIZE << get_order (size ),
3593+ flags , node );
3594+ return ret ;
3595+ }
3596+
35903597 cachep = kmalloc_slab (size , flags );
35913598 if (unlikely (ZERO_OR_NULL_PTR (cachep )))
35923599 return cachep ;
3600+
35933601 ret = kmem_cache_alloc_node_trace (cachep , flags , node , size );
35943602 ret = kasan_kmalloc (cachep , ret , size , flags );
35953603
@@ -3664,17 +3672,27 @@ EXPORT_SYMBOL(kmem_cache_free);
36643672
36653673void kmem_cache_free_bulk (struct kmem_cache * orig_s , size_t size , void * * p )
36663674{
3667- struct kmem_cache * s ;
3668- size_t i ;
36693675
36703676 local_irq_disable ();
3671- for (i = 0 ; i < size ; i ++ ) {
3677+ for (int i = 0 ; i < size ; i ++ ) {
36723678 void * objp = p [i ];
3679+ struct kmem_cache * s ;
36733680
3674- if (!orig_s ) /* called via kfree_bulk */
3675- s = virt_to_cache (objp );
3676- else
3681+ if (!orig_s ) {
3682+ struct folio * folio = virt_to_folio (objp );
3683+
3684+ /* called via kfree_bulk */
3685+ if (!folio_test_slab (folio )) {
3686+ local_irq_enable ();
3687+ free_large_kmalloc (folio , objp );
3688+ local_irq_disable ();
3689+ continue ;
3690+ }
3691+ s = folio_slab (folio )-> slab_cache ;
3692+ } else {
36773693 s = cache_from_obj (orig_s , objp );
3694+ }
3695+
36783696 if (!s )
36793697 continue ;
36803698
@@ -3703,20 +3721,24 @@ void kfree(const void *objp)
37033721{
37043722 struct kmem_cache * c ;
37053723 unsigned long flags ;
3724+ struct folio * folio ;
37063725
37073726 trace_kfree (_RET_IP_ , objp );
37083727
37093728 if (unlikely (ZERO_OR_NULL_PTR (objp )))
37103729 return ;
3711- local_irq_save (flags );
3712- kfree_debugcheck (objp );
3713- c = virt_to_cache (objp );
3714- if (!c ) {
3715- local_irq_restore (flags );
3730+
3731+ folio = virt_to_folio (objp );
3732+ if (!folio_test_slab (folio )) {
3733+ free_large_kmalloc (folio , (void * )objp );
37163734 return ;
37173735 }
3718- debug_check_no_locks_freed (objp , c -> object_size );
37193736
3737+ c = folio_slab (folio )-> slab_cache ;
3738+
3739+ local_irq_save (flags );
3740+ kfree_debugcheck (objp );
3741+ debug_check_no_locks_freed (objp , c -> object_size );
37203742 debug_check_no_obj_freed (objp , c -> object_size );
37213743 __cache_free (c , (void * )objp , _RET_IP_ );
37223744 local_irq_restore (flags );
@@ -4138,15 +4160,17 @@ void __check_heap_object(const void *ptr, unsigned long n,
41384160size_t __ksize (const void * objp )
41394161{
41404162 struct kmem_cache * c ;
4141- size_t size ;
4163+ struct folio * folio ;
41424164
41434165 BUG_ON (!objp );
41444166 if (unlikely (objp == ZERO_SIZE_PTR ))
41454167 return 0 ;
41464168
4147- c = virt_to_cache (objp );
4148- size = c ? c -> object_size : 0 ;
4169+ folio = virt_to_folio (objp );
4170+ if (!folio_test_slab (folio ))
4171+ return folio_size (folio );
41494172
4150- return size ;
4173+ c = folio_slab (folio )-> slab_cache ;
4174+ return c -> object_size ;
41514175}
41524176EXPORT_SYMBOL (__ksize );
0 commit comments