Print this page
Fix for 13717 may break 8-disk raidz2

*** 1379,1392 **** * We might have already saved once (due to a prior use of the kernel * FPU or another code path) so FPU_VALID could be set. This is handled * by fp_save, as is the FPU_EN check. */ if (pl != NULL) { kpreempt_disable(); ! if ((flags & KFPU_USE_LWP) == 0) ! fp_save(&pl->lwp_pcb.pcb_fpu); ! pl->lwp_pcb.pcb_fpu.fpu_flags |= FPU_KERNEL; kpreempt_enable(); } /* * Set the context operations for kernel FPU usage. Note that this --- 1379,1409 ---- * We might have already saved once (due to a prior use of the kernel * FPU or another code path) so FPU_VALID could be set. This is handled * by fp_save, as is the FPU_EN check. */ if (pl != NULL) { + fpu_ctx_t *pf = &pl->lwp_pcb.pcb_fpu; + kpreempt_disable(); ! if ((flags & KFPU_USE_LWP) == 0) { ! fp_save(pf); ! } else { ! /* ! * For pure kernel threads with an LWP, we can use the ! * LWP's pcb_fpu to save/restore context. ! */ ! VERIFY(curthread->t_procp->p_flag & SSYS); ! VERIFY(kfpu == NULL); ! ASSERT((pf->fpu_flags & FPU_EN) == 0); ! ! /* Always restore the fpu to the initial state. */ ! if (fp_save_mech == FP_XSAVE) ! pf->fpu_xsave_mask = XFEATURE_FP_ALL; ! fpinit(); ! pf->fpu_flags = FPU_EN; ! } ! pf->fpu_flags |= FPU_KERNEL; kpreempt_enable(); } /* * Set the context operations for kernel FPU usage. Note that this
*** 1398,1424 **** installctx(curthread, kfpu, kernel_fpu_ctx_save, kernel_fpu_ctx_restore, NULL, NULL, NULL, NULL); curthread->t_flag |= T_KFPU; ! if ((flags & KFPU_USE_LWP) == KFPU_USE_LWP) { ! /* ! * For pure kernel threads with an LWP, we can use the LWP's ! * pcb_fpu to save/restore context. ! */ ! fpu_ctx_t *pf = &pl->lwp_pcb.pcb_fpu; ! ! VERIFY(curthread->t_procp->p_flag & SSYS); ! VERIFY(kfpu == NULL); ! ASSERT((pf->fpu_flags & FPU_EN) == 0); ! ! /* Always restore the fpu to the initial state. */ ! if (fp_save_mech == FP_XSAVE) ! pf->fpu_xsave_mask = XFEATURE_FP_ALL; ! fpinit(); ! pf->fpu_flags = FPU_EN | FPU_KERNEL; ! } else { /* initialize the kfpu state */ kernel_fpu_ctx_restore(kfpu); } } --- 1415,1425 ---- installctx(curthread, kfpu, kernel_fpu_ctx_save, kernel_fpu_ctx_restore, NULL, NULL, NULL, NULL); curthread->t_flag |= T_KFPU; ! if ((flags & KFPU_USE_LWP) == 0) { /* initialize the kfpu state */ kernel_fpu_ctx_restore(kfpu); } }