From 6778948f9de86c3cfaf36725a7c87dcff9ba247f Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Mon, 11 Dec 2023 08:20:59 +0000
Subject: [PATCH] kernel_5.10 no rt

---
 kernel/arch/arm64/kernel/fpsimd.c |   37 ++++++++++++++++---------------------
 1 files changed, 16 insertions(+), 21 deletions(-)

diff --git a/kernel/arch/arm64/kernel/fpsimd.c b/kernel/arch/arm64/kernel/fpsimd.c
index c347a88..5335a6b 100644
--- a/kernel/arch/arm64/kernel/fpsimd.c
+++ b/kernel/arch/arm64/kernel/fpsimd.c
@@ -180,10 +180,7 @@
  */
 static void get_cpu_fpsimd_context(void)
 {
-	if (!IS_ENABLED(CONFIG_PREEMPT_RT))
-		local_bh_disable();
-	else
-		preempt_disable();
+	local_bh_disable();
 	__get_cpu_fpsimd_context();
 }
 
@@ -204,10 +201,7 @@
 static void put_cpu_fpsimd_context(void)
 {
 	__put_cpu_fpsimd_context();
-	if (!IS_ENABLED(CONFIG_PREEMPT_RT))
-		local_bh_enable();
-	else
-		preempt_enable();
+	local_bh_enable();
 }
 
 static bool have_cpu_fpsimd_context(void)
@@ -215,14 +209,21 @@
 	return !preemptible() && __this_cpu_read(fpsimd_context_busy);
 }
 
-static void *sve_free_atomic(struct task_struct *task)
+/*
+ * Call __sve_free() directly only if you know task can't be scheduled
+ * or preempted.
+ */
+static void __sve_free(struct task_struct *task)
 {
-	void *sve_state = task->thread.sve_state;
+	kfree(task->thread.sve_state);
+	task->thread.sve_state = NULL;
+}
 
+static void sve_free(struct task_struct *task)
+{
 	WARN_ON(test_tsk_thread_flag(task, TIF_SVE));
 
-	task->thread.sve_state = NULL;
-	return sve_state;
+	__sve_free(task);
 }
 
 /*
@@ -583,7 +584,6 @@
 int sve_set_vector_length(struct task_struct *task,
 			  unsigned long vl, unsigned long flags)
 {
-	void *mem = NULL;
 	if (flags & ~(unsigned long)(PR_SVE_VL_INHERIT |
 				     PR_SVE_SET_VL_ONEXEC))
 		return -EINVAL;
@@ -637,10 +637,9 @@
 	 * Force reallocation of task SVE state to the correct size
 	 * on next use:
 	 */
-	mem = sve_free_atomic(task);
+	sve_free(task);
 
 	task->thread.sve_vl = vl;
-	kfree(mem);
 
 out:
 	update_tsk_thread_flag(task, TIF_SVE_VL_INHERIT,
@@ -918,9 +917,7 @@
  */
 void fpsimd_release_task(struct task_struct *dead_task)
 {
-	void *mem = NULL;
-	mem = sve_free_atomic(dead_task);
-	kfree(mem);
+	__sve_free(dead_task);
 }
 
 #endif /* CONFIG_ARM64_SVE */
@@ -1025,7 +1022,6 @@
 void fpsimd_flush_thread(void)
 {
 	int vl, supported_vl;
-	void *mem = NULL;
 
 	if (!system_supports_fpsimd())
 		return;
@@ -1038,7 +1034,7 @@
 
 	if (system_supports_sve()) {
 		clear_thread_flag(TIF_SVE);
-		mem = sve_free_atomic(current);
+		sve_free(current);
 
 		/*
 		 * Reset the task vector length as required.
@@ -1072,7 +1068,6 @@
 	}
 
 	put_cpu_fpsimd_context();
-	kfree(mem);
 }
 
 /*

--
Gitblit v1.6.2