Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 6 Jul 2021 01:21:17 +0300
From:      Vitaliy Gusev <gusev.vitaliy@gmail.com>
To:        Konstantin Belousov <kostikbel@gmail.com>
Cc:        freebsd-hackers@freebsd.org, gljennjohn@gmail.com, Mark Johnston <markj@freebsd.org>, Peter Grehan <grehan@freebsd.org>
Subject:   Re: madvise(MADV_FREE) doesn't work in some cases?
Message-ID:  <A3E8A5E9-5912-4358-B384-1FC5847DCBE6@gmail.com>
In-Reply-To: <2A7A1E60-766D-427B-8288-E92B4090022E@gmail.com>
References:  <D5749BDF-36B5-4AE9-A75F-2A702DF71F8C@gmail.com> <20210703065420.6dbafb5f@ernst.home> <D542E8C1-4E97-48E8-8748-BBA19B2216EC@gmail.com> <2390FA9B-319E-45D4-BEA7-10878E43AD4B@gmail.com> <YONVgjgqREDAucok@kib.kiev.ua> <2A7A1E60-766D-427B-8288-E92B4090022E@gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help

--Apple-Mail=_840FE2D4-B08C-45F8-8446-FEF886AF0FC5
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
	charset=utf-8

Comments are below,

> commit 0392eb3c93b7dacc31dbdf8ec2fc40fa5ba67c62
> Author: Konstantin Belousov <kib@FreeBSD.org <mailto:kib@FreeBSD.org>>
> Date:   Mon Jul 5 21:53:22 2021 +0300
>=20
>    madvise(MADV_FREE): try harder to handle shadow chain
>=20
>    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.
>=20
> 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 =3D vm_map_entry_succ(entry);
> 		for (; entry->start < end;
> 		    entry =3D vm_map_entry_succ(entry)) {
> +			vm_object_t obj;
> 			vm_offset_t useEnd, useStart;
>=20
> 			if ((entry->eflags & MAP_ENTRY_IS_SUB_MAP) !=3D =
0)
> @@ -3046,9 +3047,16 @@ vm_map_madvise(
> 			 * backing object can change.
> 			 */
> 			if (behav =3D=3D MADV_FREE &&
> -			    entry->object.vm_object !=3D NULL &&
> -			    entry->object.vm_object->backing_object !=3D =
NULL)
> -				continue;
> +			    (obj =3D entry->object.vm_object) !=3D NULL =
&&
> +			    obj->backing_object !=3D NULL) {
> +				VM_OBJECT_WLOCK(obj);
> +				if ((obj->flags & OBJ_DEAD) !=3D 0)
> +					continue;

Here is object is left locked, however I didn=E2=80=99t met this =
condition.

> +				vm_object_collapse(obj);
> +				VM_OBJECT_WUNLOCK(obj);
> +				if (obj->backing_object !=3D 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?

=E2=80=94=E2=80=94
Vitaliy Gusev=

--Apple-Mail=_840FE2D4-B08C-45F8-8446-FEF886AF0FC5--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?A3E8A5E9-5912-4358-B384-1FC5847DCBE6>