Messages in this thread Patch in this message | | | Date | Fri, 18 Nov 2005 11:43:16 -0800 | From | Matthew Dobson <> | Subject | [RFC][PATCH 5/8] get_object/return_object |
| |
Move the code to get/return an object back to its slab into their own functions.
-Matt Create two helper functions: get_object_from_slab() & return_object_to_slab(). Use these two helper function to replace duplicated code in mm/slab.c
These functions will also be reused by a later patch in this series.
Signed-off-by: Matthew Dobson <colpatch@us.ibm.com>
Index: linux-2.6.15-rc1+critical_pool/mm/slab.c =================================================================== --- linux-2.6.15-rc1+critical_pool.orig/mm/slab.c 2005-11-17 16:39:24.401412160 -0800 +++ linux-2.6.15-rc1+critical_pool/mm/slab.c 2005-11-17 16:45:07.337277984 -0800 @@ -2148,6 +2148,42 @@ static void kmem_flagcheck(kmem_cache_t } } +static void *get_object(kmem_cache_t *cachep, struct slab *slabp, int nid) +{ + void *obj = slabp->s_mem + (slabp->free * cachep->objsize); + kmem_bufctl_t next; + + slabp->inuse++; + next = slab_bufctl(slabp)[slabp->free]; +#if DEBUG + slab_bufctl(slabp)[slabp->free] = BUFCTL_FREE; + WARN_ON(slabp->nid != nid); +#endif + slabp->free = next; + + return obj; +} + +static void return_object(kmem_cache_t *cachep, struct slab *slabp, void *objp, + int nid) +{ + unsigned int objnr = (objp - slabp->s_mem) / cachep->objsize; + +#if DEBUG + /* Verify that the slab belongs to the intended node */ + WARN_ON(slabp->nid != nid); + + if (slab_bufctl(slabp)[objnr] != BUFCTL_FREE) { + printk(KERN_ERR "slab: double free detected in cache " + "'%s', objp %p\n", cachep->name, objp); + BUG(); + } +#endif + slab_bufctl(slabp)[objnr] = slabp->free; + slabp->free = objnr; + slabp->inuse--; +} + static void set_slab_attr(kmem_cache_t *cachep, struct slab *slabp, void *objp) { int i; @@ -2436,22 +2472,12 @@ retry: check_slabp(cachep, slabp); check_spinlock_acquired(cachep); while (slabp->inuse < cachep->num && batchcount--) { - kmem_bufctl_t next; STATS_INC_ALLOCED(cachep); STATS_INC_ACTIVE(cachep); STATS_SET_HIGH(cachep); - /* get obj pointer */ - ac->entry[ac->avail++] = slabp->s_mem + - slabp->free*cachep->objsize; - - slabp->inuse++; - next = slab_bufctl(slabp)[slabp->free]; -#if DEBUG - slab_bufctl(slabp)[slabp->free] = BUFCTL_FREE; - WARN_ON(numa_node_id() != slabp->nid); -#endif - slabp->free = next; + ac->entry[ac->avail++] = get_object(cachep, slabp, + numa_node_id()); } check_slabp(cachep, slabp); @@ -2586,7 +2612,6 @@ static void *__cache_alloc_node(kmem_cac struct slab *slabp; struct kmem_list3 *l3; void *obj; - kmem_bufctl_t next; int x; l3 = cachep->nodelists[nid]; @@ -2612,14 +2637,7 @@ retry: BUG_ON(slabp->inuse == cachep->num); - /* get obj pointer */ - obj = slabp->s_mem + slabp->free * cachep->objsize; - slabp->inuse++; - next = slab_bufctl(slabp)[slabp->free]; -#if DEBUG - slab_bufctl(slabp)[slabp->free] = BUFCTL_FREE; -#endif - slabp->free = next; + obj = get_object(cachep, slabp, nid); check_slabp(cachep, slabp); l3->free_objects--; /* move slabp to correct slabp list: */ @@ -2659,29 +2677,14 @@ static void free_block(kmem_cache_t *cac for (i = 0; i < nr_objects; i++) { void *objp = objpp[i]; struct slab *slabp; - unsigned int objnr; slabp = GET_PAGE_SLAB(virt_to_page(objp)); l3 = cachep->nodelists[nid]; list_del(&slabp->list); - objnr = (objp - slabp->s_mem) / cachep->objsize; check_spinlock_acquired_node(cachep, nid); check_slabp(cachep, slabp); - -#if DEBUG - /* Verify that the slab belongs to the intended node */ - WARN_ON(slabp->nid != nid); - - if (slab_bufctl(slabp)[objnr] != BUFCTL_FREE) { - printk(KERN_ERR "slab: double free detected in cache " - "'%s', objp %p\n", cachep->name, objp); - BUG(); - } -#endif - slab_bufctl(slabp)[objnr] = slabp->free; - slabp->free = objnr; + return_object(cachep, slabp, objp, nid); STATS_DEC_ACTIVE(cachep); - slabp->inuse--; l3->free_objects++; check_slabp(cachep, slabp); | |