From nobody Sat Apr 12 20:49:41 2025 X-Original-To: dev-commits-src-main@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 4ZZlzV4MkSz5sfZK; Sat, 12 Apr 2025 20:49:42 +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 4ZZlzV1KW9z44wM; Sat, 12 Apr 2025 20:49:42 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1744490982; 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=Z5yQiNFvlPhNWuneZ48CT1hdYVPsig1SaOvzYA0ZFnk=; b=a+ylqQD3F0SVmLQL9nYeqSftqNWID/f8087gZGYN/xeKwd9TtKWwhTgl6A5KcynLlMhBP8 o07pkJu/C2b9gHICeLV0VvNO5SYnF5Hk3EeIdtbT+Wc5hRRMTCw5Riu5jG30z3VfbO1/ab 8lE0D4LNOoJUi74i/WUmMy6jgGTFEkJnZf3U7tq5RO3259eJDb6D1IdDWONmiVRhuxDBdl GXHDyTlKwtxdpZy3OIO7gCkXLV5Si3c6k8SCJpD9rejNC+HlpuzqUDvLz8bRBUNkGDQ1Zv 18JC+okpNsWsb79RV+duzC/REIzBKeB6hXWBWd2Fn8tWGZEuhN4KczQACjZF2A== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1744490982; a=rsa-sha256; cv=none; b=DR1Zy0ei1PxbvLBYksQx4nj5oTG0/JKAb7/HYyb/ZUnGLXRHGXpdFAnDKf6EDgsyyzacGc 3S7d3bXSjrA4Zb1F4KLyxoV0krG0GNYyYlhX3hBqnbHy03GNUoguz1y1mtE2qWflALvAeW y4h8pQxF7wjJjdnGdp+SH4suj6lZw2Py05z+bcyor3+pqJAeqYduRSgjjVEOwpJo4hg+Wv LAhrTYxduEBr6QNeyw87f1WWQ7q6xL4xz1WWW826JjJhJw1Mk4hVn8W/aelQxjvZS3ty98 jmab3yVTRvvnhJoDfb5fT9CbdrVxdm5lreDF5DBWqhgf6I40V4Y4C/OQFMOXWQ== 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=1744490982; 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=Z5yQiNFvlPhNWuneZ48CT1hdYVPsig1SaOvzYA0ZFnk=; b=etsYQ1DdsogPc6tx5b1zvygg8tnF75S4T/JZ1DL6uuBeHhrnVrHnwqmpugudK3TtFTWU0e OELz/CcTNl3mQn7IU2afAl3uh/HZ/0p5KW0VzX4+na0EjcbVawYDdz661DwFwzE8BHcQR/ 2VPsE76zKFcQS1O11hyVRJtqnltVNDdGDL1P6SgaV02DmJbmf7cbog0vlCAAA/cpWjzBBU NdXtfNjhCpZ8XLZgWqI8dUX/VDP/Hao9boxTq5JABhhHsqNg2ysaTdbieTVzO+sjXFX0cF knig547mJjT/zZ5m7GkTxCkxXfMCkowLKgnGFu6Ji4IPpIT78zZ6fvyBaYcLeg== 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 4ZZlzT5kPwzYtJ; Sat, 12 Apr 2025 20:49:41 +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 53CKnfRN094690; Sat, 12 Apr 2025 20:49:41 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 53CKnfeZ094687; Sat, 12 Apr 2025 20:49:41 GMT (envelope-from git) Date: Sat, 12 Apr 2025 20:49:41 GMT Message-Id: <202504122049.53CKnfeZ094687@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: "Bjoern A. Zeeb" Subject: git: 1c95d401ebe5 - main - LinuxKPI: implement krealloc() for memory being contiguous List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@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/main X-Git-Reftype: branch X-Git-Commit: 1c95d401ebe5075ebb38b57638830713a496f107 Auto-Submitted: auto-generated The branch main has been updated by bz: URL: https://cgit.FreeBSD.org/src/commit/?id=1c95d401ebe5075ebb38b57638830713a496f107 commit 1c95d401ebe5075ebb38b57638830713a496f107 Author: Bjoern A. Zeeb AuthorDate: 2025-03-29 17:05:58 +0000 Commit: Bjoern A. Zeeb CommitDate: 2025-04-12 20:49:20 +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 MFC after: 3 days Suggested by: jhb (see D46657) Reviewed by: jhb, markj Differential Revision: https://reviews.freebsd.org/D49571 --- 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;