@@ -678,6 +678,11 @@ kmalloc_caches[NR_KMALLOC_TYPES][KMALLOC_SHIFT_HIGH + 1] __ro_after_init =
678678{ /* initialization for https://bugs.llvm.org/show_bug.cgi?id=42570 */ };
679679EXPORT_SYMBOL (kmalloc_caches );
680680
681+ #ifdef CONFIG_RANDOM_KMALLOC_CACHES
682+ unsigned long random_kmalloc_seed __ro_after_init ;
683+ EXPORT_SYMBOL (random_kmalloc_seed );
684+ #endif
685+
681686/*
682687 * Conversion table for small slabs sizes / 8 to the index in the
683688 * 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)
720725 * Find the kmem_cache structure that serves a given size of
721726 * allocation
722727 */
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 )
724729{
725730 unsigned int index ;
726731
@@ -735,7 +740,7 @@ struct kmem_cache *kmalloc_slab(size_t size, gfp_t flags)
735740 index = fls (size - 1 );
736741 }
737742
738- return kmalloc_caches [kmalloc_type (flags )][index ];
743+ return kmalloc_caches [kmalloc_type (flags , caller )][index ];
739744}
740745
741746size_t kmalloc_size_roundup (size_t size )
@@ -752,8 +757,11 @@ size_t kmalloc_size_roundup(size_t size)
752757 if (size > KMALLOC_MAX_CACHE_SIZE )
753758 return PAGE_SIZE << get_order (size );
754759
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 );
757765 return c ? c -> object_size : 0 ;
758766}
759767EXPORT_SYMBOL (kmalloc_size_roundup );
@@ -776,12 +784,35 @@ EXPORT_SYMBOL(kmalloc_size_roundup);
776784#define KMALLOC_RCL_NAME (sz )
777785#endif
778786
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+
779809#define INIT_KMALLOC_INFO (__size , __short_size ) \
780810{ \
781811 .name[KMALLOC_NORMAL] = "kmalloc-" #__short_size, \
782812 KMALLOC_RCL_NAME(__short_size) \
783813 KMALLOC_CGROUP_NAME(__short_size) \
784814 KMALLOC_DMA_NAME(__short_size) \
815+ KMALLOC_RANDOM_NAME(RANDOM_KMALLOC_CACHES_NR, __short_size) \
785816 .size = __size, \
786817}
787818
@@ -890,6 +921,11 @@ new_kmalloc_cache(int idx, enum kmalloc_cache_type type, slab_flags_t flags)
890921 flags |= SLAB_CACHE_DMA ;
891922 }
892923
924+ #ifdef CONFIG_RANDOM_KMALLOC_CACHES
925+ if (type >= KMALLOC_RANDOM_START && type <= KMALLOC_RANDOM_END )
926+ flags |= SLAB_NO_MERGE ;
927+ #endif
928+
893929 /*
894930 * If CONFIG_MEMCG_KMEM is enabled, disable cache merging for
895931 * KMALLOC_NORMAL caches.
@@ -941,6 +977,9 @@ void __init create_kmalloc_caches(slab_flags_t flags)
941977 new_kmalloc_cache (2 , type , flags );
942978 }
943979 }
980+ #ifdef CONFIG_RANDOM_KMALLOC_CACHES
981+ random_kmalloc_seed = get_random_u64 ();
982+ #endif
944983
945984 /* Kmalloc array is now usable */
946985 slab_state = UP ;
@@ -976,7 +1015,7 @@ void *__do_kmalloc_node(size_t size, gfp_t flags, int node, unsigned long caller
9761015 return ret ;
9771016 }
9781017
979- s = kmalloc_slab (size , flags );
1018+ s = kmalloc_slab (size , flags , caller );
9801019
9811020 if (unlikely (ZERO_OR_NULL_PTR (s )))
9821021 return s ;
0 commit comments