rem: TRACE(("vm_cache_release_ref: cache_ref 0x%x, ref will be %d\n", cache_ref, cache_ref->ref_count - 1));
add: TRACE(("vm_cache_release_ref: cache_ref %p, ref will be %ld\n", cache_ref, cache_ref->ref_count - 1));
context: vm_cache_release_ref(vm_cache_ref *cache_ref){	vm_page *page;	TRACE(("vm_cache_release_ref: cache_ref 0x%x, ref will be %d\n", cache_ref, cache_ref->ref_count - 1));	if (cache_ref == NULL)		panic("vm_cache_release_ref: passed NULL\n");	if (atomic_add(&cache_ref->ref_count, -1) != 1) {		if (cache_ref->cache->store->ops->release_ref)			cache_ref->cache->store->ops->release_ref(cache_ref->cache->store);		return;	}	// delete this cache	// delete the cache's backing store, if it has one	if (cache_ref->cache->store)		(*cache_ref->cache->store->ops->destroy)(cache_ref->cache->store);	// free all of the pages in the cache	page = cache_ref->cache->page_list;	while (page) {		vm_page *oldPage = page;		int state;		page = page->cache_next;		// remove it from the hash table		state = disable_interrupts();		acquire_spinlock(&page_cache_table_lock);		hash_remove(page_cache_table, oldPage);		release_spinlock(&page_cache_table_lock);		restore_interrupts(state);		TRACE(("vm_cache_release_ref: freeing page 0x%x\n", oldPage->ppn));		vm_page_set_state(oldPage, PAGE_STATE_FREE);	}	// remove the ref to the source	if (cache_ref->cache->source)		vm_cache_release_ref(cache_ref->cache->source->ref);	mutex_destroy(&cache_ref->lock);	free(cache_ref->cache);	free(cache_ref);}