Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 11 Aug 2024 00:30:05 +0000
From:      Shawn Webb <shawn.webb@hardenedbsd.org>
To:        "Bjoern A. Zeeb" <bz@freebsd.org>
Cc:        src-committers@freebsd.org, dev-commits-src-all@freebsd.org,  dev-commits-src-main@freebsd.org
Subject:   Re: git: 4fab5f005482 - main - kern_malloc: fold free and zfree together into one __always_inline func
Message-ID:  <hkwxrjcco25g4zqr2exl54rklcirsfber3cwq5maf7nayx5uwm@m3x4a5pb5jix>
In-Reply-To: <202407261048.46QAmNLD085636@gitrepo.freebsd.org>
References:  <202407261048.46QAmNLD085636@gitrepo.freebsd.org>

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

--mhrpzhpejy63fjop
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

Hey Bjoern,

For some reason this commit breaks booting on two of my Dell laptops.
I'm unsure why. Reverting this particular commit makes them happy
again.

Thanks,

--=20
Shawn Webb
Cofounder / Security Engineer
HardenedBSD

Tor-ified Signal: +1 303-901-1600 / shawn_webb_opsec.50
https://git.hardenedbsd.org/hardenedbsd/pubkeys/-/raw/master/Shawn_Webb/03A=
4CBEBB82EA5A67D9F3853FF2E67A277F8E1FA.pub.asc

On Fri, Jul 26, 2024 at 10:48:23AM +0000, Bjoern A. Zeeb wrote:
> The branch main has been updated by bz:
>=20
> URL: https://cgit.FreeBSD.org/src/commit/?id=3D4fab5f005482aa88bc0f7d7a0a=
5e81b436869112
>=20
> commit 4fab5f005482aa88bc0f7d7a0a5e81b436869112
> Author:     Bjoern A. Zeeb <bz@FreeBSD.org>
> AuthorDate: 2024-07-24 15:56:32 +0000
> Commit:     Bjoern A. Zeeb <bz@FreeBSD.org>
> CommitDate: 2024-07-26 10:46:37 +0000
>=20
>     kern_malloc: fold free and zfree together into one __always_inline fu=
nc
>    =20
>     free() and zfree() are essentially the same copy and pasted code with
>     the extra explicit_bzero() (and formerly kasan) calls.  Add a bool to=
 add
