git: d0f9b0bd19bf - main - malloc(9): assert wait flags.

From: Dag-Erling Smørgrav <des_at_FreeBSD.org>
Date: Thu, 31 Oct 2024 00:41:39 UTC
The branch main has been updated by des:

URL: https://cgit.FreeBSD.org/src/commit/?id=d0f9b0bd19bf5dc4031164fd26c5bbc4bab1cc74

commit d0f9b0bd19bf5dc4031164fd26c5bbc4bab1cc74
Author:     Dag-Erling Smørgrav <des@FreeBSD.org>
AuthorDate: 2024-10-31 00:19:48 +0000
Commit:     Dag-Erling Smørgrav <des@FreeBSD.org>
CommitDate: 2024-10-31 00:19:48 +0000

    malloc(9): assert wait flags.
    
    The check introduced in d3c11994e1e3 was bogus, combining a non-atomic
    “once” flag with an equally non-thread-safe ppsratecheck.  Rather than
    fix it, just assert what it attempts to enforce: that the malloc flags
    must include exactly one of M_WAITOK and M_NOWAIT.
    
    Fixes:          d3c11994e1e3de7445305abd0d41dce2b8d3e6dc
    Sponsored by:   Klara, Inc.
    Reviewed by:    olce, kevans
    Differential Revision:  https://reviews.freebsd.org/D47309
---
 sys/kern/kern_malloc.c | 22 ++++------------------
 1 file changed, 4 insertions(+), 18 deletions(-)

diff --git a/sys/kern/kern_malloc.c b/sys/kern/kern_malloc.c
index 9d7e0464e0f7..b1347b15e651 100644
--- a/sys/kern/kern_malloc.c
+++ b/sys/kern/kern_malloc.c
@@ -524,27 +524,13 @@ static int
 malloc_dbg(caddr_t *vap, size_t *sizep, struct malloc_type *mtp,
     int flags)
 {
-#ifdef INVARIANTS
-	int indx;
-
 	KASSERT(mtp->ks_version == M_VERSION, ("malloc: bad malloc type version"));
-	/*
-	 * Check that exactly one of M_WAITOK or M_NOWAIT is specified.
-	 */
-	indx = flags & (M_WAITOK | M_NOWAIT);
-	if (indx != M_NOWAIT && indx != M_WAITOK) {
-		static	struct timeval lasterr;
-		static	int curerr, once;
-		if (once == 0 && ppsratecheck(&lasterr, &curerr, 1)) {
-			printf("Bad malloc flags: %x\n", indx);
-			kdb_backtrace();
-			flags |= M_WAITOK;
-			once++;
-		}
-	}
+	KASSERT((flags & (M_WAITOK | M_NOWAIT)) != 0,
+	    ("malloc: flags must include either M_WAITOK or M_NOWAIT"));
+	KASSERT((flags & (M_WAITOK | M_NOWAIT)) != (M_WAITOK | M_NOWAIT),
+	    ("malloc: flags may not include both M_WAITOK and M_NOWAIT"));
 	KASSERT((flags & M_NEVERFREED) == 0,
 	    ("malloc: M_NEVERFREED is for internal use only"));
-#endif
 #ifdef MALLOC_MAKE_FAILURES
 	if ((flags & M_NOWAIT) && (malloc_failure_rate != 0)) {
 		atomic_add_int(&malloc_nowait_count, 1);