git: 11d62b6f31ab - main - linuxkpi: add kernel_fpu_begin/kernel_fpu_end

Emmanuel Vadot manu at FreeBSD.org
Tue Jan 12 11:43:03 UTC 2021


The branch main has been updated by manu:

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

commit 11d62b6f31ab4e99df6d0c6c23406b57eaa37f41
Author:     Emmanuel Vadot <manu at FreeBSD.org>
AuthorDate: 2021-01-12 11:02:38 +0000
Commit:     Emmanuel Vadot <manu at FreeBSD.org>
CommitDate: 2021-01-12 11:31:00 +0000

    linuxkpi: add kernel_fpu_begin/kernel_fpu_end
    
    With newer AMD GPUs (>=Navi,Renoir) there is FPU context usage in the
    amdgpu driver.
    The `kernel_fpu_begin/end` implementations in drm did not even allow nested
    begin-end blocks.
    
    Submitted by: Greg V
    Reviewed By: manu, hselasky
    Differential Revision: https://reviews.freebsd.org/D28061
---
 sys/compat/linuxkpi/common/include/asm/fpu/api.h | 68 ++++++++++++++++++++++++
 sys/compat/linuxkpi/common/src/linux_fpu.c       | 50 +++++++++++++++++
 sys/conf/files.amd64                             |  3 ++
 sys/conf/files.arm64                             |  3 ++
 sys/conf/files.i386                              |  3 ++
 sys/modules/linuxkpi/Makefile                    |  2 +-
 6 files changed, 128 insertions(+), 1 deletion(-)

diff --git a/sys/compat/linuxkpi/common/include/asm/fpu/api.h b/sys/compat/linuxkpi/common/include/asm/fpu/api.h
new file mode 100644
index 000000000000..035ec3620fdd
--- /dev/null
+++ b/sys/compat/linuxkpi/common/include/asm/fpu/api.h
@@ -0,0 +1,68 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ * 
+ * Copyright (c) 2020 Greg V <greg at unrelenting.technology>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef	_FPU_API_H_
+#define	_FPU_API_H_
+
+#if defined(__aarch64__) || defined(__amd64__) || defined(__i386__)
+
+#include <machine/fpu.h>
+
+extern struct fpu_kern_ctx *__lkpi_fpu_ctx;
+extern unsigned int __lkpi_fpu_ctx_level;
+
+static inline void
+kernel_fpu_begin()
+{
+	if (__lkpi_fpu_ctx_level++ == 0) {
+		fpu_kern_enter(curthread, __lkpi_fpu_ctx, FPU_KERN_NORMAL);
+	}
+}
+
+static inline void
+kernel_fpu_end()
+{
+	if (--__lkpi_fpu_ctx_level == 0) {
+		fpu_kern_leave(curthread, __lkpi_fpu_ctx);
+	}
+}
+
+#else
+
+static inline void
+kernel_fpu_begin()
+{
+}
+
+static inline void
+kernel_fpu_end()
+{
+}
+
+#endif
+
+#endif /* _FPU_API_H_ */
diff --git a/sys/compat/linuxkpi/common/src/linux_fpu.c b/sys/compat/linuxkpi/common/src/linux_fpu.c
new file mode 100644
index 000000000000..976e55e68ca1
--- /dev/null
+++ b/sys/compat/linuxkpi/common/src/linux_fpu.c
@@ -0,0 +1,50 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ * 
+ * Copyright (c) 2020 Greg V <greg at unrelenting.technology>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/proc.h>
+#include <sys/kernel.h>
+
+#include <machine/fpu.h>
+
+struct fpu_kern_ctx *__lkpi_fpu_ctx;
+unsigned int __lkpi_fpu_ctx_level = 0;
+
+static void
+linux_fpu_init(void *arg __unused)
+{
+	__lkpi_fpu_ctx = fpu_kern_alloc_ctx(0);
+}
+SYSINIT(linux_fpu, SI_SUB_EVENTHANDLER, SI_ORDER_SECOND, linux_fpu_init, NULL);
+
+static void
+linux_fpu_uninit(void *arg __unused)
+{
+	fpu_kern_free_ctx(__lkpi_fpu_ctx);
+}
+SYSUNINIT(linux_fpu, SI_SUB_EVENTHANDLER, SI_ORDER_SECOND, linux_fpu_uninit, NULL);
diff --git a/sys/conf/files.amd64 b/sys/conf/files.amd64
index 00b8b8c57ee1..a049d9469834 100644
--- a/sys/conf/files.amd64
+++ b/sys/conf/files.amd64
@@ -462,6 +462,9 @@ x86/xen/pv.c			optional	xenhvm
 x86/xen/pvcpu_enum.c		optional	xenhvm
 x86/xen/xen_pci_bus.c		optional	xenhvm
 
+compat/linuxkpi/common/src/linux_fpu.c		optional compat_linuxkpi \
+	compile-with "${LINUXKPI_C}"
+
 contrib/openzfs/module/zcommon/zfs_fletcher_avx512.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zcommon/zfs_fletcher_intel.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zcommon/zfs_fletcher_sse.c		optional zfs compile-with "${ZFS_C}"
diff --git a/sys/conf/files.arm64 b/sys/conf/files.arm64
index 3cd34c170778..030c02233910 100644
--- a/sys/conf/files.arm64
+++ b/sys/conf/files.arm64
@@ -494,3 +494,6 @@ tegra210_xusb.fw	optional	tegra210_xusb_fw		\
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"tegra210_xusb.fw"
+
+compat/linuxkpi/common/src/linux_fpu.c		optional compat_linuxkpi \
+	compile-with "${LINUXKPI_C}"
diff --git a/sys/conf/files.i386 b/sys/conf/files.i386
index 96d2413b532d..b5192e47a738 100644
--- a/sys/conf/files.i386
+++ b/sys/conf/files.i386
@@ -241,3 +241,6 @@ x86/x86/local_apic.c		optional apic
 x86/x86/mptable.c		optional apic
 x86/x86/mptable_pci.c		optional apic pci
 x86/x86/msi.c			optional apic pci
+
+compat/linuxkpi/common/src/linux_fpu.c		optional compat_linuxkpi \
+	compile-with "${LINUXKPI_C}"
diff --git a/sys/modules/linuxkpi/Makefile b/sys/modules/linuxkpi/Makefile
index c043a4e40dc6..f9ae0e60e339 100644
--- a/sys/modules/linuxkpi/Makefile
+++ b/sys/modules/linuxkpi/Makefile
@@ -26,7 +26,7 @@ SRCS=	linux_compat.c \
 
 .if ${MACHINE_CPUARCH} == "aarch64" || ${MACHINE_CPUARCH} == "amd64" || \
     ${MACHINE_CPUARCH} == "i386"
-SRCS+=	opt_acpi.h acpi_if.h linux_acpi.c
+SRCS+=	opt_acpi.h acpi_if.h linux_acpi.c linux_fpu.c
 .endif
 
 SRCS+=	${LINUXKPI_GENSRCS}


More information about the dev-commits-src-all mailing list