aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/mips/kernel/signal.c22
-rw-r--r--arch/mips/kernel/signal32.c22
2 files changed, 28 insertions, 16 deletions
diff --git a/arch/mips/kernel/signal.c b/arch/mips/kernel/signal.c
index b7e4614d41b5..e0178e117f68 100644
--- a/arch/mips/kernel/signal.c
+++ b/arch/mips/kernel/signal.c
@@ -102,10 +102,13 @@ static int protected_save_fp_context(struct sigcontext __user *sc)
102 int err; 102 int err;
103 while (1) { 103 while (1) {
104 lock_fpu_owner(); 104 lock_fpu_owner();
105 err = own_fpu_inatomic(1); 105 if (is_fpu_owner()) {
106 if (!err) 106 err = save_fp_context(sc);
107 err = save_fp_context(sc); /* this might fail */ 107 unlock_fpu_owner();
108 unlock_fpu_owner(); 108 } else {
109 unlock_fpu_owner();
110 err = copy_fp_to_sigcontext(sc);
111 }
109 if (likely(!err)) 112 if (likely(!err))
110 break; 113 break;
111 /* touch the sigcontext and try again */ 114 /* touch the sigcontext and try again */
@@ -123,10 +126,13 @@ static int protected_restore_fp_context(struct sigcontext __user *sc)
123 int err, tmp __maybe_unused; 126 int err, tmp __maybe_unused;
124 while (1) { 127 while (1) {
125 lock_fpu_owner(); 128 lock_fpu_owner();
126 err = own_fpu_inatomic(0); 129 if (is_fpu_owner()) {
127 if (!err) 130 err = restore_fp_context(sc);
128 err = restore_fp_context(sc); /* this might fail */ 131 unlock_fpu_owner();
129 unlock_fpu_owner(); 132 } else {
133 unlock_fpu_owner();
134 err = copy_fp_from_sigcontext(sc);
135 }
130 if (likely(!err)) 136 if (likely(!err))
131 break; 137 break;
132 /* touch the sigcontext and try again */ 138 /* touch the sigcontext and try again */
diff --git a/arch/mips/kernel/signal32.c b/arch/mips/kernel/signal32.c
index dc09206d8c7b..aec58211faaa 100644
--- a/arch/mips/kernel/signal32.c
+++ b/arch/mips/kernel/signal32.c
@@ -118,10 +118,13 @@ static int protected_save_fp_context32(struct sigcontext32 __user *sc)
118 int err; 118 int err;
119 while (1) { 119 while (1) {
120 lock_fpu_owner(); 120 lock_fpu_owner();
121 err = own_fpu_inatomic(1); 121 if (is_fpu_owner()) {
122 if (!err) 122 err = save_fp_context32(sc);
123 err = save_fp_context32(sc); /* this might fail */ 123 unlock_fpu_owner();
124 unlock_fpu_owner(); 124 } else {
125 unlock_fpu_owner();
126 err = copy_fp_to_sigcontext32(sc);
127 }
125 if (likely(!err)) 128 if (likely(!err))
126 break; 129 break;
127 /* touch the sigcontext and try again */ 130 /* touch the sigcontext and try again */
@@ -139,10 +142,13 @@ static int protected_restore_fp_context32(struct sigcontext32 __user *sc)
139 int err, tmp __maybe_unused; 142 int err, tmp __maybe_unused;
140 while (1) { 143 while (1) {
141 lock_fpu_owner(); 144 lock_fpu_owner();
142 err = own_fpu_inatomic(0); 145 if (is_fpu_owner()) {
143 if (!err) 146 err = restore_fp_context32(sc);
144 err = restore_fp_context32(sc); /* this might fail */ 147 unlock_fpu_owner();
145 unlock_fpu_owner(); 148 } else {
149 unlock_fpu_owner();
150 err = copy_fp_from_sigcontext32(sc);
151 }
146 if (likely(!err)) 152 if (likely(!err))
147 break; 153 break;
148 /* touch the sigcontext and try again */ 154 /* touch the sigcontext and try again */