drain_remote_pages(); 
static void cache_reap(void *unused){	struct list_head *walk;	if (down_trylock(&cache_chain_sem)) {		/* Give up. Setup the next iteration. */		schedule_delayed_work(&__get_cpu_var(reap_work), REAPTIMEOUT_CPUC + smp_processor_id());		return;	}	list_for_each(walk, &cache_chain) {		kmem_cache_t *searchp;		struct list_head* p;		int tofree;		struct slab *slabp;		searchp = list_entry(walk, kmem_cache_t, next);		if (searchp->flags & SLAB_NO_REAP)			goto next;		check_irq_on();		spin_lock_irq(&searchp->spinlock);		drain_array_locked(searchp, ac_data(searchp), 0);		if(time_after(searchp->lists.next_reap, jiffies))			goto next_unlock;		searchp->lists.next_reap = jiffies + REAPTIMEOUT_LIST3;		if (searchp->lists.shared)			drain_array_locked(searchp, searchp->lists.shared, 0);		if (searchp->lists.free_touched) {			searchp->lists.free_touched = 0;			goto next_unlock;		}		tofree = (searchp->free_limit+5*searchp->num-1)/(5*searchp->num);		do {			p = list3_data(searchp)->slabs_free.next;			if (p == &(list3_data(searchp)->slabs_free))				break;			slabp = list_entry(p, struct slab, list);			BUG_ON(slabp->inuse);			list_del(&slabp->list);			STATS_INC_REAPED(searchp);			/* Safe to drop the lock. The slab is no longer			 * linked to the cache.			 * searchp cannot disappear, we hold			 * cache_chain_lock			 */			searchp->lists.free_objects -= searchp->num;			spin_unlock_irq(&searchp->spinlock);			slab_destroy(searchp, slabp);			spin_lock_irq(&searchp->spinlock);		} while(--tofree > 0);next_unlock:		spin_unlock_irq(&searchp->spinlock);next:		cond_resched();	}	check_irq_on();	up(&cache_chain_sem);	/* Setup the next iteration */	schedule_delayed_work(&__get_cpu_var(reap_work), REAPTIMEOUT_CPUC + smp_processor_id());}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/4ae7c03943fca73f23bc0cdb938070f41b98101f/slab.c/clean/mm/slab.c