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
This commit is contained in:
parent
eb2c06b63a
commit
f08f7dca40
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=268615
@ -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);
|
||||
}
|
||||
|
@ -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))
|
||||
|
Loading…
Reference in New Issue
Block a user