svn commit: r355064 - head/sys/vm
Konstantin Belousov
kib at FreeBSD.org
Sun Nov 24 19:18:13 UTC 2019
Author: kib
Date: Sun Nov 24 19:18:12 2019
New Revision: 355064
URL: https://svnweb.freebsd.org/changeset/base/355064
Log:
Ignore object->handle for OBJ_ANON objects.
Note that the change in vm_object_collapse() is arguably a correctness
fix. We must not collapse into content-identity carrying objects.
Reviewed by: jeff
Tested by: pho
Sponsored by: The FreeBSD Foundation
Differential revision: https://reviews.freebsd.org/D22467
Modified:
head/sys/vm/vm_map.c
head/sys/vm/vm_object.c
Modified: head/sys/vm/vm_map.c
==============================================================================
--- head/sys/vm/vm_map.c Sun Nov 24 19:16:57 2019 (r355063)
+++ head/sys/vm/vm_map.c Sun Nov 24 19:18:12 2019 (r355064)
@@ -3764,8 +3764,7 @@ vm_map_copy_entry(
if ((src_object = src_entry->object.vm_object) != NULL) {
VM_OBJECT_WLOCK(src_object);
charged = ENTRY_CHARGED(src_entry);
- if (src_object->handle == NULL &&
- (src_object->flags & OBJ_ANON) != 0) {
+ if ((src_object->flags & OBJ_ANON) != 0) {
vm_object_collapse(src_object);
if ((src_object->flags & OBJ_ONEMAPPING) != 0) {
vm_object_split(src_entry);
Modified: head/sys/vm/vm_object.c
==============================================================================
--- head/sys/vm/vm_object.c Sun Nov 24 19:16:57 2019 (r355063)
+++ head/sys/vm/vm_object.c Sun Nov 24 19:18:12 2019 (r355064)
@@ -530,7 +530,7 @@ vm_object_vndeallocate(vm_object_t object)
void
vm_object_deallocate(vm_object_t object)
{
- vm_object_t temp;
+ vm_object_t robject, temp;
bool released;
while (object != NULL) {
@@ -565,19 +565,17 @@ vm_object_deallocate(vm_object_t object)
return;
} else if (object->ref_count == 1) {
if (object->shadow_count == 0 &&
- object->handle == NULL &&
(object->flags & OBJ_ANON) != 0) {
vm_object_set_flag(object, OBJ_ONEMAPPING);
- } else if ((object->shadow_count == 1) &&
- (object->handle == NULL) &&
- (object->flags & OBJ_ANON) != 0) {
- vm_object_t robject;
-
+ } else if (object->shadow_count == 1) {
+ KASSERT((object->flags & OBJ_ANON) != 0,
+ ("obj %p with shadow_count > 0 is not anon",
+ object));
robject = LIST_FIRST(&object->shadow_head);
KASSERT(robject != NULL,
- ("vm_object_deallocate: ref_count: %d, shadow_count: %d",
- object->ref_count,
- object->shadow_count));
+ ("vm_object_deallocate: ref_count: %d, "
+ "shadow_count: %d", object->ref_count,
+ object->shadow_count));
KASSERT((robject->flags & OBJ_TMPFS_NODE) == 0,
("shadowed tmpfs v_object %p", object));
if (!VM_OBJECT_TRYWLOCK(robject)) {
@@ -602,8 +600,7 @@ vm_object_deallocate(vm_object_t object)
* deallocating its shadow.
*/
if ((robject->flags &
- (OBJ_DEAD | OBJ_ANON)) == OBJ_ANON &&
- robject->handle == NULL) {
+ (OBJ_DEAD | OBJ_ANON)) == OBJ_ANON) {
refcount_acquire(&robject->ref_count);
retry:
@@ -1302,7 +1299,7 @@ vm_object_shadow(
* will be collapsed later.
*/
if (source != NULL && source->ref_count == 1 &&
- source->handle == NULL && (source->flags & OBJ_ANON) != 0)
+ (source->flags & OBJ_ANON) != 0)
return;
/*
@@ -1751,10 +1748,8 @@ vm_object_collapse(vm_object_t object)
if ((backing_object->flags & OBJ_ANON) == 0)
break;
VM_OBJECT_WLOCK(backing_object);
- if (backing_object->handle != NULL ||
- (backing_object->flags & OBJ_DEAD) != 0 ||
- object->handle != NULL ||
- (object->flags & OBJ_DEAD) != 0) {
+ if ((backing_object->flags & OBJ_DEAD) != 0 ||
+ (object->flags & (OBJ_DEAD | OBJ_ANON)) != OBJ_ANON) {
VM_OBJECT_WUNLOCK(backing_object);
break;
}
@@ -2549,8 +2544,7 @@ DB_SHOW_COMMAND(vmochk, vm_object_check)
* and none have zero ref counts.
*/
TAILQ_FOREACH(object, &vm_object_list, object_list) {
- if (object->handle == NULL &&
- (object->type == OBJT_DEFAULT || object->type == OBJT_SWAP)) {
+ if ((object->flags & OBJ_ANON) != 0) {
if (object->ref_count == 0) {
db_printf("vmochk: internal obj has zero ref count: %ld\n",
(long)object->size);
More information about the svn-src-all
mailing list