Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F115976710
D21456.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
12 KB
Referenced Files
None
Subscribers
None
D21456.diff
View Options
Index: head/sys/kern/vfs_vnops.c
===================================================================
--- head/sys/kern/vfs_vnops.c
+++ head/sys/kern/vfs_vnops.c
@@ -87,7 +87,7 @@
#include <vm/vm_map.h>
#include <vm/vm_object.h>
#include <vm/vm_page.h>
-#include <vm/vnode_pager.h>
+#include <vm/vm_pager.h>
#ifdef HWPMC_HOOKS
#include <sys/pmckern.h>
@@ -2502,7 +2502,7 @@
* writecount, then undo that now.
*/
if (writecounted)
- vnode_pager_release_writecount(object, 0, size);
+ vm_pager_release_writecount(object, 0, size);
vm_object_deallocate(object);
}
#ifdef HWPMC_HOOKS
Index: head/sys/vm/swap_pager.c
===================================================================
--- head/sys/vm/swap_pager.c
+++ head/sys/vm/swap_pager.c
@@ -376,6 +376,10 @@
static void swap_pager_init(void);
static void swap_pager_unswapped(vm_page_t);
static void swap_pager_swapoff(struct swdevt *sp);
+static void swap_pager_update_writecount(vm_object_t object,
+ vm_offset_t start, vm_offset_t end);
+static void swap_pager_release_writecount(vm_object_t object,
+ vm_offset_t start, vm_offset_t end);
struct pagerops swappagerops = {
.pgo_init = swap_pager_init, /* early system initialization of pager */
@@ -386,6 +390,8 @@
.pgo_putpages = swap_pager_putpages, /* pageout */
.pgo_haspage = swap_pager_haspage, /* get backing store status for page */
.pgo_pageunswapped = swap_pager_unswapped, /* remove swap related to page */
+ .pgo_update_writecount = swap_pager_update_writecount,
+ .pgo_release_writecount = swap_pager_release_writecount,
};
/*
@@ -611,6 +617,7 @@
object = vm_object_allocate(OBJT_SWAP, OFF_TO_IDX(offset +
PAGE_MASK + size));
+ object->un_pager.swp.writemappings = 0;
object->handle = handle;
if (cred != NULL) {
object->cred = cred;
@@ -1903,6 +1910,7 @@
atomic_thread_fence_rel();
object->type = OBJT_SWAP;
+ object->un_pager.swp.writemappings = 0;
KASSERT(object->handle == NULL, ("default pager with handle"));
}
@@ -2990,4 +2998,28 @@
mtx_unlock(&swbuf_mtx);
return (0);
+}
+
+static void
+swap_pager_update_writecount(vm_object_t object, vm_offset_t start,
+ vm_offset_t end)
+{
+
+ VM_OBJECT_WLOCK(object);
+ KASSERT((object->flags & OBJ_NOSPLIT) != 0,
+ ("Splittable object with writecount"));
+ object->un_pager.swp.writemappings += (vm_ooffset_t)end - start;
+ VM_OBJECT_WUNLOCK(object);
+}
+
+static void
+swap_pager_release_writecount(vm_object_t object, vm_offset_t start,
+ vm_offset_t end)
+{
+
+ VM_OBJECT_WLOCK(object);
+ KASSERT((object->flags & OBJ_NOSPLIT) != 0,
+ ("Splittable object with writecount"));
+ object->un_pager.swp.writemappings -= (vm_ooffset_t)end - start;
+ VM_OBJECT_WUNLOCK(object);
}
Index: head/sys/vm/vm_map.h
===================================================================
--- head/sys/vm/vm_map.h
+++ head/sys/vm/vm_map.h
@@ -144,7 +144,7 @@
#define MAP_ENTRY_GROWS_UP 0x00002000 /* bottom-up stacks */
#define MAP_ENTRY_WIRE_SKIPPED 0x00004000
-#define MAP_ENTRY_VN_WRITECNT 0x00008000 /* writeable vnode
+#define MAP_ENTRY_WRITECNT 0x00008000 /* tracked writeable
mapping */
#define MAP_ENTRY_GUARD 0x00010000
#define MAP_ENTRY_STACK_GAP_DN 0x00020000
@@ -348,7 +348,7 @@
#define MAP_CREATE_GUARD 0x00000080
#define MAP_DISABLE_COREDUMP 0x00000100
#define MAP_PREFAULT_MADVISE 0x00000200 /* from (user) madvise request */
-#define MAP_VN_WRITECOUNT 0x00000400
+#define MAP_WRITECOUNT 0x00000400
#define MAP_REMAP 0x00000800
#define MAP_STACK_GROWS_DOWN 0x00001000
#define MAP_STACK_GROWS_UP 0x00002000
Index: head/sys/vm/vm_map.c
===================================================================
--- head/sys/vm/vm_map.c
+++ head/sys/vm/vm_map.c
@@ -575,10 +575,10 @@
td->td_map_def_user = NULL;
while (entry != NULL) {
next = entry->next;
- MPASS((entry->eflags & (MAP_ENTRY_VN_WRITECNT |
- MAP_ENTRY_VN_EXEC)) != (MAP_ENTRY_VN_WRITECNT |
+ MPASS((entry->eflags & (MAP_ENTRY_WRITECNT |
+ MAP_ENTRY_VN_EXEC)) != (MAP_ENTRY_WRITECNT |
MAP_ENTRY_VN_EXEC));
- if ((entry->eflags & MAP_ENTRY_VN_WRITECNT) != 0) {
+ if ((entry->eflags & MAP_ENTRY_WRITECNT) != 0) {
/*
* Decrement the object's writemappings and
* possibly the vnode's v_writecount.
@@ -587,7 +587,7 @@
("Submap with writecount"));
object = entry->object.vm_object;
KASSERT(object != NULL, ("No object for writecount"));
- vnode_pager_release_writecount(object, entry->start,
+ vm_pager_release_writecount(object, entry->start,
entry->end);
}
vm_map_entry_set_vnode_text(entry, false);
@@ -1481,8 +1481,8 @@
protoeflags |= MAP_ENTRY_GROWS_DOWN;
if (cow & MAP_STACK_GROWS_UP)
protoeflags |= MAP_ENTRY_GROWS_UP;
- if (cow & MAP_VN_WRITECOUNT)
- protoeflags |= MAP_ENTRY_VN_WRITECNT;
+ if (cow & MAP_WRITECOUNT)
+ protoeflags |= MAP_ENTRY_WRITECNT;
if (cow & MAP_VN_EXEC)
protoeflags |= MAP_ENTRY_VN_EXEC;
if ((cow & MAP_CREATE_GUARD) != 0)
@@ -2211,7 +2211,7 @@
vm_map_entry_set_vnode_text(new_entry, true);
/*
* The object->un_pager.vnp.writemappings for the
- * object of MAP_ENTRY_VN_WRITECNT type entry shall be
+ * object of MAP_ENTRY_WRITECNT type entry shall be
* kept as is here. The virtual pages are
* re-distributed among the clipped entries, so the sum is
* left the same.
@@ -3783,20 +3783,20 @@
dst_entry->eflags |= MAP_ENTRY_COW |
MAP_ENTRY_NEEDS_COPY;
dst_entry->offset = src_entry->offset;
- if (src_entry->eflags & MAP_ENTRY_VN_WRITECNT) {
+ if (src_entry->eflags & MAP_ENTRY_WRITECNT) {
/*
- * MAP_ENTRY_VN_WRITECNT cannot
+ * MAP_ENTRY_WRITECNT cannot
* indicate write reference from
* src_entry, since the entry is
* marked as needs copy. Allocate a
* fake entry that is used to
- * decrement object->un_pager.vnp.writecount
+ * decrement object->un_pager writecount
* at the appropriate time. Attach
* fake_entry to the deferred list.
*/
fake_entry = vm_map_entry_create(dst_map);
- fake_entry->eflags = MAP_ENTRY_VN_WRITECNT;
- src_entry->eflags &= ~MAP_ENTRY_VN_WRITECNT;
+ fake_entry->eflags = MAP_ENTRY_WRITECNT;
+ src_entry->eflags &= ~MAP_ENTRY_WRITECNT;
vm_object_reference(src_object);
fake_entry->object.vm_object = src_object;
fake_entry->start = src_entry->start;
@@ -3971,7 +3971,7 @@
* not relock it later for the assertion
* correctness.
*/
- if (old_entry->eflags & MAP_ENTRY_VN_WRITECNT &&
+ if (old_entry->eflags & MAP_ENTRY_WRITECNT &&
object->type == OBJT_VNODE) {
KASSERT(((struct vnode *)object->handle)->
v_writecount > 0,
@@ -3991,8 +3991,8 @@
MAP_ENTRY_IN_TRANSITION);
new_entry->wiring_thread = NULL;
new_entry->wired_count = 0;
- if (new_entry->eflags & MAP_ENTRY_VN_WRITECNT) {
- vnode_pager_update_writecount(object,
+ if (new_entry->eflags & MAP_ENTRY_WRITECNT) {
+ vm_pager_update_writecount(object,
new_entry->start, new_entry->end);
}
vm_map_entry_set_vnode_text(new_entry, true);
@@ -4023,7 +4023,7 @@
* Copied entry is COW over the old object.
*/
new_entry->eflags &= ~(MAP_ENTRY_USER_WIRED |
- MAP_ENTRY_IN_TRANSITION | MAP_ENTRY_VN_WRITECNT);
+ MAP_ENTRY_IN_TRANSITION | MAP_ENTRY_WRITECNT);
new_entry->wiring_thread = NULL;
new_entry->wired_count = 0;
new_entry->object.vm_object = NULL;
@@ -4047,7 +4047,7 @@
new_entry->end = old_entry->end;
new_entry->eflags = old_entry->eflags &
~(MAP_ENTRY_USER_WIRED | MAP_ENTRY_IN_TRANSITION |
- MAP_ENTRY_VN_WRITECNT | MAP_ENTRY_VN_EXEC);
+ MAP_ENTRY_WRITECNT | MAP_ENTRY_VN_EXEC);
new_entry->protection = old_entry->protection;
new_entry->max_protection = old_entry->max_protection;
new_entry->inheritance = VM_INHERIT_ZERO;
Index: head/sys/vm/vm_mmap.c
===================================================================
--- head/sys/vm/vm_mmap.c
+++ head/sys/vm/vm_mmap.c
@@ -1289,7 +1289,7 @@
}
if (writex) {
*writecounted = TRUE;
- vnode_pager_update_writecount(obj, 0, objsize);
+ vm_pager_update_writecount(obj, 0, objsize);
}
} else {
error = EINVAL;
@@ -1345,7 +1345,7 @@
done:
if (error != 0 && *writecounted) {
*writecounted = FALSE;
- vnode_pager_update_writecount(obj, objsize, 0);
+ vm_pager_update_writecount(obj, objsize, 0);
}
vput(vp);
return (error);
@@ -1480,7 +1480,7 @@
* writecount, then undo that now.
*/
if (writecounted)
- vnode_pager_release_writecount(object, 0, size);
+ vm_pager_release_writecount(object, 0, size);
vm_object_deallocate(object);
}
return (error);
@@ -1569,7 +1569,7 @@
if (flags & MAP_SHARED)
docow |= MAP_INHERIT_SHARE;
if (writecounted)
- docow |= MAP_VN_WRITECOUNT;
+ docow |= MAP_WRITECOUNT;
if (flags & MAP_STACK) {
if (object != NULL)
return (EINVAL);
Index: head/sys/vm/vm_object.h
===================================================================
--- head/sys/vm/vm_object.h
+++ head/sys/vm/vm_object.h
@@ -167,6 +167,7 @@
struct {
void *swp_tmpfs;
struct pctrie swp_blks;
+ vm_ooffset_t writemappings;
} swp;
} un_pager;
struct ucred *cred;
Index: head/sys/vm/vm_pager.h
===================================================================
--- head/sys/vm/vm_pager.h
+++ head/sys/vm/vm_pager.h
@@ -61,6 +61,7 @@
typedef int pgo_populate_t(vm_object_t, vm_pindex_t, int, vm_prot_t,
vm_pindex_t *, vm_pindex_t *);
typedef void pgo_pageunswapped_t(vm_page_t);
+typedef void pgo_writecount_t(vm_object_t, vm_offset_t, vm_offset_t);
struct pagerops {
pgo_init_t *pgo_init; /* Initialize pager. */
@@ -72,6 +73,9 @@
pgo_haspage_t *pgo_haspage; /* Query page. */
pgo_populate_t *pgo_populate; /* Bulk spec pagein. */
pgo_pageunswapped_t *pgo_pageunswapped;
+ /* Operations for specialized writecount handling */
+ pgo_writecount_t *pgo_update_writecount;
+ pgo_writecount_t *pgo_release_writecount;
};
extern struct pagerops defaultpagerops;
@@ -190,6 +194,26 @@
VM_OBJECT_ASSERT_LOCKED(m->object);
if (pagertab[m->object->type]->pgo_pageunswapped)
(*pagertab[m->object->type]->pgo_pageunswapped)(m);
+}
+
+static __inline void
+vm_pager_update_writecount(vm_object_t object, vm_offset_t start,
+ vm_offset_t end)
+{
+
+ if (pagertab[object->type]->pgo_update_writecount)
+ pagertab[object->type]->pgo_update_writecount(object, start,
+ end);
+}
+
+static __inline void
+vm_pager_release_writecount(vm_object_t object, vm_offset_t start,
+ vm_offset_t end)
+{
+
+ if (pagertab[object->type]->pgo_release_writecount)
+ pagertab[object->type]->pgo_release_writecount(object, start,
+ end);
}
struct cdev_pager_ops {
Index: head/sys/vm/vnode_pager.h
===================================================================
--- head/sys/vm/vnode_pager.h
+++ head/sys/vm/vnode_pager.h
@@ -50,12 +50,8 @@
int vnode_pager_local_getpages(struct vop_getpages_args *ap);
int vnode_pager_local_getpages_async(struct vop_getpages_async_args *ap);
int vnode_pager_putpages_ioflags(int pager_flags);
-void vnode_pager_release_writecount(vm_object_t object, vm_offset_t start,
- vm_offset_t end);
void vnode_pager_undirty_pages(vm_page_t *ma, int *rtvals, int written,
off_t eof, int lpos);
-void vnode_pager_update_writecount(vm_object_t object, vm_offset_t start,
- vm_offset_t end);
#endif /* _KERNEL */
#endif /* _VNODE_PAGER_ */
Index: head/sys/vm/vnode_pager.c
===================================================================
--- head/sys/vm/vnode_pager.c
+++ head/sys/vm/vnode_pager.c
@@ -100,6 +100,10 @@
vm_ooffset_t, struct ucred *cred);
static int vnode_pager_generic_getpages_done(struct buf *);
static void vnode_pager_generic_getpages_done_async(struct buf *);
+static void vnode_pager_update_writecount(vm_object_t, vm_offset_t,
+ vm_offset_t);
+static void vnode_pager_release_writecount(vm_object_t, vm_offset_t,
+ vm_offset_t);
struct pagerops vnodepagerops = {
.pgo_alloc = vnode_pager_alloc,
@@ -108,6 +112,8 @@
.pgo_getpages_async = vnode_pager_getpages_async,
.pgo_putpages = vnode_pager_putpages,
.pgo_haspage = vnode_pager_haspage,
+ .pgo_update_writecount = vnode_pager_update_writecount,
+ .pgo_release_writecount = vnode_pager_release_writecount,
};
static struct domainset *vnode_domainset = NULL;
@@ -1500,7 +1506,7 @@
VM_OBJECT_WUNLOCK(obj);
}
-void
+static void
vnode_pager_update_writecount(vm_object_t object, vm_offset_t start,
vm_offset_t end)
{
@@ -1529,7 +1535,7 @@
VM_OBJECT_WUNLOCK(object);
}
-void
+static void
vnode_pager_release_writecount(vm_object_t object, vm_offset_t start,
vm_offset_t end)
{
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, May 2, 3:09 AM (12 h, 21 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
17897013
Default Alt Text
D21456.diff (12 KB)
Attached To
Mode
D21456: vm pager: writemapping accounting for OBJT_SWAP
Attached
Detach File
Event Timeline
Log In to Comment