@@ -678,6 +678,11 @@ kmalloc_caches[NR_KMALLOC_TYPES][KMALLOC_SHIFT_HIGH + 1] __ro_after_init =
678
678
{ /* initialization for https://bugs.llvm.org/show_bug.cgi?id=42570 */ };
679
679
EXPORT_SYMBOL (kmalloc_caches );
680
680
681
+ #ifdef CONFIG_RANDOM_KMALLOC_CACHES
682
+ unsigned long random_kmalloc_seed __ro_after_init ;
683
+ EXPORT_SYMBOL (random_kmalloc_seed );
684
+ #endif
685
+
681
686
/*
682
687
* Conversion table for small slabs sizes / 8 to the index in the
683
688
* kmalloc array. This is necessary for slabs < 192 since we have non power
@@ -720,7 +725,7 @@ static inline unsigned int size_index_elem(unsigned int bytes)
720
725
* Find the kmem_cache structure that serves a given size of
721
726
* allocation
722
727
*/
723
- struct kmem_cache * kmalloc_slab (size_t size , gfp_t flags )
728
+ struct kmem_cache * kmalloc_slab (size_t size , gfp_t flags , unsigned long caller )
724
729
{
725
730
unsigned int index ;
726
731
@@ -735,7 +740,7 @@ struct kmem_cache *kmalloc_slab(size_t size, gfp_t flags)
735
740
index = fls (size - 1 );
736
741
}
737
742
738
- return kmalloc_caches [kmalloc_type (flags )][index ];
743
+ return kmalloc_caches [kmalloc_type (flags , caller )][index ];
739
744
}
740
745
741
746
size_t kmalloc_size_roundup (size_t size )
@@ -752,8 +757,11 @@ size_t kmalloc_size_roundup(size_t size)
752
757
if (size > KMALLOC_MAX_CACHE_SIZE )
753
758
return PAGE_SIZE << get_order (size );
754
759
755
- /* The flags don't matter since size_index is common to all. */
756
- c = kmalloc_slab (size , GFP_KERNEL );
760
+ /*
761
+ * The flags don't matter since size_index is common to all.
762
+ * Neither does the caller for just getting ->object_size.
763
+ */
764
+ c = kmalloc_slab (size , GFP_KERNEL , 0 );
757
765
return c ? c -> object_size : 0 ;
758
766
}
759
767
EXPORT_SYMBOL (kmalloc_size_roundup );
@@ -776,12 +784,35 @@ EXPORT_SYMBOL(kmalloc_size_roundup);
776
784
#define KMALLOC_RCL_NAME (sz )
777
785
#endif
778
786
787
+ #ifdef CONFIG_RANDOM_KMALLOC_CACHES
788
+ #define __KMALLOC_RANDOM_CONCAT (a , b ) a ## b
789
+ #define KMALLOC_RANDOM_NAME (N , sz ) __KMALLOC_RANDOM_CONCAT(KMA_RAND_, N)(sz)
790
+ #define KMA_RAND_1 (sz ) .name[KMALLOC_RANDOM_START + 1] = "kmalloc-rnd-01-" #sz,
791
+ #define KMA_RAND_2 (sz ) KMA_RAND_1(sz) .name[KMALLOC_RANDOM_START + 2] = "kmalloc-rnd-02-" #sz,
792
+ #define KMA_RAND_3 (sz ) KMA_RAND_2(sz) .name[KMALLOC_RANDOM_START + 3] = "kmalloc-rnd-03-" #sz,
793
+ #define KMA_RAND_4 (sz ) KMA_RAND_3(sz) .name[KMALLOC_RANDOM_START + 4] = "kmalloc-rnd-04-" #sz,
794
+ #define KMA_RAND_5 (sz ) KMA_RAND_4(sz) .name[KMALLOC_RANDOM_START + 5] = "kmalloc-rnd-05-" #sz,
795
+ #define KMA_RAND_6 (sz ) KMA_RAND_5(sz) .name[KMALLOC_RANDOM_START + 6] = "kmalloc-rnd-06-" #sz,
796
+ #define KMA_RAND_7 (sz ) KMA_RAND_6(sz) .name[KMALLOC_RANDOM_START + 7] = "kmalloc-rnd-07-" #sz,
797
+ #define KMA_RAND_8 (sz ) KMA_RAND_7(sz) .name[KMALLOC_RANDOM_START + 8] = "kmalloc-rnd-08-" #sz,
798
+ #define KMA_RAND_9 (sz ) KMA_RAND_8(sz) .name[KMALLOC_RANDOM_START + 9] = "kmalloc-rnd-09-" #sz,
799
+ #define KMA_RAND_10 (sz ) KMA_RAND_9(sz) .name[KMALLOC_RANDOM_START + 10] = "kmalloc-rnd-10-" #sz,
800
+ #define KMA_RAND_11 (sz ) KMA_RAND_10(sz) .name[KMALLOC_RANDOM_START + 11] = "kmalloc-rnd-11-" #sz,
801
+ #define KMA_RAND_12 (sz ) KMA_RAND_11(sz) .name[KMALLOC_RANDOM_START + 12] = "kmalloc-rnd-12-" #sz,
802
+ #define KMA_RAND_13 (sz ) KMA_RAND_12(sz) .name[KMALLOC_RANDOM_START + 13] = "kmalloc-rnd-13-" #sz,
803
+ #define KMA_RAND_14 (sz ) KMA_RAND_13(sz) .name[KMALLOC_RANDOM_START + 14] = "kmalloc-rnd-14-" #sz,
804
+ #define KMA_RAND_15 (sz ) KMA_RAND_14(sz) .name[KMALLOC_RANDOM_START + 15] = "kmalloc-rnd-15-" #sz,
805
+ #else // CONFIG_RANDOM_KMALLOC_CACHES
806
+ #define KMALLOC_RANDOM_NAME (N , sz )
807
+ #endif
808
+
779
809
#define INIT_KMALLOC_INFO (__size , __short_size ) \
780
810
{ \
781
811
.name[KMALLOC_NORMAL] = "kmalloc-" #__short_size, \
782
812
KMALLOC_RCL_NAME(__short_size) \
783
813
KMALLOC_CGROUP_NAME(__short_size) \
784
814
KMALLOC_DMA_NAME(__short_size) \
815
+ KMALLOC_RANDOM_NAME(RANDOM_KMALLOC_CACHES_NR, __short_size) \
785
816
.size = __size, \
786
817
}
787
818
@@ -890,6 +921,11 @@ new_kmalloc_cache(int idx, enum kmalloc_cache_type type, slab_flags_t flags)
890
921
flags |= SLAB_CACHE_DMA ;
891
922
}
892
923
924
+ #ifdef CONFIG_RANDOM_KMALLOC_CACHES
925
+ if (type >= KMALLOC_RANDOM_START && type <= KMALLOC_RANDOM_END )
926
+ flags |= SLAB_NO_MERGE ;
927
+ #endif
928
+
893
929
/*
894
930
* If CONFIG_MEMCG_KMEM is enabled, disable cache merging for
895
931
* KMALLOC_NORMAL caches.
@@ -941,6 +977,9 @@ void __init create_kmalloc_caches(slab_flags_t flags)
941
977
new_kmalloc_cache (2 , type , flags );
942
978
}
943
979
}
980
+ #ifdef CONFIG_RANDOM_KMALLOC_CACHES
981
+ random_kmalloc_seed = get_random_u64 ();
982
+ #endif
944
983
945
984
/* Kmalloc array is now usable */
946
985
slab_state = UP ;
@@ -976,7 +1015,7 @@ void *__do_kmalloc_node(size_t size, gfp_t flags, int node, unsigned long caller
976
1015
return ret ;
977
1016
}
978
1017
979
- s = kmalloc_slab (size , flags );
1018
+ s = kmalloc_slab (size , flags , caller );
980
1019
981
1020
if (unlikely (ZERO_OR_NULL_PTR (s )))
982
1021
return s ;
0 commit comments