From nobody Thu Aug 7 18:46:53 2025 X-Original-To: dev-commits-src-all@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 4bybjp1ZFhz64bpf; Thu, 07 Aug 2025 18:46:54 +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 4bybjp0l2Pz3rJV; Thu, 07 Aug 2025 18:46:54 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1754592414; 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=vgYnihRm16X5P04xLvmfzLxeB1W7cg9N6Fy+SFiUzrs=; b=jRwKiFgRrQ7SioAkFTHlMoKRUQRpI7EmMez2YQ2izRhxI4oxv25Mxf7LVCr8DGDhF3FzCJ RfUClf+IXAnD6Fhs/CK3U1kXavORrxLaRaQCYYViJaCySNZgS7wjjUh5d2l1RbSAvOS4/s rbQXJW06e0M/v4ZQpGD0esO1zSr/indFdE2jNFXYkrcm6iR23c2Mt6/qTebDDMFzxzjqIn +sSjgw4fh/TvR/sGFamqtofTNXaLBxPVxOa36o6WcYq9CU9sOBIxGxW4jdejM8ba6tS6Ab J9N4Fgr8DKFBrHGk+Z2H7Mx4hVvKOFaSBE4ywctXUCfZFxVbLkPDLI3D/U9UEA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1754592414; 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=vgYnihRm16X5P04xLvmfzLxeB1W7cg9N6Fy+SFiUzrs=; b=rfcYMCm5Bf1vHMcDOHcWtRpgqojesyD5eeDm4cCndDRNhj5wK4Bws0ukVLI9VQpEozltdf qZIMVVV0tznR247TdmcLWY3z6qX9uVEWIpDjIUnnP52pQZUI4KBqM1GK4PErgvVxmjjE7E qmZr8d/KoY1nykSoJe7fL7Vjn7TsIZQpXB9OhlVt75rE+5q7o0qsJyKmNfOF1WefWnQ8Yk psace1vd+/i392Bot4i5t/9nECc9Zos5vb1LriPoXX9nlZ880+t0l84djQXWMonCvGv6jf jOmFS6vRM7J+Zv0IX2VhYmO9sIZ5rMYAUQZEWqA9iA2DeqRpCn3WfKsl1+HjYA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1754592414; a=rsa-sha256; cv=none; b=a/+lplIS8w7gH9xGauBZ+3qP2vk580KSNzN/3e+jx4643636O1+YMsCrmDQPibVzDYEofI hftMobcb7KH41dUgXUgNQRq76gOvV0nQKdSog5MWg4yIEUwFfQWdyYvmI06i4XcYpxPolF p8iusGfUMxbgM5g7Fcx0j5nbqBM4kf+ZXh+gYlb6jgJkaFrSKlrFE1m43dmNYKpFBOQkhf 4tcmUf/MVUnYPo4m4vkZC0TFaDf0d26/rjniF2J7x3de97//GYs9hyH/p7tiUXFvR5GBAP TqTD43plE6ZE337DTpug3KyQAn8APQqWVO7N2a5Tfwcv9llvLrsGLJkxra9HIA== 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 4bybjp0LDSz1Gvk; Thu, 07 Aug 2025 18:46:54 +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 577Ikrkf018709; Thu, 7 Aug 2025 18:46:53 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 577IkrAY018706; Thu, 7 Aug 2025 18:46:53 GMT (envelope-from git) Date: Thu, 7 Aug 2025 18:46:53 GMT Message-Id: <202508071846.577IkrAY018706@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: =?utf-8?Q?Jean-S=C3=A9bastien?= =?utf-8?Q?P=C3=A9dron?= Subject: git: c0fc0facf877 - main - linuxkpi: Call `lkpi_fpu_safe_exec()` in the implementation of kvmalloc() List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: dumbbell X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: c0fc0facf877d4e2ad5843d59c15d0d464432962 Auto-Submitted: auto-generated The branch main has been updated by dumbbell: URL: https://cgit.FreeBSD.org/src/commit/?id=c0fc0facf877d4e2ad5843d59c15d0d464432962 commit c0fc0facf877d4e2ad5843d59c15d0d464432962 Author: Jean-Sébastien Pédron AuthorDate: 2025-07-26 12:17:26 +0000 Commit: Jean-Sébastien Pédron CommitDate: 2025-08-07 18:46:15 +0000 linuxkpi: Call `lkpi_fpu_safe_exec()` in the implementation of kvmalloc() `kvmalloc()` was a simple wrapper around the FreeBSD native `malloc()`. Unlike the more involved implementation of `kmalloc()`, it didn't end and being the FPU context around the actual call to `malloc()`. This caused the following panic in the amdgup DRM driver: panic: malloc: called with spinlock or critical section held ... triggered by the call: struct dc_3dlut *lut = kvzalloc(sizeof(*lut), GFP_KERNEL); (for the record, GFP_KERNEL is defined as M_WAITOK) Replicating the same behaviour as `kmalloc()`, in other words, ending the FPU context before the call to the underlying `malloc()`, and beginning it again afterwards solves the problem. Reviewed by: olce Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D51557 --- sys/compat/linuxkpi/common/include/linux/slab.h | 3 ++- sys/compat/linuxkpi/common/src/linux_slab.c | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/sys/compat/linuxkpi/common/include/linux/slab.h b/sys/compat/linuxkpi/common/include/linux/slab.h index efa5c8cb67b3..47e3d133eb6c 100644 --- a/sys/compat/linuxkpi/common/include/linux/slab.h +++ b/sys/compat/linuxkpi/common/include/linux/slab.h @@ -99,6 +99,7 @@ void lkpi_kmem_cache_free(struct linux_kmem_cache *, void *); void linux_kmem_cache_destroy(struct linux_kmem_cache *); void *lkpi_kmalloc(size_t, gfp_t); +void *lkpi_kvmalloc(size_t, gfp_t); void *lkpi___kmalloc(size_t, gfp_t); void *lkpi___kmalloc_node(size_t, gfp_t, int); void *lkpi_krealloc(void *, size_t, gfp_t); @@ -225,7 +226,7 @@ vmalloc_32(size_t size) static inline void * kvmalloc(size_t size, gfp_t flags) { - return (malloc(size, M_KMALLOC, linux_check_m_flags(flags))); + return (lkpi_kvmalloc(size, flags)); } static inline void * diff --git a/sys/compat/linuxkpi/common/src/linux_slab.c b/sys/compat/linuxkpi/common/src/linux_slab.c index 3d75ca480661..6f71d17a3770 100644 --- a/sys/compat/linuxkpi/common/src/linux_slab.c +++ b/sys/compat/linuxkpi/common/src/linux_slab.c @@ -296,6 +296,23 @@ lkpi_kmalloc(size_t size, gfp_t flags) return(lmc.addr); } +static void +lkpi_kvmalloc_cb(void *ctx) +{ + struct lkpi_kmalloc_ctx *lmc = ctx; + + lmc->addr = malloc(lmc->size, M_KMALLOC, linux_check_m_flags(lmc->flags)); +} + +void * +lkpi_kvmalloc(size_t size, gfp_t flags) +{ + struct lkpi_kmalloc_ctx lmc = { .size = size, .flags = flags }; + + lkpi_fpu_safe_exec(&lkpi_kvmalloc_cb, &lmc); + return(lmc.addr); +} + static void linux_kfree_async_fn(void *context, int pending) {