diff mbox series

[3/8] UBUNTU: SAUCE: ubuntu/sgx: fix a synchronization issue for mmput

Message ID 20210812120913.9316-4-tim.gardner@canonical.com
State New
Headers show
Series Sync to SGX 1.33.2 | expand

Commit Message

Tim Gardner Aug. 12, 2021, 12:09 p.m. UTC
BugLink: https://bugs.launchpad.net/bugs/1936240

https://github.com/intel/SGXDataCenterAttestationPrimitives
0977851177d96aa7859adcafef36f1b3ed5c7ab0 Linux Driver: fix a synchronization issue for mmput

Signed-off-by: Tim Gardner <tim.gardner@canonical.com>
---
 ubuntu/sgx/main.c    | 13 +++++++++++++
 ubuntu/sgx/reclaim.c | 16 +++++++++-------
 2 files changed, 22 insertions(+), 7 deletions(-)
diff mbox series

Patch

diff --git a/ubuntu/sgx/main.c b/ubuntu/sgx/main.c
index 82c7b77e91806..8d28da9e8331c 100644
--- a/ubuntu/sgx/main.c
+++ b/ubuntu/sgx/main.c
@@ -12,6 +12,7 @@ 
 #include "encls.h"
 
 #include <linux/module.h>
+#include <linux/version.h>
 #include "version.h"
 #include "dcap.h"
 #ifndef MSR_IA32_FEAT_CTL
@@ -21,6 +22,9 @@ 
 #ifndef FEAT_CTL_LOCKED
 #define FEAT_CTL_LOCKED FEATURE_CONTROL_LOCKED
 #endif
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0) )
+void (*k_mmput_async)(struct mm_struct* mm);
+#endif
 
 struct sgx_epc_section sgx_epc_sections[SGX_MAX_EPC_SECTIONS];
 int sgx_nr_epc_sections;
@@ -300,6 +304,15 @@  static int __init sgx_init(void)
 	if (!sgx_page_cache_init())
 		return -EFAULT;
 
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0) )
+	k_mmput_async = (void*)kallsyms_lookup_name("mmput_async");
+	if (!k_mmput_async){
+		pr_err("intel_sgx: mmput_async support missing from kernel.\n");
+		return -EFAULT;
+	}
+#endif
+
+
 	if (!sgx_page_reclaimer_init())
 		goto err_page_cache;
 
diff --git a/ubuntu/sgx/reclaim.c b/ubuntu/sgx/reclaim.c
index 1ba0cec6dba4b..747cfbe4ec6a3 100644
--- a/ubuntu/sgx/reclaim.c
+++ b/ubuntu/sgx/reclaim.c
@@ -14,7 +14,9 @@ 
 #include "driver.h"
 
 #include <linux/version.h>
-
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0) )
+extern void (*k_mmput_async)(struct mm_struct* mm);
+#endif
 struct task_struct *ksgxswapd_tsk;
 DECLARE_WAIT_QUEUE_HEAD(ksgxswapd_waitq);
 LIST_HEAD(sgx_active_page_list);
@@ -175,8 +177,8 @@  static bool sgx_reclaimer_age(struct sgx_epc_page *epc_page)
 		ret = !sgx_encl_test_and_clear_young(encl_mm->mm, page);
 		up_read(&encl_mm->mm->mmap_sem);
 
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0) || LINUX_VERSION_CODE > KERNEL_VERSION(5, 4, 0) )
-		mmput(encl_mm->mm);
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0))
+		k_mmput_async(encl_mm->mm);
 #else
 		mmput_async(encl_mm->mm);
 #endif
@@ -226,8 +228,8 @@  static void sgx_reclaimer_block(struct sgx_epc_page *epc_page)
 
 		up_read(&encl_mm->mm->mmap_sem);
 
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0) || LINUX_VERSION_CODE > KERNEL_VERSION(5, 4, 0) )
-		mmput(encl_mm->mm);
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0))
+		k_mmput_async(encl_mm->mm);
 #else
 		mmput_async(encl_mm->mm);
 #endif
@@ -306,8 +308,8 @@  static const cpumask_t *sgx_encl_ewb_cpumask(struct sgx_encl *encl)
 
 		cpumask_or(cpumask, cpumask, mm_cpumask(encl_mm->mm));
 
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0) || LINUX_VERSION_CODE > KERNEL_VERSION(5, 4, 0) )
-		mmput(encl_mm->mm);
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0))
+		k_mmput_async(encl_mm->mm);
 #else
 		mmput_async(encl_mm->mm);
 #endif