mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	mm/slab: remove mm/slab.c and slab_def.h
Remove the SLAB implementation. Update CREDITS. Also update and properly sort the SLOB entry there. RIP SLAB allocator (1996 - 2024) Reviewed-by: Kees Cook <keescook@chromium.org> Acked-by: Christoph Lameter <cl@linux.com> Acked-by: David Rientjes <rientjes@google.com> Tested-by: David Rientjes <rientjes@google.com> Acked-by: Hyeonggon Yoo <42.hyeyoo@gmail.com> Tested-by: Hyeonggon Yoo <42.hyeyoo@gmail.com> Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
This commit is contained in:
		
							parent
							
								
									8c20b29db5
								
							
						
					
					
						commit
						16a1d96835
					
				
					 3 changed files with 8 additions and 4133 deletions
				
			
		
							
								
								
									
										12
									
								
								CREDITS
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								CREDITS
									
									
									
									
									
								
							| 
						 | 
					@ -9,10 +9,6 @@
 | 
				
			||||||
			Linus
 | 
								Linus
 | 
				
			||||||
----------
 | 
					----------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
N: Matt Mackal
 | 
					 | 
				
			||||||
E: mpm@selenic.com
 | 
					 | 
				
			||||||
D: SLOB slab allocator
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
N: Matti Aarnio
 | 
					N: Matti Aarnio
 | 
				
			||||||
E: mea@nic.funet.fi
 | 
					E: mea@nic.funet.fi
 | 
				
			||||||
D: Alpha systems hacking, IPv6 and other network related stuff
 | 
					D: Alpha systems hacking, IPv6 and other network related stuff
 | 
				
			||||||
| 
						 | 
					@ -1572,6 +1568,10 @@ S: Ampferstr. 50 / 4
 | 
				
			||||||
S: 6020 Innsbruck
 | 
					S: 6020 Innsbruck
 | 
				
			||||||
S: Austria
 | 
					S: Austria
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					N: Mark Hemment
 | 
				
			||||||
 | 
					E: markhe@nextd.demon.co.uk
 | 
				
			||||||
 | 
					D: SLAB allocator implementation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
N: Richard Henderson
 | 
					N: Richard Henderson
 | 
				
			||||||
E: rth@twiddle.net
 | 
					E: rth@twiddle.net
 | 
				
			||||||
E: rth@cygnus.com
 | 
					E: rth@cygnus.com
 | 
				
			||||||
| 
						 | 
					@ -2437,6 +2437,10 @@ D: work on suspend-to-ram/disk, killing duplicates from ioctl32,
 | 
				
			||||||
D: Altera SoCFPGA and Nokia N900 support.
 | 
					D: Altera SoCFPGA and Nokia N900 support.
 | 
				
			||||||
S: Czech Republic
 | 
					S: Czech Republic
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					N: Olivia Mackall
 | 
				
			||||||
 | 
					E: olivia@selenic.com
 | 
				
			||||||
 | 
					D: SLOB slab allocator
 | 
				
			||||||
 | 
					
 | 
				
			||||||
N: Paul Mackerras
 | 
					N: Paul Mackerras
 | 
				
			||||||
E: paulus@samba.org
 | 
					E: paulus@samba.org
 | 
				
			||||||
D: PPP driver
 | 
					D: PPP driver
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,124 +0,0 @@
 | 
				
			||||||
/* SPDX-License-Identifier: GPL-2.0 */
 | 
					 | 
				
			||||||
#ifndef _LINUX_SLAB_DEF_H
 | 
					 | 
				
			||||||
#define	_LINUX_SLAB_DEF_H
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <linux/kfence.h>
 | 
					 | 
				
			||||||
#include <linux/reciprocal_div.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * Definitions unique to the original Linux SLAB allocator.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct kmem_cache {
 | 
					 | 
				
			||||||
	struct array_cache __percpu *cpu_cache;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* 1) Cache tunables. Protected by slab_mutex */
 | 
					 | 
				
			||||||
	unsigned int batchcount;
 | 
					 | 
				
			||||||
	unsigned int limit;
 | 
					 | 
				
			||||||
	unsigned int shared;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	unsigned int size;
 | 
					 | 
				
			||||||
	struct reciprocal_value reciprocal_buffer_size;
 | 
					 | 
				
			||||||
