Index: sys/fs/tmpfs/tmpfs_vnops.c =================================================================== --- sys/fs/tmpfs/tmpfs_vnops.c (revisione 237164) +++ sys/fs/tmpfs/tmpfs_vnops.c (copia locale) @@ -510,11 +510,15 @@ tmpfs_mappedread(vm_object_t vobj, vm_object_t tob offset = addr & PAGE_MASK; tlen = MIN(PAGE_SIZE - offset, len); - if ((vobj == NULL) || - (vobj->resident_page_count == 0 && vobj->cache == NULL)) + if (vobj == NULL) goto nocache; + + VM_OBJECT_LOCK(vobj); + if (vobj->resident_page_count == 0 && vm_object_cache_is_empty(vobj)) { + VM_OBJECT_UNLOCK(vobj); + goto nocache; + } - VM_OBJECT_LOCK(vobj); lookupvpg: if (((m = vm_page_lookup(vobj, idx)) != NULL) && vm_page_is_valid(m, offset, tlen)) { @@ -637,14 +641,17 @@ tmpfs_mappedwrite(vm_object_t vobj, vm_object_t to idx = OFF_TO_IDX(addr); offset = addr & PAGE_MASK; tlen = MIN(PAGE_SIZE - offset, len); + vpg = NULL; - if ((vobj == NULL) || - (vobj->resident_page_count == 0 && vobj->cache == NULL)) { - vpg = NULL; + if (vobj == NULL) goto nocache; + + VM_OBJECT_LOCK(vobj); + if (vobj->resident_page_count == 0 && vm_object_cache_is_empty(vobj)) { + VM_OBJECT_UNLOCK(vobj); + goto nocache; } - VM_OBJECT_LOCK(vobj); lookupvpg: if (((vpg = vm_page_lookup(vobj, idx)) != NULL) && vm_page_is_valid(vpg, offset, tlen)) { Index: sys/vm/vm_object.c =================================================================== --- sys/vm/vm_object.c (revisione 237164) +++ sys/vm/vm_object.c (copia locale) @@ -172,7 +172,7 @@ vm_object_zdtor(void *mem, int size, void *arg) ("object %p has reservations", object)); #endif - KASSERT(object->cache == NULL, + KASSERT(vm_object_cache_is_empty(object), ("object %p has cached pages", object)); KASSERT(object->paging_in_progress == 0, @@ -757,7 +757,7 @@ vm_object_terminate(vm_object_t object) if (__predict_false(!LIST_EMPTY(&object->rvq))) vm_reserv_break_all(object); #endif - if (__predict_false(object->cache != NULL)) + if (!vm_object_cache_is_empty(object)) vm_page_cache_free(object, 0, 0); /* @@ -1382,7 +1382,7 @@ retry: /* * Transfer any cached pages from orig_object to new_object. */ - if (__predict_false(orig_object->cache != NULL)) + if (!vm_object_cache_is_empty(orig_object)) vm_page_cache_transfer(orig_object, offidxstart, new_object); } @@ -1728,7 +1728,7 @@ vm_object_collapse(vm_object_t object) /* * Free any cached pages from backing_object. */ - if (__predict_false(backing_object->cache != NULL)) + if (!vm_object_cache_is_empty(backing_object)) vm_page_cache_free(backing_object, 0, 0); } /* @@ -1917,7 +1917,7 @@ again: } vm_object_pip_wakeup(object); skipmemq: - if (__predict_false(object->cache != NULL)) + if (!vm_object_cache_is_empty(object)) vm_page_cache_free(object, start, end); } Index: sys/vm/vm_object.h =================================================================== --- sys/vm/vm_object.h (revisione 237164) +++ sys/vm/vm_object.h (copia locale) @@ -208,6 +208,16 @@ vm_object_set_flag(vm_object_t object, u_short bit object->flags |= bits; } +/* + * The object must be locked or vm_page_queue_free_mtx must be held. + */ +static __inline int +vm_object_cache_is_empty(vm_object_t object) +{ + + return (__predict_true(object->cache == NULL)); +} + void vm_object_clear_flag(vm_object_t object, u_short bits); void vm_object_pip_add(vm_object_t object, short i); void vm_object_pip_subtract(vm_object_t object, short i); Index: sys/vm/vm_page.c =================================================================== --- sys/vm/vm_page.c (revisione 237164) +++ sys/vm/vm_page.c (copia locale) @@ -1146,7 +1146,7 @@ vm_page_cache_free(vm_object_t object, vm_pindex_t boolean_t empty; mtx_lock(&vm_page_queue_free_mtx); - if (__predict_false(object->cache == NULL)) { + if (vm_object_cache_is_empty(object)) { mtx_unlock(&vm_page_queue_free_mtx); return; } @@ -1344,7 +1344,7 @@ vm_page_is_cached(vm_object_t object, vm_pindex_t * exist. */ VM_OBJECT_LOCK_ASSERT(object, MA_OWNED); - if (__predict_true(object->cache == NULL)) + if (vm_object_cache_is_empty(object)) return (FALSE); mtx_lock(&vm_page_queue_free_mtx); m = vm_page_cache_lookup(object, pindex); Index: sys/vm/vnode_pager.c =================================================================== --- sys/vm/vnode_pager.c (revisione 237164) +++ sys/vm/vnode_pager.c (copia locale) @@ -440,7 +440,7 @@ vnode_pager_setsize(vp, nsize) */ vm_page_clear_dirty(m, base, PAGE_SIZE - base); } else if ((nsize & PAGE_MASK) && - __predict_false(object->cache != NULL)) { + !vm_object_cache_is_empty(object)) { vm_page_cache_free(object, OFF_TO_IDX(nsize), nobjsize); } Index: sys/cddl/compat/opensolaris/sys/vnode.h =================================================================== --- sys/cddl/compat/opensolaris/sys/vnode.h (revisione 237164) +++ sys/cddl/compat/opensolaris/sys/vnode.h (copia locale) @@ -76,7 +76,7 @@ vn_is_readonly(vnode_t *vp) #define vn_has_cached_data(vp) \ ((vp)->v_object != NULL && \ ((vp)->v_object->resident_page_count > 0 || \ - (vp)->v_object->cache != NULL)) + !vm_object_cache_is_empty((vp)->v_object))) #define vn_exists(vp) do { } while (0) #define vn_invalid(vp) do { } while (0) #define vn_renamepath(tdvp, svp, tnm, lentnm) do { } while (0)