mirror of
				https://github.com/GrapheneOS/hardened_malloc.git
				synced 2025-10-31 08:16:31 +01:00 
			
		
		
		
	support extended range of small size classes
This commit is contained in:
		
							parent
							
								
									1b34fd4a69
								
							
						
					
					
						commit
						6c31f6710a
					
				
					 3 changed files with 32 additions and 7 deletions
				
			
		|  | @ -17,6 +17,7 @@ common_cflags = [ | ||||||
|     "-DSLAB_CANARY=true", |     "-DSLAB_CANARY=true", | ||||||
|     "-DSLAB_QUARANTINE_RANDOM_LENGTH=1", |     "-DSLAB_QUARANTINE_RANDOM_LENGTH=1", | ||||||
|     "-DSLAB_QUARANTINE_QUEUE_LENGTH=1", |     "-DSLAB_QUARANTINE_QUEUE_LENGTH=1", | ||||||
|  |     "-DCONFIG_EXTENDED_SIZE_CLASSES=true", | ||||||
|     "-DCONFIG_LARGE_SIZE_CLASSES=true", |     "-DCONFIG_LARGE_SIZE_CLASSES=true", | ||||||
|     "-DGUARD_SLABS_INTERVAL=1", |     "-DGUARD_SLABS_INTERVAL=1", | ||||||
|     "-DGUARD_SIZE_DIVISOR=2", |     "-DGUARD_SIZE_DIVISOR=2", | ||||||
|  |  | ||||||
							
								
								
									
										6
									
								
								Makefile
									
										
									
									
									
								
							
							
						
						
									
										6
									
								
								Makefile
									
										
									
									
									
								
							|  | @ -8,6 +8,7 @@ CONFIG_SLOT_RANDOMIZE := true | ||||||
| CONFIG_SLAB_CANARY := true | CONFIG_SLAB_CANARY := true | ||||||
| CONFIG_SLAB_QUARANTINE_RANDOM_LENGTH := 1 | CONFIG_SLAB_QUARANTINE_RANDOM_LENGTH := 1 | ||||||
| CONFIG_SLAB_QUARANTINE_QUEUE_LENGTH := 1 | CONFIG_SLAB_QUARANTINE_QUEUE_LENGTH := 1 | ||||||
|  | CONFIG_EXTENDED_SIZE_CLASSES := true | ||||||
| CONFIG_LARGE_SIZE_CLASSES := true | CONFIG_LARGE_SIZE_CLASSES := true | ||||||
| CONFIG_GUARD_SLABS_INTERVAL := 1 | CONFIG_GUARD_SLABS_INTERVAL := 1 | ||||||
| CONFIG_GUARD_SIZE_DIVISOR := 2 | CONFIG_GUARD_SIZE_DIVISOR := 2 | ||||||
|  | @ -69,6 +70,10 @@ ifeq (,$(filter $(CONFIG_SLAB_CANARY),true false)) | ||||||
|     $(error CONFIG_SLAB_CANARY must be true or false) |     $(error CONFIG_SLAB_CANARY must be true or false) | ||||||
| endif | endif | ||||||
| 
 | 
 | ||||||
|  | ifeq (,$(filter $(CONFIG_EXTENDED_SIZE_CLASSES),true false)) | ||||||
|  |     $(error CONFIG_EXTENDED_SIZE_CLASSES must be true or false) | ||||||
|  | endif | ||||||
|  | 
 | ||||||
| ifeq (,$(filter $(CONFIG_LARGE_SIZE_CLASSES),true false)) | ifeq (,$(filter $(CONFIG_LARGE_SIZE_CLASSES),true false)) | ||||||
|     $(error CONFIG_LARGE_SIZE_CLASSES must be true or false) |     $(error CONFIG_LARGE_SIZE_CLASSES must be true or false) | ||||||
| endif | endif | ||||||
|  | @ -84,6 +89,7 @@ CPPFLAGS += \ | ||||||
|     -DSLAB_CANARY=$(CONFIG_SLAB_CANARY) \
 |     -DSLAB_CANARY=$(CONFIG_SLAB_CANARY) \
 | ||||||
|     -DSLAB_QUARANTINE_RANDOM_LENGTH=$(CONFIG_SLAB_QUARANTINE_RANDOM_LENGTH) \
 |     -DSLAB_QUARANTINE_RANDOM_LENGTH=$(CONFIG_SLAB_QUARANTINE_RANDOM_LENGTH) \
 | ||||||
|     -DSLAB_QUARANTINE_QUEUE_LENGTH=$(CONFIG_SLAB_QUARANTINE_QUEUE_LENGTH) \
 |     -DSLAB_QUARANTINE_QUEUE_LENGTH=$(CONFIG_SLAB_QUARANTINE_QUEUE_LENGTH) \
 | ||||||
|  |     -DCONFIG_EXTENDED_SIZE_CLASSES=$(CONFIG_EXTENDED_SIZE_CLASSES) \
 | ||||||
|     -DCONFIG_LARGE_SIZE_CLASSES=$(CONFIG_LARGE_SIZE_CLASSES) \
 |     -DCONFIG_LARGE_SIZE_CLASSES=$(CONFIG_LARGE_SIZE_CLASSES) \
 | ||||||
|     -DGUARD_SLABS_INTERVAL=$(CONFIG_GUARD_SLABS_INTERVAL) \
 |     -DGUARD_SLABS_INTERVAL=$(CONFIG_GUARD_SLABS_INTERVAL) \
 | ||||||
|     -DGUARD_SIZE_DIVISOR=$(CONFIG_GUARD_SIZE_DIVISOR) \
 |     -DGUARD_SIZE_DIVISOR=$(CONFIG_GUARD_SIZE_DIVISOR) \
 | ||||||
|  |  | ||||||
							
								
								
									
										32
									
								
								h_malloc.c
									
										
									
									
									
								
							
							
						
						
									
										32
									
								
								h_malloc.c
									
										
									
									
									
								
							|  | @ -96,11 +96,17 @@ struct slab_metadata { | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static const size_t min_align = 16; | static const size_t min_align = 16; | ||||||
| static const size_t max_slab_size_class = 16384; |  | ||||||
| #define MIN_SLAB_SIZE_CLASS_SHIFT 4 | #define MIN_SLAB_SIZE_CLASS_SHIFT 4 | ||||||
| #define MAX_SLAB_SIZE_CLASS_SHIFT 14 |  | ||||||
| 
 | 
 | ||||||
| static const u16 size_classes[] = { | #if !CONFIG_EXTENDED_SIZE_CLASSES | ||||||
|  | static const size_t max_slab_size_class = 16384; | ||||||
|  | #define MAX_SLAB_SIZE_CLASS_SHIFT 14 | ||||||
|  | #else | ||||||
|  | static const size_t max_slab_size_class = 65536; | ||||||
|  | #define MAX_SLAB_SIZE_CLASS_SHIFT 16 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | static const u32 size_classes[] = { | ||||||
|     /* 0 */ 0, |     /* 0 */ 0, | ||||||
|     /* 16 */ 16, 32, 48, 64, 80, 96, 112, 128, |     /* 16 */ 16, 32, 48, 64, 80, 96, 112, 128, | ||||||
|     /* 32 */ 160, 192, 224, 256, |     /* 32 */ 160, 192, 224, 256, | ||||||
|  | @ -109,7 +115,11 @@ static const u16 size_classes[] = { | ||||||
|     /* 256 */ 1280, 1536, 1792, 2048, |     /* 256 */ 1280, 1536, 1792, 2048, | ||||||
|     /* 512 */ 2560, 3072, 3584, 4096, |     /* 512 */ 2560, 3072, 3584, 4096, | ||||||
|     /* 1024 */ 5120, 6144, 7168, 8192, |     /* 1024 */ 5120, 6144, 7168, 8192, | ||||||
|     /* 2048 */ 10240, 12288, 14336, 16384 |     /* 2048 */ 10240, 12288, 14336, 16384, | ||||||
|  | #if CONFIG_EXTENDED_SIZE_CLASSES | ||||||
|  |     /* 4096 */ 20480, 24576, 28672, 32768, | ||||||
|  |     /* 8192 */ 40960, 49152, 57344, 65536, | ||||||
|  | #endif | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static const u16 size_class_slots[] = { | static const u16 size_class_slots[] = { | ||||||
|  | @ -121,7 +131,11 @@ static const u16 size_class_slots[] = { | ||||||
|     /* 256 */ 16, 16, 16, 16, |     /* 256 */ 16, 16, 16, 16, | ||||||
|     /* 512 */ 8, 8, 8, 8, |     /* 512 */ 8, 8, 8, 8, | ||||||
|     /* 1024 */ 8, 8, 8, 8, |     /* 1024 */ 8, 8, 8, 8, | ||||||
|     /* 2048 */ 6, 5, 4, 4 |     /* 2048 */ 6, 5, 4, 4, | ||||||
|  | #if CONFIG_EXTENDED_SIZE_CLASSES | ||||||
|  |     /* 4096 */ 2, 2, 2, 2, | ||||||
|  |     /* 8192 */ 2, 2, 2, 2, | ||||||
|  | #endif | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static const char *const size_class_labels[] = { | static const char *const size_class_labels[] = { | ||||||
|  | @ -134,7 +148,11 @@ static const char *const size_class_labels[] = { | ||||||
|     /* 256 */ "malloc 1280", "malloc 1536", "malloc 1792", "malloc 2048", |     /* 256 */ "malloc 1280", "malloc 1536", "malloc 1792", "malloc 2048", | ||||||
|     /* 512 */ "malloc 2560", "malloc 3072", "malloc 3584", "malloc 4096", |     /* 512 */ "malloc 2560", "malloc 3072", "malloc 3584", "malloc 4096", | ||||||
|     /* 1024 */ "malloc 5120", "malloc 6144", "malloc 7168", "malloc 8192", |     /* 1024 */ "malloc 5120", "malloc 6144", "malloc 7168", "malloc 8192", | ||||||
|     /* 2048 */ "malloc 10240", "malloc 12288", "malloc 14336", "malloc 16384" |     /* 2048 */ "malloc 10240", "malloc 12288", "malloc 14336", "malloc 16384", | ||||||
|  | #if CONFIG_EXTENDED_SIZE_CLASSES | ||||||
|  |     /* 4096 */ "malloc 20480", "malloc 24576", "malloc 28672", "malloc 32768", | ||||||
|  |     /* 8192 */ "malloc 40960", "malloc 49152", "malloc 57344", "malloc 65536", | ||||||
|  | #endif | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static void label_slab(void *slab, size_t slab_size, unsigned class) { | static void label_slab(void *slab, size_t slab_size, unsigned class) { | ||||||
|  | @ -180,7 +198,7 @@ static size_t get_slab_size(size_t slots, size_t size) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // limit on the number of cached empty slabs before attempting purging instead
 | // limit on the number of cached empty slabs before attempting purging instead
 | ||||||
| static const size_t max_empty_slabs_total = 64 * 1024; | static const size_t max_empty_slabs_total = 128 * 1024; | ||||||
| 
 | 
 | ||||||
| struct __attribute__((aligned(CACHELINE_SIZE))) size_class { | struct __attribute__((aligned(CACHELINE_SIZE))) size_class { | ||||||
|     struct mutex lock; |     struct mutex lock; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue