return ac_entry(ac)[--ac->avail]; 
return ac->entry[--ac->avail]; 
static void *cache_alloc_refill(kmem_cache_t *cachep, unsigned int __nocast flags){	int batchcount;	struct kmem_list3 *l3;	struct array_cache *ac;	check_irq_off();	ac = ac_data(cachep);retry:	batchcount = ac->batchcount;	if (!ac->touched && batchcount > BATCHREFILL_LIMIT) {		/* if there was little recent activity on this		 * cache, then perform only a partial refill.		 * Otherwise we could generate refill bouncing.		 */		batchcount = BATCHREFILL_LIMIT;	}	l3 = list3_data(cachep);	BUG_ON(ac->avail > 0);	spin_lock(&cachep->spinlock);	if (l3->shared) {		struct array_cache *shared_array = l3->shared;		if (shared_array->avail) {			if (batchcount > shared_array->avail)				batchcount = shared_array->avail;			shared_array->avail -= batchcount;			ac->avail = batchcount;			memcpy(ac_entry(ac), &ac_entry(shared_array)[shared_array->avail],					sizeof(void*)*batchcount);			shared_array->touched = 1;			goto alloc_done;		}	}	while (batchcount > 0) {		struct list_head *entry;		struct slab *slabp;		/* Get slab alloc is to come from. */		entry = l3->slabs_partial.next;		if (entry == &l3->slabs_partial) {			l3->free_touched = 1;			entry = l3->slabs_free.next;			if (entry == &l3->slabs_free)				goto must_grow;		}		slabp = list_entry(entry, struct slab, list);		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)[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;#endif		       	slabp->free = next;		}		check_slabp(cachep, slabp);		/* move slabp to correct slabp list: */		list_del(&slabp->list);		if (slabp->free == BUFCTL_END)			list_add(&slabp->list, &l3->slabs_full);		else			list_add(&slabp->list, &l3->slabs_partial);	}must_grow:	l3->free_objects -= ac->avail;alloc_done:	spin_unlock(&cachep->spinlock);	if (unlikely(!ac->avail)) {		int x;		x = cache_grow(cachep, flags, -1);				// cache_grow can reenable interrupts, then ac could change.		ac = ac_data(cachep);		if (!x && ac->avail == 0)	// no objects in sight? abort			return NULL;		if (!ac->avail)		// objects refilled by interrupt?			goto retry;	}	ac->touched = 1;	return ac_entry(ac)[--ac->avail];}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/e498be7dafd72fd68848c1eef1575aa7c5d658df/slab.c/clean/mm/slab.c