From 54f10674f358d2eb53b4f3f2f4e0a1134979b13d Mon Sep 17 00:00:00 2001
From: Brian Behlendorf <behlendorf1@llnl.gov>
Date: Mon, 2 Nov 2020 21:39:50 +0000
Subject: [PATCH] Linux 5.10 compat: frame.h renamed objtool.h

In Linux 5.10 the linux/frame.h header was renamed linux/objtool.h.
Add a configure check to detect and use the correctly named header.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #11085
---
 config/kernel-objtool.m4 | 25 +++++++++++++++++++++++++
 config/kernel.m4         |  1 +
 include/sys/frame.h      |  4 ++++
 3 files changed, 30 insertions(+)

diff --git a/config/kernel-objtool.m4 b/config/kernel-objtool.m4
index c560c41954..f9f9d657d8 100644
--- a/config/kernel-objtool.m4
+++ b/config/kernel-objtool.m4
@@ -1,3 +1,24 @@
+dnl #
+dnl # Detect objtool functionality.
+dnl #
+
+dnl #
+dnl # Kernel 5.10: linux/frame.h was renamed linux/objtool.h
+dnl #
+AC_DEFUN([ZFS_AC_KERNEL_OBJTOOL_HEADER], [
+	AC_MSG_CHECKING([whether objtool header is available])
+	ZFS_LINUX_TRY_COMPILE([
+		#include <linux/objtool.h>
+	],[
+	],[
+		AC_DEFINE(HAVE_KERNEL_OBJTOOL_HEADER, 1,
+		    [kernel has linux/objtool.h])
+		AC_MSG_RESULT(linux/objtool.h)
+	],[
+		AC_MSG_RESULT(linux/frame.h)
+	])
+])
+
 dnl #
 dnl # Check for objtool support.
 dnl #
@@ -16,7 +37,11 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_OBJTOOL], [
 
 	dnl # 4.6 API added STACK_FRAME_NON_STANDARD macro
 	ZFS_LINUX_TEST_SRC([stack_frame_non_standard], [
+		#ifdef HAVE_KERNEL_OBJTOOL_HEADER
+		#include <linux/objtool.h>
+		#else
 		#include <linux/frame.h>
+		#endif
 	],[
 		#if !defined(STACK_FRAME_NON_STANDARD)
 		#error "STACK_FRAME_NON_STANDARD is not defined."
diff --git a/config/kernel.m4 b/config/kernel.m4
index ec52f014a7..bbfbeb39b8 100644
--- a/config/kernel.m4
+++ b/config/kernel.m4
@@ -13,6 +13,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
 
 		dnl # Sequential ZFS_LINUX_TRY_COMPILE tests
 		ZFS_AC_KERNEL_FPU_HEADER
+		ZFS_AC_KERNEL_OBJTOOL_HEADER
 		ZFS_AC_KERNEL_WAIT_QUEUE_ENTRY_T
 		ZFS_AC_KERNEL_MISC_MINOR
 		ZFS_AC_KERNEL_DECLARE_EVENT_CLASS
diff --git a/include/sys/frame.h b/include/sys/frame.h
index b6bbaa79b2..caae851421 100644
--- a/include/sys/frame.h
+++ b/include/sys/frame.h
@@ -25,7 +25,11 @@ extern "C" {
 
 #if defined(__KERNEL__) && defined(HAVE_KERNEL_OBJTOOL) && \
     defined(HAVE_STACK_FRAME_NON_STANDARD)
+#if defined(HAVE_KERNEL_OBJTOOL_HEADER)
+#include <linux/objtool.h>
+#else
 #include <linux/frame.h>
+#endif
 #else
 #define	STACK_FRAME_NON_STANDARD(func)
 #endif