Index: sys/fs/tmpfs/tmpfs_vnops.c =================================================================== --- sys/fs/tmpfs/tmpfs_vnops.c (revisione 233702) +++ sys/fs/tmpfs/tmpfs_vnops.c (copia locale) @@ -514,7 +514,7 @@ tmpfs_mappedread(vm_object_t vobj, vm_object_t tob goto nocache; VM_OBJECT_LOCK(vobj); - if (vobj->cached_page_count == 0) { + if (vobj->resident_page_count == 0 && vobj->cached_page_count == 0) { VM_OBJECT_UNLOCK(vobj); goto nocache; } @@ -647,7 +647,7 @@ tmpfs_mappedwrite(vm_object_t vobj, vm_object_t to } VM_OBJECT_LOCK(vobj); - if (vobj->cached_page_count == 0) { + if (vobj->resident_page_count == 0 && vobj->cached_page_count == 0) { VM_OBJECT_UNLOCK(vobj); vpg = NULL; goto nocache; @@ -669,6 +669,20 @@ lookupvpg: VM_OBJECT_UNLOCK(vobj); error = uiomove_fromphys(&vpg, offset, tlen, uio); } else { + vpg = vm_radix_lookup(&vobj->rtree, idx, VM_RADIX_RED); + CTR4(KTR_FLO, "%s: lookup page %p, object %p idx %ju", + __func__, p, p->object, (uintmax_t)idx); + if (vpg != NULL && (vpg->flags & PG_CACHED) != 0) { + CTR4(KTR_FLO, "%s: try rem page %p, object %p, idx %ju", + __func__, p, p->object, (uintmax_t)idx); + mtx_lock(&vm_page_queue_free_mtx); + if (vpg->object == vobj) { + CTR3(KTR_FLO, "%s: page %p, object %p", + __func__, p, p->object); + vm_page_cache_free(vpg); + } + mtx_unlock(&vm_page_queue_free_mtx); + } VM_OBJECT_UNLOCK(vobj); vpg = NULL; } Index: sys/vm/vm_pageout.c =================================================================== --- sys/vm/vm_pageout.c (revisione 233702) +++ sys/vm/vm_pageout.c (copia locale) @@ -926,6 +926,8 @@ rescan0: * Clean pages can be placed onto the cache queue. * This effectively frees them. */ + CTR3(KTR_FLO, "%s: insert page %p, object %p", + __func__, m, m->object); vm_page_cache(m); --page_shortage; } else if ((m->flags & PG_WINATCFLS) == 0 && pass == 0) { @@ -1212,9 +1214,12 @@ unlock_and_continue: if (object->ref_count == 0) { KASSERT(!pmap_page_is_mapped(m), ("vm_pageout_scan: page %p is mapped", m)); - if (m->dirty == 0) + if (m->dirty == 0) { + CTR3(KTR_FLO, + "%s: insert page %p, object %p", + __func__, m, m->object); vm_page_cache(m); - else + } else vm_page_deactivate(m); } else { vm_page_deactivate(m); Index: sys/vm/vm_object.c =================================================================== --- sys/vm/vm_object.c (revisione 233702) +++ sys/vm/vm_object.c (copia locale) @@ -73,6 +73,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include /* for curproc, pageproc */ @@ -176,8 +177,8 @@ vm_object_zdtor(void *mem, int size, void *arg) object)); #endif KASSERT(object->cached_page_count == 0, - ("object %p has cached pages", - object)); + ("object %p has %d cached pages", + object, object->cached_page_count)); KASSERT(object->paging_in_progress == 0, ("object %p paging_in_progress = %d", object, object->paging_in_progress)); @@ -1510,8 +1511,11 @@ restart: */ if (p->flags & PG_CACHED) { mtx_lock(&vm_page_queue_free_mtx); - if (p->object == backing_object) + if (p->object == backing_object) { + CTR3(KTR_FLO, "%s: page %p, object %p", + __func__, p, p->object); vm_page_cache_free(p); + } mtx_unlock(&vm_page_queue_free_mtx); continue; } else if (p->object != backing_object) @@ -1932,6 +1936,8 @@ restart: if (p->flags & PG_CACHED) { mtx_lock(&vm_page_queue_free_mtx); if (p->object == object) { + CTR3(KTR_FLO, "%s: page %p, object %p", + __func__, p, p->object); vm_page_cache_free(p); if (object->type == OBJT_VNODE && object->cached_page_count == 0) Index: sys/vm/vm_fault.c =================================================================== --- sys/vm/vm_fault.c (revisione 233703) +++ sys/vm/vm_fault.c (copia locale) @@ -79,6 +79,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -503,8 +504,12 @@ readrest: pmap_remove_all(mt); if (mt->dirty != 0) vm_page_deactivate(mt); - else + else { + CTR3(KTR_FLO, + "%s: insert page %p, object %p", + __func__, mt, mt->object); vm_page_cache(mt); + } vm_page_unlock(mt); } ahead += behind; Index: sys/vm/vm_page.c =================================================================== --- sys/vm/vm_page.c (revisione 233702) +++ sys/vm/vm_page.c (copia locale) @@ -85,6 +85,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -1077,6 +1078,7 @@ vm_page_cache_rename(vm_page_t m, vm_object_t new_ * If the insert fails we simply free the cached page. */ if (vm_radix_insert(&new_object->rtree, idx, m) != 0) { + CTR3(KTR_FLO, "%s: page %p, object %p", __func__, m, m->object); vm_page_cache_free(m); return; } Index: sys/vm/vm_contig.c =================================================================== --- sys/vm/vm_contig.c (revisione 233702) +++ sys/vm/vm_contig.c (copia locale) @@ -69,6 +69,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -144,6 +145,8 @@ vm_contig_launder_page(vm_page_t m, vm_page_t *nex return (0); } } else { + CTR3(KTR_FLO, "%s: insert page %p, object %p", + __func__, m, m->object); vm_page_cache(m); vm_page_unlock(m); } Index: sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c =================================================================== --- sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c (revisione 233702) +++ sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c (copia locale) @@ -71,6 +71,7 @@ #include #include #include +#include #include /* @@ -343,8 +344,12 @@ page_lookup(vnode_t *vp, int64_t start, int64_t of if (obj->cached_page_count != 0 && (pp->flags & PG_CACHED) != 0) { mtx_lock(&vm_page_queue_free_mtx); - if (pp->object == obj) + if (pp->object == obj) { + CTR3(KTR_FLO, + "%s: page %p, object %p", + __func__, pp, pp->object); vm_page_cache_free(pp); + } mtx_unlock(&vm_page_queue_free_mtx); } pp = NULL; Index: sys/sys/ktr.h =================================================================== --- sys/sys/ktr.h (revisione 233702) +++ sys/sys/ktr.h (copia locale) @@ -75,7 +75,8 @@ #define KTR_INET6 0x10000000 /* IPv6 stack */ #define KTR_SCHED 0x20000000 /* Machine parsed sched info. */ #define KTR_BUF 0x40000000 /* Buffer cache */ -#define KTR_ALL 0x7fffffff +#define KTR_FLO 0x80000000 +#define KTR_ALL 0xffffffff /* Trace classes to compile in */ #ifdef KTR