hc
2024-11-01 2f529f9b558ca1c1bd74be7437a84e4711743404
kernel/arch/x86/include/asm/fpu/internal.h
....@@ -15,6 +15,7 @@
1515 #include <linux/sched.h>
1616 #include <linux/slab.h>
1717 #include <linux/mm.h>
18
+#include <linux/dovetail.h>
1819
1920 #include <asm/user.h>
2021 #include <asm/fpu/api.h>
....@@ -509,6 +510,32 @@
509510 clear_thread_flag(TIF_NEED_FPU_LOAD);
510511 }
511512
513
+#ifdef CONFIG_DOVETAIL
514
+
515
+static inline void oob_fpu_set_preempt(struct fpu *fpu)
516
+{
517
+ fpu->preempted = 1;
518
+}
519
+
520
+static inline void oob_fpu_clear_preempt(struct fpu *fpu)
521
+{
522
+ fpu->preempted = 0;
523
+}
524
+
525
+static inline bool oob_fpu_preempted(struct fpu *old_fpu)
526
+{
527
+ return old_fpu->preempted;
528
+}
529
+
530
+#else
531
+
532
+static inline bool oob_fpu_preempted(struct fpu *old_fpu)
533
+{
534
+ return false;
535
+}
536
+
537
+#endif /* !CONFIG_DOVETAIL */
538
+
512539 /*
513540 * FPU state switching for scheduling.
514541 *
....@@ -535,7 +562,9 @@
535562 {
536563 struct fpu *old_fpu = &prev->thread.fpu;
537564
538
- if (static_cpu_has(X86_FEATURE_FPU) && !(prev->flags & PF_KTHREAD)) {
565
+ if (static_cpu_has(X86_FEATURE_FPU) &&
566
+ !(prev->flags & PF_KTHREAD) &&
567
+ !oob_fpu_preempted(old_fpu)) {
539568 if (!copy_fpregs_to_fpstate(old_fpu))
540569 old_fpu->last_cpu = -1;
541570 else