slab: introduce helper functions to get/set free object
In the following patches, to get/set free objects from the freelist is changed so that simple casting doesn't work for it. Therefore, introduce helper functions. Acked-by: Christoph Lameter <cl@linux.com> Signed-off-by: Joonsoo Kim <iamjoonsoo.kim@lge.com> Signed-off-by: Pekka Enberg <penberg@kernel.org>
This commit is contained in:
		
							parent
							
								
									9cef2e2b65
								
							
						
					
					
						commit
						e5c58dfdcb
					
				
							
								
								
									
										20
									
								
								mm/slab.c
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								mm/slab.c
									
									
									
									
									
								
							| @ -2548,9 +2548,15 @@ static void *alloc_slabmgmt(struct kmem_cache *cachep, | ||||
| 	return freelist; | ||||
| } | ||||
| 
 | ||||
| static inline unsigned int *slab_freelist(struct page *page) | ||||
| static inline unsigned int get_free_obj(struct page *page, unsigned int idx) | ||||
| { | ||||
| 	return (unsigned int *)(page->freelist); | ||||
| 	return ((unsigned int *)page->freelist)[idx]; | ||||
| } | ||||
| 
 | ||||
| static inline void set_free_obj(struct page *page, | ||||
| 					unsigned int idx, unsigned int val) | ||||
| { | ||||
| 	((unsigned int *)(page->freelist))[idx] = val; | ||||
| } | ||||
| 
 | ||||
| static void cache_init_objs(struct kmem_cache *cachep, | ||||
| @ -2595,7 +2601,7 @@ static void cache_init_objs(struct kmem_cache *cachep, | ||||
| 		if (cachep->ctor) | ||||
| 			cachep->ctor(objp); | ||||
| #endif | ||||
| 		slab_freelist(page)[i] = i; | ||||
| 		set_free_obj(page, i, i); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| @ -2614,7 +2620,7 @@ static void *slab_get_obj(struct kmem_cache *cachep, struct page *page, | ||||
| { | ||||
| 	void *objp; | ||||
| 
 | ||||
| 	objp = index_to_obj(cachep, page, slab_freelist(page)[page->active]); | ||||
| 	objp = index_to_obj(cachep, page, get_free_obj(page, page->active)); | ||||
| 	page->active++; | ||||
| #if DEBUG | ||||
| 	WARN_ON(page_to_nid(virt_to_page(objp)) != nodeid); | ||||
| @ -2635,7 +2641,7 @@ static void slab_put_obj(struct kmem_cache *cachep, struct page *page, | ||||
| 
 | ||||
| 	/* Verify double free bug */ | ||||
| 	for (i = page->active; i < cachep->num; i++) { | ||||
| 		if (slab_freelist(page)[i] == objnr) { | ||||
| 		if (get_free_obj(page, i) == objnr) { | ||||
| 			printk(KERN_ERR "slab: double free detected in cache " | ||||
| 					"'%s', objp %p\n", cachep->name, objp); | ||||
| 			BUG(); | ||||
| @ -2643,7 +2649,7 @@ static void slab_put_obj(struct kmem_cache *cachep, struct page *page, | ||||
| 	} | ||||
| #endif | ||||
| 	page->active--; | ||||
| 	slab_freelist(page)[page->active] = objnr; | ||||
| 	set_free_obj(page, page->active, objnr); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
| @ -4216,7 +4222,7 @@ static void handle_slab(unsigned long *n, struct kmem_cache *c, | ||||
| 
 | ||||
| 		for (j = page->active; j < c->num; j++) { | ||||
| 			/* Skip freed item */ | ||||
| 			if (slab_freelist(page)[j] == i) { | ||||
| 			if (get_free_obj(page, j) == i) { | ||||
| 				active = false; | ||||
| 				break; | ||||
| 			} | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user