diff options
| author | David S. Miller <davem@davemloft.net> | 2017-12-10 06:09:55 +0300 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2017-12-10 06:09:55 +0300 |
| commit | 51e18a453f5f59a40c721d4aeab082b4e2e9fac6 (patch) | |
| tree | 540d37e6f7a83466677ab6095fcdd2d6f72583c4 /arch/s390/include/asm/switch_to.h | |
| parent | 5e54b3c1202765ae62de24a160f1eaf6b0ebf9d4 (diff) | |
| parent | f335195adf043168ee69d78ea72ac3e30f0c57ce (diff) | |
| download | linux-51e18a453f5f59a40c721d4aeab082b4e2e9fac6.tar.xz | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflict was two parallel additions of include files to sch_generic.c,
no biggie.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/s390/include/asm/switch_to.h')
| -rw-r--r-- | arch/s390/include/asm/switch_to.h | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/arch/s390/include/asm/switch_to.h b/arch/s390/include/asm/switch_to.h index ec7b476c1ac5..c61b2cc1a8a8 100644 --- a/arch/s390/include/asm/switch_to.h +++ b/arch/s390/include/asm/switch_to.h @@ -30,21 +30,20 @@ static inline void restore_access_regs(unsigned int *acrs) asm volatile("lam 0,15,%0" : : "Q" (*(acrstype *)acrs)); } -#define switch_to(prev,next,last) do { \ - if (prev->mm) { \ - save_fpu_regs(); \ - save_access_regs(&prev->thread.acrs[0]); \ - save_ri_cb(prev->thread.ri_cb); \ - save_gs_cb(prev->thread.gs_cb); \ - } \ +#define switch_to(prev, next, last) do { \ + /* save_fpu_regs() sets the CIF_FPU flag, which enforces \ + * a restore of the floating point / vector registers as \ + * soon as the next task returns to user space \ + */ \ + save_fpu_regs(); \ + save_access_regs(&prev->thread.acrs[0]); \ + save_ri_cb(prev->thread.ri_cb); \ + save_gs_cb(prev->thread.gs_cb); \ update_cr_regs(next); \ - if (next->mm) { \ - set_cpu_flag(CIF_FPU); \ - restore_access_regs(&next->thread.acrs[0]); \ - restore_ri_cb(next->thread.ri_cb, prev->thread.ri_cb); \ - restore_gs_cb(next->thread.gs_cb); \ - } \ - prev = __switch_to(prev,next); \ + restore_access_regs(&next->thread.acrs[0]); \ + restore_ri_cb(next->thread.ri_cb, prev->thread.ri_cb); \ + restore_gs_cb(next->thread.gs_cb); \ + prev = __switch_to(prev, next); \ } while (0) #endif /* __ASM_SWITCH_TO_H */ |
