From nobody Fri Apr 18 14:36:55 2025 X-Original-To: dev-commits-src-branches@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4ZfHQc43lvz5st3g; Fri, 18 Apr 2025 14:36:56 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R10" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4ZfHQb4tzzz3K2y; Fri, 18 Apr 2025 14:36:55 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1744987015; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=3lMvo41WwzGmB6YGth2hufX4nzuZQ+h9ktCHEldwuYs=; b=caDqJIn5fm/K9Sr7ye9terTE0sfpddqEal5u7LlNsf0MEWURCzcv5WXEI/7aUYrBZLViIw SyUrnh9eXiS3xeSwjxbEimAeNxQ6ajRcyR0vDZIpqWP03y4XOSQ+DkbSeH5eJzvDgf27TR wSPyWCi26u4MmiRMGq07WxI4cRGoq1SaY2XnvRrpFFNXYXhlELcIGkynip0dq5Z2M058cA A4+fq39Y1BYFOk9Z0Y08z4z/npAy24pSrgkgVKuoHDlyoPOv9aiYtkbb+o6uPaY9tvzJgS fDmS9okSWoJNHyUEGJ14Hr1lQDGyloJLgbiwvQXYpLv151I4Z55mDmFQLyLB6A== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1744987015; a=rsa-sha256; cv=none; b=MFYGLuBjyUZY1RyLRGGnpCiCDGNEt7YUkhn/yvMUIwtKznHD+HESF/6IzdGYp/ViqfevxN A4mciHUXFjFydLuhjEyFy34xOrc+DJ78qN7Nzc16LbbRAsc3iB/Y2BE0M09QwYDquWqZQE pGeje9uhNu7xllPv1J/TurONd6+UN/2EHGgGxTRhfHQev5k+OeVFyWx/60JDei26o/rIkG U1OQrUwz+j7JIUYc5T8ZpAFXCem5Aff8jpFoZ+FYQxDyr7gtP6QfgWfFWI2pgZjDcLFmoE FkCAiFmGx4ish8uUcZTsDduZAJXb+1aO2x+okVttX714MgOHUtYqrsGfVxYEWw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1744987015; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=3lMvo41WwzGmB6YGth2hufX4nzuZQ+h9ktCHEldwuYs=; b=Pdf/9f8kMzK5cIOT7yLiQzFw/EAXqSB7FMD3N5c9jVRC7sWM8HvLJLjVB3dzIW99yJZFGp 3fSqdylro6i7TyN4nogI12S3t5B3sciLZ8LsrfFR1QWzTIZNKlOGHVv0CxSzjv9d/ZLIfo 3zqkyMn+Miavrh/LnXlaV1SZ7laecsQ20JY0m0O5Xcf8+iCIhMrch+596oRzFdC5pPldyf 0UW0ZfhqFgzLyTO9O7TapyLndHay79e3tSfHyuXt+zXrig2JbhTLFF9N4pB5Qj11VPkvSP pxHz/ZwdBIUAFIUrXDXzvkw+n6Zl8EiBz6c7XELZIifRPT5by+OYEy9Wyr+5wg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4ZfHQb4TfZzfDw; Fri, 18 Apr 2025 14:36:55 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 53IEatmd091227; Fri, 18 Apr 2025 14:36:55 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 53IEatur091224; Fri, 18 Apr 2025 14:36:55 GMT (envelope-from git) Date: Fri, 18 Apr 2025 14:36:55 GMT Message-Id: <202504181436.53IEatur091224@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: "Bjoern A. Zeeb" Subject: git: 516eb937b274 - stable/14 - LinuxKPI: implement krealloc() for memory being contiguous List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-branches@freebsd.org Sender: owner-dev-commits-src-branches@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: bz X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: 516eb937b274c34793f9b640e547eee0dc185b2d Auto-Submitted: auto-generated The branch stable/14 has been updated by bz: URL: https://cgit.FreeBSD.org/src/commit/?id=516eb937b274c34793f9b640e547eee0dc185b2d commit 516eb937b274c34793f9b640e547eee0dc185b2d Author: Bjoern A. Zeeb AuthorDate: 2025-03-29 17:05:58 +0000 Commit: Bjoern A. Zeeb CommitDate: 2025-04-18 14:35:58 +0000 LinuxKPI: implement krealloc() for memory being contiguous Implement krealloc_array() using krealloc(). Implement krealloc() doing the various size checks ourselves and use realloc() or kmalloc() depending on old and new allocation sizes. This way we can ensure that allocated memory stays physically contiguous. Sponsored by: The FreeBSD Foundation Suggested by: jhb (see D46657) Reviewed by: jhb, markj Differential Revision: https://reviews.freebsd.org/D49571 (cherry picked from commit 1c95d401ebe5075ebb38b57638830713a496f107) --- sys/compat/linuxkpi/common/include/linux/slab.h | 31 +++++++++++----------- sys/compat/linuxkpi/common/src/linux_slab.c | 35 +++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 15 deletions(-) diff --git a/sys/compat/linuxkpi/common/include/linux/slab.h b/sys/compat/linuxkpi/common/include/linux/slab.h index ddaabcef0b9c..a692ccb8b944 100644 --- a/sys/compat/linuxkpi/common/include/linux/slab.h +++ b/sys/compat/linuxkpi/common/include/linux/slab.h @@ -94,6 +94,7 @@ extern void *lkpi_kmalloc(size_t size, gfp_t flags); void *lkpi___kmalloc(size_t size, gfp_t flags); void *lkpi___kmalloc_node(size_t size, gfp_t flags, int node); #define __kmalloc(_s, _f) lkpi___kmalloc(_s, _f) +void *lkpi_krealloc(void *, size_t, gfp_t); static inline gfp_t linux_check_m_flags(gfp_t flags) @@ -148,6 +149,21 @@ kcalloc_node(size_t n, size_t size, gfp_t flags, int node) return (kmalloc_array_node(n, size, flags, node)); } +static inline void * +krealloc(void *ptr, size_t size, gfp_t flags) +{ + return (lkpi_krealloc(ptr, size, flags)); +} + +static inline void * +krealloc_array(void *ptr, size_t n, size_t size, gfp_t flags) +{ + if (WOULD_OVERFLOW(n, size)) + return NULL; + + return (krealloc(ptr, n * size, flags)); +} + static inline void * __vmalloc(size_t size, gfp_t flags, int other) { @@ -183,21 +199,6 @@ kvmalloc_array(size_t n, size_t size, gfp_t flags) return (kvmalloc(size * n, flags)); } -static inline void * -krealloc(void *ptr, size_t size, gfp_t flags) -{ - return (realloc(ptr, size, M_KMALLOC, linux_check_m_flags(flags))); -} - -static inline void * -krealloc_array(void *ptr, size_t n, size_t size, gfp_t flags) -{ - if (WOULD_OVERFLOW(n, size)) - return NULL; - - return (realloc(ptr, n * size, M_KMALLOC, linux_check_m_flags(flags))); -} - extern void linux_kfree_async(void *); static inline void diff --git a/sys/compat/linuxkpi/common/src/linux_slab.c b/sys/compat/linuxkpi/common/src/linux_slab.c index 4b0b18178a5c..abcffdb094f5 100644 --- a/sys/compat/linuxkpi/common/src/linux_slab.c +++ b/sys/compat/linuxkpi/common/src/linux_slab.c @@ -234,6 +234,41 @@ lkpi___kmalloc(size_t size, gfp_t flags) 0, -1UL, PAGE_SIZE, 0)); } +void * +lkpi_krealloc(void *ptr, size_t size, gfp_t flags) +{ + void *nptr; + size_t osize; + + /* + * First handle invariants based on function arguments. + */ + if (ptr == NULL) + return (kmalloc(size, flags)); + + osize = ksize(ptr); + if (size <= osize) + return (ptr); + + /* + * We know the new size > original size. realloc(9) does not (and cannot) + * know about our requirements for physically contiguous memory, so we can + * only call it for sizes up to and including PAGE_SIZE, and otherwise have + * to replicate its functionality using kmalloc to get the contigmalloc(9) + * backing. + */ + if (size <= PAGE_SIZE) + return (realloc(ptr, size, M_KMALLOC, linux_check_m_flags(flags))); + + nptr = kmalloc(size, flags); + if (nptr == NULL) + return (NULL); + + memcpy(nptr, ptr, osize); + kfree(ptr); + return (nptr); +} + struct lkpi_kmalloc_ctx { size_t size; gfp_t flags;