diff options
-rw-r--r-- | arch/mips/kernel/signal.c | 22 | ||||
-rw-r--r-- | arch/mips/kernel/signal32.c | 22 |
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 */ |