diff options
author | kib <kib@FreeBSD.org> | 2014-07-14 09:30:37 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2014-07-14 09:30:37 +0000 |
commit | 8664d64bc36b1c178711d560358193de021c363b (patch) | |
tree | 81662c710560697ae0f6f033972aa0c2eec3adaf /sys/vm | |
parent | e152d896521719791fa35fa048ca142de1bb5744 (diff) | |
download | FreeBSD-src-8664d64bc36b1c178711d560358193de021c363b.zip FreeBSD-src-8664d64bc36b1c178711d560358193de021c363b.tar.gz |
The OBJ_TMPFS flag of vm_object means that there is unreclaimed tmpfs
vnode for the tmpfs node owning this object. The flag is currently
used for two purposes. First, it allows to correctly handle VV_TEXT
for tmpfs vnode when the ref count on the object is decremented to 1,
similar to vnode_pager_dealloc() for regular filesystems. Second, it
prevents some operations, which are done on OBJT_SWAP vm objects
backing user anonymous memory, but are incorrect for the object owned
by tmpfs node.
The second kind of use of the OBJ_TMPFS flag is incorrect, since the
vnode might be reclaimed, which clears the flag, but vm object
operations must still be disallowed.
Introduce one more flag, OBJ_TMPFS_NODE, which is permanently set on
the object for VREG tmpfs node, and used instead of OBJ_TMPFS to test
whether vm object collapse and similar actions should be disabled.
Tested by: pho
Sponsored by: The FreeBSD Foundation
MFC after: 2 weeks
Diffstat (limited to 'sys/vm')
-rw-r--r-- | sys/vm/vm_object.c | 6 | ||||
-rw-r--r-- | sys/vm/vm_object.h | 3 |
2 files changed, 5 insertions, 4 deletions
diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c index b428219..1b97bdf 100644 --- a/sys/vm/vm_object.c +++ b/sys/vm/vm_object.c @@ -553,13 +553,13 @@ vm_object_deallocate(vm_object_t object) object->handle == NULL && (object->type == OBJT_DEFAULT || (object->type == OBJT_SWAP && - (object->flags & OBJ_TMPFS) == 0))) { + (object->flags & OBJ_TMPFS_NODE) == 0))) { vm_object_set_flag(object, OBJ_ONEMAPPING); } else if ((object->shadow_count == 1) && (object->handle == NULL) && (object->type == OBJT_DEFAULT || object->type == OBJT_SWAP)) { - KASSERT((object->flags & OBJ_TMPFS) == 0, + KASSERT((object->flags & OBJ_TMPFS_NODE) == 0, ("shadowed tmpfs v_object %p", object)); vm_object_t robject; @@ -2103,7 +2103,7 @@ vm_object_coalesce(vm_object_t prev_object, vm_ooffset_t prev_offset, VM_OBJECT_WLOCK(prev_object); if ((prev_object->type != OBJT_DEFAULT && prev_object->type != OBJT_SWAP) || - (prev_object->flags & OBJ_TMPFS) != 0) { + (prev_object->flags & OBJ_TMPFS_NODE) != 0) { VM_OBJECT_WUNLOCK(prev_object); return (FALSE); } diff --git a/sys/vm/vm_object.h b/sys/vm/vm_object.h index d59a9e6..8381992 100644 --- a/sys/vm/vm_object.h +++ b/sys/vm/vm_object.h @@ -186,10 +186,11 @@ struct vm_object { #define OBJ_NOSPLIT 0x0010 /* dont split this object */ #define OBJ_PIPWNT 0x0040 /* paging in progress wanted */ #define OBJ_MIGHTBEDIRTY 0x0100 /* object might be dirty, only for vnode */ +#define OBJ_TMPFS_NODE 0x0200 /* object belongs to tmpfs VREG node */ #define OBJ_COLORED 0x1000 /* pg_color is defined */ #define OBJ_ONEMAPPING 0x2000 /* One USE (a single, non-forked) mapping flag */ #define OBJ_DISCONNECTWNT 0x4000 /* disconnect from vnode wanted */ -#define OBJ_TMPFS 0x8000 +#define OBJ_TMPFS 0x8000 /* has tmpfs vnode allocated */ #define IDX_TO_OFF(idx) (((vm_ooffset_t)(idx)) << PAGE_SHIFT) #define OFF_TO_IDX(off) ((vm_pindex_t)(((vm_ooffset_t)(off)) >> PAGE_SHIFT)) |