Re: madvise(MADV_FREE) doesn't work in some cases?

From: Vitaliy Gusev <gusev.vitaliy_at_gmail.com>
Date: Mon, 05 Jul 2021 22:21:17 UTC
Comments are below,

> commit 0392eb3c93b7dacc31dbdf8ec2fc40fa5ba67c62
> Author: Konstantin Belousov <kib@FreeBSD.org <mailto:kib@FreeBSD.org>>
> Date:   Mon Jul 5 21:53:22 2021 +0300
> 
>    madvise(MADV_FREE): try harder to handle shadow chain
> 
>    In particular, collapse top object and see if there is no backing object
>    after, which means that we would not revert to older content if drop the
>    top object.
> 
> diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c
> index 1ac4ccf72f11..80abac223f29 100644
> --- a/sys/vm/vm_map.c
> +++ b/sys/vm/vm_map.c
> @@ -3033,6 +3033,7 @@ vm_map_madvise(
> 			entry = vm_map_entry_succ(entry);
> 		for (; entry->start < end;
> 		    entry = vm_map_entry_succ(entry)) {
> +			vm_object_t obj;
> 			vm_offset_t useEnd, useStart;
> 
> 			if ((entry->eflags & MAP_ENTRY_IS_SUB_MAP) != 0)
> @@ -3046,9 +3047,16 @@ vm_map_madvise(
> 			 * backing object can change.
> 			 */
> 			if (behav == MADV_FREE &&
> -			    entry->object.vm_object != NULL &&
> -			    entry->object.vm_object->backing_object != NULL)
> -				continue;
> +			    (obj = entry->object.vm_object) != NULL &&
> +			    obj->backing_object != NULL) {
> +				VM_OBJECT_WLOCK(obj);
> +				if ((obj->flags & OBJ_DEAD) != 0)
> +					continue;

Here is object is left locked, however I didn’t met this condition.

> +				vm_object_collapse(obj);
> +				VM_OBJECT_WUNLOCK(obj);
> +				if (obj->backing_object != NULL)
> +					continue;

After testing it looks that backing_object is not null here, memory is not freed and mmapfork test program is still killed. Any ideas?

——
Vitaliy Gusev