>     the extra functionality and make both functions a wrapper around the =
common
>     code and let the compiler do the optimization based on the bool input
>     when inlining.
>    =20
>     No functional changes intended.
>    =20
>     Suggested by:   kib (in D45812)
>     Sponsored by:   The FreeBSD Foundation
>     MFC after:      10 days
>     Reviewed by:    kib, markj
>     Differential Revision: https://reviews.freebsd.org/D46101
> ---
>  sys/kern/kern_malloc.c | 90 +++++++++++++++-----------------------------=
------
>  1 file changed, 27 insertions(+), 63 deletions(-)
>=20
> diff --git a/sys/kern/kern_malloc.c b/sys/kern/kern_malloc.c
> index 37684e26b451..ebdd00808f22 100644
> --- a/sys/kern/kern_malloc.c
> +++ b/sys/kern/kern_malloc.c
> @@ -914,15 +914,8 @@ free_dbg(void **addrp, struct malloc_type *mtp)
>  }
>  #endif
> =20
> -/*
> - *	free:
> - *
> - *	Free a block of memory allocated by malloc.
> - *
> - *	This routine may not block.
> - */
> -void
> -free(void *addr, struct malloc_type *mtp)
> +static __always_inline void
> +_free(void *addr, struct malloc_type *mtp, bool dozero)
>  {
>  	uma_zone_t zone;
>  	uma_slab_t slab;
> @@ -938,8 +931,8 @@ free(void *addr, struct malloc_type *mtp)
> =20
>  	vtozoneslab((vm_offset_t)addr & (~UMA_SLAB_MASK), &zone, &slab);
>  	if (slab =3D=3D NULL)
> -		panic("free: address %p(%p) has not been allocated",
> -		    addr, (void *)((u_long)addr & (~UMA_SLAB_MASK)));
> +		panic("%s(%d): address %p(%p) has not been allocated", __func__,
> +		    dozero, addr, (void *)((uintptr_t)addr & (~UMA_SLAB_MASK)));
> =20
>  	switch (GET_SLAB_COOKIE(slab)) {
>  	case __predict_true(SLAB_COOKIE_SLAB_PTR):
> @@ -947,79 +940,50 @@ free(void *addr, struct malloc_type *mtp)
>  #if defined(INVARIANTS) && !defined(KASAN)
>  		free_save_type(addr, mtp, size);
>  #endif
> +		if (dozero)
> +			explicit_bzero(addr, size);
>  		uma_zfree_arg(zone, addr, slab);
>  		break;
>  	case SLAB_COOKIE_MALLOC_LARGE:
>  		size =3D malloc_large_size(slab);
> +		if (dozero)
> +			explicit_bzero(addr, size);
>  		free_large(addr, size);
>  		break;
>  	case SLAB_COOKIE_CONTIG_MALLOC:
> -		size =3D contigmalloc_size(slab);
> +		size =3D round_page(contigmalloc_size(slab));
> +		if (dozero)
> +			explicit_bzero(addr, size);
>  		kmem_free(addr, size);
> -		size =3D round_page(size);
>  		break;
>  	default:
> -		panic("%s: addr %p slab %p with unknown cookie %d", __func__,
> -		    addr, slab, GET_SLAB_COOKIE(slab));
> +		panic("%s(%d): addr %p slab %p with unknown cookie %d",
> +		    __func__, dozero, addr, slab, GET_SLAB_COOKIE(slab));
>  		/* NOTREACHED */
>  	}
>  	malloc_type_freed(mtp, size);
>  }
> =20
>  /*
> - *	zfree:
> - *
> - *	Zero then free a block of memory allocated by malloc.
> - *
> + * free:
> + *	Free a block of memory allocated by malloc/contigmalloc.
>   *	This routine may not block.
>   */
>  void
> -zfree(void *addr, struct malloc_type *mtp)
> +free(void *addr, struct malloc_type *mtp)
>  {
> -	uma_zone_t zone;
> -	uma_slab_t slab;
> -	u_long size;
> -
> -#ifdef MALLOC_DEBUG
> -	if (free_dbg(&addr, mtp) !=3D 0)
> -		return;
> -#endif
> -	/* free(NULL, ...) does nothing */
> -	if (addr =3D=3D NULL)
> -		return;
> -
> -	vtozoneslab((vm_offset_t)addr & (~UMA_SLAB_MASK), &zone, &slab);
> -	if (slab =3D=3D NULL)
> -		panic("free: address %p(%p) has not been allocated",
> -		    addr, (void *)((u_long)addr & (~UMA_SLAB_MASK)));
> +	_free(addr, mtp, false);
> +}
> =20
> -	switch (GET_SLAB_COOKIE(slab)) {
> -	case __predict_true(SLAB_COOKIE_SLAB_PTR):
> -		size =3D zone->uz_size;
> -#if defined(INVARIANTS) && !defined(KASAN)
> -		free_save_type(addr, mtp, size);
> -#endif
> -		kasan_mark(addr, size, size, 0);
> -		explicit_bzero(addr, size);
> -		uma_zfree_arg(zone, addr, slab);
> -		break;
> -	case SLAB_COOKIE_MALLOC_LARGE:
> -		size =3D malloc_large_size(slab);
> -		kasan_mark(addr, size, size, 0);
> -		explicit_bzero(addr, size);
> -		free_large(addr, size);
> -		break;
> -	case SLAB_COOKIE_CONTIG_MALLOC:
> -		size =3D round_page(contigmalloc_size(slab));
> -		explicit_bzero(addr, size);
> -		kmem_free(addr, size);
> -		break;
> -	default:
> -		panic("%s: addr %p slab %p with unknown cookie %d", __func__,
> -		    addr, slab, GET_SLAB_COOKIE(slab));
> -		/* NOTREACHED */
> -	}
> -	malloc_type_freed(mtp, size);
> +/*
> + * zfree:
> + *	Zero then free a block of memory allocated by malloc/contigmalloc.
> + *	This routine may not block.
> + */
> +void
> +zfree(void *addr, struct malloc_type *mtp)
> +{
> +	_free(addr, mtp, true);
>  }
> =20
>  /*
>=20

--mhrpzhpejy63fjop
Content-Type: application/pgp-signature; name="signature.asc"

-----BEGIN PGP SIGNATURE-----

iQIzBAABCAAdFiEEA6TL67gupaZ9nzhT/y5nonf44foFAma4BgQACgkQ/y5nonf4
4fopbxAAm/6MB6r3tvgPZPpbWK5Mh77BiDvgza/sdICZUElY+4vwwp2iFV1y2Twn
Crp7nAM5Y3Ky0TMd+Uu+Lr2yx3lZPoRL/dogz0N5sWGeRukh/co5qrh8xvwsqJsg
q2cA6vUoZt5zvibyuipCr5LDJSgN0ROJj3Ka+ZpuYSmg289ezEQ2hvsmYqqPm79F
rNiNeQPDDX8cHR6IulXCWku56jjYN5E3CpVOxaa2oXP/hCe7dZ3jz5bnT0aLzqOp
/EgqWNYnsYwJ/q6vyfVcE3+Su7hkBa0gidx0JE18hNeqUPwxPZBuTq+ayj66h3sk
Kuybn7zf/9ulhE3dsM2dXUk38ki4cYyTqrnlUmf+TlUnC+cT2Bkz303DF8OO9idW
9PLvatfCcIZBMCTVWbFMqg5WZyr51xRciBp/EleAJ0RiEFQSgj+4MCly+uy3HGIe
vtlwNHQ/0FxzhXpyVmuADQGYTBHPCEDrQNugrgX2BOGBRVIEw0o120tmTf6MqplU
Bfgk1zSYIJ9bUnI4nrfnhWphNnX8QbyOIQiBeoNPZJXVc9GUt+AstZZIyDHg3iiT
9ejjqjvnRSTwdBcY6MsuTpYLozZe/PYu2Ed83KamcvaYDb1Jw8IwsuIMRn2CuVKv
hpfc8JFvSF+a9OM9PlP63hRXAs4DSdqQhsRy74+fwmJrNj6Oi7U=
=4y6D
-----END PGP SIGNATURE-----

--mhrpzhpejy63fjop--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?hkwxrjcco25g4zqr2exl54rklcirsfber3cwq5maf7nayx5uwm>