/* 2) touched by every alloc & free from the backend */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	slab_flags_t flags;		/* constant flags */
 | 
					 | 
				
			||||||
	unsigned int num;		/* # of objs per slab */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* 3) cache_grow/shrink */
 | 
					 | 
				
			||||||
	/* order of pgs per slab (2^n) */
 | 
					 | 
				
			||||||
	unsigned int gfporder;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* force GFP flags, e.g. GFP_DMA */
 | 
					 | 
				
			||||||
	gfp_t allocflags;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	size_t colour;			/* cache colouring range */
 | 
					 | 
				
			||||||
	unsigned int colour_off;	/* colour offset */
 | 
					 | 
				
			||||||
	unsigned int freelist_size;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* constructor func */
 | 
					 | 
				
			||||||
	void (*ctor)(void *obj);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* 4) cache creation/removal */
 | 
					 | 
				
			||||||
	const char *name;
 | 
					 | 
				
			||||||
	struct list_head list;
 | 
					 | 
				
			||||||
	int refcount;
 | 
					 | 
				
			||||||
	int object_size;
 | 
					 | 
				
			||||||
	int align;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* 5) statistics */
 | 
					 | 
				
			||||||
#ifdef CONFIG_DEBUG_SLAB
 | 
					 | 
				
			||||||
	unsigned long num_active;
 | 
					 | 
				
			||||||
	unsigned long num_allocations;
 | 
					 | 
				
			||||||
	unsigned long high_mark;
 | 
					 | 
				
			||||||
	unsigned long grown;
 | 
					 | 
				
			||||||
	unsigned long reaped;
 | 
					 | 
				
			||||||
	unsigned long errors;
 | 
					 | 
				
			||||||
	unsigned long max_freeable;
 | 
					 | 
				
			||||||
	unsigned long node_allocs;
 | 
					 | 
				
			||||||
	unsigned long node_frees;
 | 
					 | 
				
			||||||
	unsigned long node_overflow;
 | 
					 | 
				
			||||||
	atomic_t allochit;
 | 
					 | 
				
			||||||
	atomic_t allocmiss;
 | 
					 | 
				
			||||||
	atomic_t freehit;
 | 
					 | 
				
			||||||
	atomic_t freemiss;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/*
 | 
					 | 
				
			||||||
	 * If debugging is enabled, then the allocator can add additional
 | 
					 | 
				
			||||||
	 * fields and/or padding to every object. 'size' contains the total
 | 
					 | 
				
			||||||
	 * object size including these internal fields, while 'obj_offset'
 | 
					 | 
				
			||||||
	 * and 'object_size' contain the offset to the user object and its
 | 
					 | 
				
			||||||
	 * size.
 | 
					 | 
				
			||||||
	 */
 | 
					 | 
				
			||||||
	int obj_offset;
 | 
					 | 
				
			||||||
#endif /* CONFIG_DEBUG_SLAB */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef CONFIG_KASAN_GENERIC
 | 
					 | 
				
			||||||
	struct kasan_cache kasan_info;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef CONFIG_SLAB_FREELIST_RANDOM
 | 
					 | 
				
			||||||
	unsigned int *random_seq;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef CONFIG_HARDENED_USERCOPY
 | 
					 | 
				
			||||||
	unsigned int useroffset;	/* Usercopy region offset */
 | 
					 | 
				
			||||||
	unsigned int usersize;		/* Usercopy region size */
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct kmem_cache_node *node[MAX_NUMNODES];
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static inline void *nearest_obj(struct kmem_cache *cache, const struct slab *slab,
 | 
					 | 
				
			||||||
				void *x)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	void *object = x - (x - slab->s_mem) % cache->size;
 | 
					 | 
				
			||||||
	void *last_object = slab->s_mem + (cache->num - 1) * cache->size;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (unlikely(object > last_object))
 | 
					 | 
				
			||||||
		return last_object;
 | 
					 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
		return object;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * We want to avoid an expensive divide : (offset / cache->size)
 | 
					 | 
				
			||||||
 *   Using the fact that size is a constant for a particular cache,
 | 
					 | 
				
			||||||
 *   we can replace (offset / cache->size) by
 | 
					 | 
				
			||||||
 *   reciprocal_divide(offset, cache->reciprocal_buffer_size)
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
static inline unsigned int obj_to_index(const struct kmem_cache *cache,
 | 
					 | 
				
			||||||
					const struct slab *slab, void *obj)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	u32 offset = (obj - slab->s_mem);
 | 
					 | 
				
			||||||
	return reciprocal_divide(offset, cache->reciprocal_buffer_size);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static inline int objs_per_slab(const struct kmem_cache *cache,
 | 
					 | 
				
			||||||
				     const struct slab *slab)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	if (is_kfence_address(slab_address(slab)))
 | 
					 | 
				
			||||||
		return 1;
 | 
					 | 
				
			||||||
	return cache->num;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif	/* _LINUX_SLAB_DEF_H */
 | 
					 | 
				
			||||||
		Loading…
	
		Reference in a new issue